数据库37天

数据库

总览

day1 介绍数据库\安装\基础的命令
day2 数据库的表操做
day3 数据库的数据操做,查询(单表\多表)
day4 查询和其余内容的拾遗
day5 索引原理和python操做mysql

软件就是让频繁的人作的事情,交给机器去作了 ------- Eva-jpython

day1

背景

数据库在开发的过程当中占据着什么样的位置?
    咱们把数据存储在文件里
        #写 write
        #读 read
        #改 读->写->删->改
        
    可以更加简单的 使用 存储在文件中的数据        
    查 一行数据 从userinfo 条件 id = 10 或者 id =1  找500000 得找500000行,文件的太费时,从前日后,

在整个项目中又有什么意义?
    数据库: 可以更加简单的 使用 存储在文件中的数据
    可以更好的解决并发问题
        第一个相对论:即便client  依赖数据库    又是server  提供用户
    数据的统一问题

数据

1,alex,alex3714 # 一行内容就是一条数据
2,python,19800,6 months # 一条数据mysql

数据库 DataBase DB

存储数据的地方,咱们把全部的数据都存储在一个固定的地方,那么这个地方就是数据库程序员

数据库管理系统 DBMS

负责管理数据仓库中存储的全部文件中的内容
可以更好(简单 高效 安全)的帮助咱们完成数据的增删改查redis

数据库服务器

​ 什么是服务器 : 本质就是一台计算机
​ 当一台计算机上安装了某个软件可以对外提供服务的时候,那么这台机器就成为服务器
​ 数据库服务器
​ 当这台机器上安装的服务是一个数据库的server端的时候,咱们就获得了一台数据库服务器sql

数据库管理员 DBA

​ 专门帮助咱们管理数据库 而且优化数据库的工做人员mongodb

mysql就是一个DBMS(可以管理硬盘上数据文件的一个软件)数据库

​ 经过一些固定的简单的指令 帮助咱们完成从文件中查找对应数据的软件
​ oracle 也是一个DBMS安全

查 name,id 从 userinfo 条件 age = 83
查 number 从 userinfo 条件 name='wusir'服务器

数据库管理系统的做用:
关系型数据库

​ id name age phone_num 知道一个id(任何一个) 能够找到age(其余) 知道age 找到id name并发

​ mysql  oracle sql server   sqlite (学会一个其余的差很少)

非关系型数据库

​ key -value

​ 经过一个找其余全部 而不能经过别的找别的(查找速度很是快)快递订单

​ redis(进程之间的通讯 数据库很是火的一个)  mongodb (以后作的 智能机器人的库)

mysql 开源的软件 - 小公司 各类互联网公司(二次开发以后的mysql)
oracle 付费的 - 金融行业 国企事业单位
sql server 在学校里教学使用的

若是关系很是关联用关系型。 若是不关联,均可以非关系型的

mysql 安装
先配置my.ini    里面的每行没有空格 设置安装目录
加环境变量
安装目录在\bin 文件里
cmd 管理员运行  安装目录\bin\mysqld install    
net start mysql 启动mysql         找不到dir文件,用360修复一下
mysql -uroot -p          
enter pw :        回车   以后进入mysql 就对了 
show variables like '%charac%';   value 都是utf8就对了
mysql卸载
D:\mysql\mysql-5.6.43-winx64\mysqld remove  移出服务
把mysql整个文件都删掉\环境变量也删掉 
重启电脑

环境变量

当咱们执行一个系统中的可执行文件的时候
例如 mysql.exe或者 mysqld.exe或者python.exe
若是咱们不配环境变量,
那么就须要进入mysql.exe所在的目录去执行
或者带着这个文件的绝对路径去执行
咱们常常要执行这些文件
因此把文件的路径添加到环境变量中
就可直接输入文件名来执行程序了

一些命令

mysqld install
    #mysqld.exe install  要安装mysql的server端     是一个程序而不是一个进程
    
net start mysql 启动server端   
                    ftp同样  只有server 运行不了   开启自启动  之后不须要启动了额
mysql -uroot -p 启动client端

重启server
net stop mysql
net start mysql

client端的启动
c://>mysql -uroot 表示没有密码的状况下用root用户登陆
c://>mysql -uroot -p 表示使用密码登陆
Enter password:输入密码,若是没有密码直接回车
mysql命令行
mysql > select user();    查看当前用户
set password = password('123');   给当前用户设置密码
show databases;    查看当前的全部数据库
能不能给一个用户一个root ?

root 用户在mysql 当中至关于管理员用户

其余的程序员想要使用数据库来存储项目数据,不能给他权限最高的管理员用户

好比 : 建立一个eva 帐户,Ta能够查看她的文件内容  
        建立一个liu帐户,他能够查看他的文件内容   不能看别的  也没管理权删别的
能够建立用户 而且给用户受权
能够建立用户  而且给用户受权
create user 'eva@192.168.16.%';   什么都作不了  没有权限
create user 'eva@192.168.16.%' identified by '123';  带密码登陆

既能够给一个已经  存在的用户受权 ,也能够给一个不存在的用户建立并受权
grant  权利 on '数据库名.表名'  to  '用户名@ip地址'  ;
grant  权利 on '数据库名.表名'  to  '用户名@ip地址' identified by '123' ;
    #权利:SELECT  INSERT UPDATE  DELETE  ALL      #对全部的项目增删改查 最高的权限了
建立一个数据库 s20_day1;
create database s20_day1 ;
连老师的数据库
建立一个stu 用户  密码是123 ip地址是192.168.16 网段的全部机器
能对这个数据s20_day1 作增删改查的全部操做:
grant all on 's20_day1.*' to 'stu@192.168.16.%' identified by '123';
192.168.16.13  
mysql- ustu -h192.168.16.13 -p 
123

# grant all on s20_day1.* to 'stu'@'192.168.16.%' identified by '123';
# 用户名 密码 ip地址
# mysql -u用户名 -hip地址 -p
# 密码
DDL DML DCL

通常用ddl dml。 dcl 是受权(上面的)

删除方面否则用删库语句,基本上就是delete了

一、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
二、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
三、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
ddl语言
文件夹(数据库)的增删改查
(4)
建立数据库:
      create database 数据库名;             指定编码utf8   ;  默认就是utf8 建立成功
使用数据库:
     use  库名;
查看全部的数据库:
    show databases;
查看数据库下有哪些表:
    show tables;
改: alter  database  .... 改编码格式
删除: drop database db1:
操做文件(重点)
(*)
建立表:
    create table 表名(字段名 数据类型(长度),字段名2 数据类型(长度),...)
查看表结构:
    desc 表名;
修改表的字段名
    alter table 表名 change name username char(12);   好比:字段名2name  改为username
删除表
    drop table t1;

问题: 如何增长字段名?

dml 语言
数据的增删改查
(*)
增长
    insert into 表名 values (值1,值2,...); 插入一条数据
    insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...); 插入多条数据
    查看数据
    select * from 表名;
    修改数据
    update 表 set 字段名=值 where 条件;
    删除数据
    delete from 表 where 条件;
    
insert into t1 values(1,'alex','ab');
insert into t1 values(1,'alex','ab');
            能够是(1,1,1) 为何?char 能够给1 不是‘1’也可  id不是主键,可重复如别的东西
            
insert into t1 values(2,'wusir','t123'),(3,'taibai','333');

update t1 set password ='222'   把全部的ab t12 333 都改为了222
update t1 set password = '222' where id =3 ;   改一个
                        判断条件用and相连
select * from t1;
delete from t1 where id = 1;

没外键全部的均可以重复

问题:如何更改表名?
操做文件和操做数据:
文件:操做 table 表名;除了desc(查看外)都是table + 表名
数据:操做 动词(into from set * from)表名;
drop 和 delete 的区别
drop table 表名 :  ERROR 1146 (42S02): Table 'day53.xuexi1' doesn't exist
delete from 表名: Empty set (0.00 sec)
*auto_increment 表示:自增
*primary key 表示:约束(不能重复且不能为空);加速查找
四天后来回顾
为何要有数据库? 
    以前是存在文件里,可是文件里的值。好比,存储在字典里的,
    字典提取值,须要从前日后,若是是一个后面的值,取值时间长
    列表类那样,从头至尾。
数据库则不是这样
    b树和b+树
        b树,取值慢些,一层层,B+树,三次便可取值,由于快
什么是数据库
    关系型数据库
        mysql sqlserver oracle sql 
        一对多 多对多  
        适合关系型紧密的
    非关系型数据库
        只能一对多  主键  
        redis(不但能够数据库还能够数据传输(socket))  mong(数据库)智能机器人
数据库的下载和安装
    my.ini    改路径
    路径ini 里的 mysqld install
    start net mysql     开启服务端mysql 一次开启,一直适用
    mysql -uroot -p 123     开启客户端mysql  
    
给别的机子权限的指令。
    create day35 @stu 192.168.22.1  
命令行
    show databases;
    use 库名;
    show tables;
    use 表名;
    查看
    select * from 表名;
    增
    insert into(不会)
    改
    删
    drop 表名;
数据库
    ddl
        建库
    dml
    d

day38表操做

1. mysql 的存储引擎(innodb,myisam)

id name phone addr ident gender
1
2
3
4
500万行数据    全部年龄大于20的人名
3个文件存:
id name phone addr ident gender  表结构存在一个文件
1 2 3 4  文件   存在另外一个文件里
查找的时候会用到的一些目录里存在另外一个文件里   (好比年龄)

2 个文件存:  把数据按照目录去存
把1-20放到一块,20-40放一块,  
硬盘   把全部年龄84 的存在一个块 分块目录结构存的  不是一行行存的

全部的数据不存在硬盘而  存在内存 上
常常被打开 丢了也不要紧  热数据:1 张表 2000w条新闻

oracle 只有一个存储引擎目录结构两个文件存

1.1 总结

第一种方式 myisam 是5.5以前的默认搜索引擎(由于以前读的多)
                        (由于表级锁,因此限制了其余用户对行的操做)
    数据存在硬盘上,村三个文件,表结构,数据,和搜索目录
    既不支持事务、也不支持外键、不支持行级锁
    只支持表锁
    对于只读操做比较多地状况 查询速度相对较快
第二种方式  Innodb 是5.6以后的默认搜索引擎(之后用的多)
                (由于之后互联网用户多,对库改的并发操做多)
    数据存在硬盘上,存两个文件,表结构,( 数据,搜索目录)
    支持事务
    支持行级锁
    支持外键
    (支持了这么多,必然加了许多锁,速度就慢了)
第三种方式 Memory 
    数据存在内存上,存一个文件,表结构(在硬盘上)(快断电消失)
    数据容易丢失,但读写速度相对都快(数据字数有限制)

2 几个须要讲解的关键词

2. 1 事务transaction
景 200         实现董给景  转200块    
董 2000000  
赵 3000000

(必须原子性  ,一个动做,保护数据)
开启事务
先查董的余额,减两百,更新到数据库 
    数据库挂了
再查个人余额,+200 更新到数据库
    没加钱
关闭事务
2.21 innodb

是存储为两个文件的

​ 表结构

​ 数据和搜索目录

外键约束

行和表级锁
5.6 版本以上都是,支持事务,提交回滚,崩溃恢复(都不生效),
行级锁  :修改这一行,在这行加锁,不让读 脏数据  
表级锁  :修改许多行,在这个表加锁 (多行,行锁加锁去锁浪费时间)
2.22 myisam

5.5以及下

2.3 实际显示
show engines ; 全部的存储引擎
show engines \G;  详细的显示每一行:
show variables like ""   // 查看sql的东西

show variables like "default_storage_engine"; 查看mysql的存储引擎 ```

若是是5.5 如下的能够改这个,成innodb 文件了
#my.ini文件
[mysqld]
default-storage-engine=INNODB

create table t1 value(1,'1')

innodb 
表数据frm
表结构ibd

show create table use2;  能够看表的存储引擎

create table use3 (id int) engine = myisam;
myisam 
frm 村结构
myd   myisam data
myi     myisam index 

memory  建立了  stop start 就消失了
2.4 mysql的工做流程
  1. 检测是否合法 root仍是别的用户

  2. 分析优化
  3. 而后存储找数据
  4. 去硬盘上找

2. mysql 支持的数据类型

有限选这些  解决不了问题再去选别的
数值类型
    int 
    float 
字符串类型
    char
    varchar
时间类型
    datetime
set 和 enum类型
    enum
    set
2.1 int
tinyint 1 字节   正数 0-255   负数  -128 ~127 
    无符号的 int unsigned ;  0-255  (年龄)
    smallint  mediumint 
    int 10位  手机号码不行  
    bigint  大于10位
2.2 float
精确度  
都小数后能表示到30位  可是精确度通常
float(255,30)       w- 工资有多少小数 价格够了  float(5,2)  小数2位  5 位精准度
double    位数有限比float精准 数学也不行                9位精准度
小数精确到30位  默认是整数
decimal (65,30)
2.21 i系列
i1 
create table i1(id1 int ,id2 tinyint, id3 int unsigned)
insert into t1 values(1,1,1)
insert into t1 values(-1,-1,-1)  不能放  最多到0 warning 显示为0
insert into t1 values(128,128,128)   超过127,tinyint ,得127  
insert into t1 values(2的十位+1,2的十位+1,2的十位+1)   int标识减一
create table i1(id1 int(11) ,id2 int(2), id3 int unsigned)  超过了10位设置11很差用 
            即便写了int ,也能够写进去11111,约束对int无效
2.22 浮点数系列f系列
create table f1(f float(5,2),d double(5,2),d3 decimal(5,2))
insert into f1 values(4.2, 4.2 , 4.3)  保留4.30   都写4.32533 四舍五入 4.33   
create table f1(f float,d double,d3 decimal)
均可以看到表结构。区别:
show create table f2 ;  存储引-擎 能够看到相关的约束  更多
desc f2 ;    能够看到数据类型 约束  请求
2.3 date
date    0-9999年12-31  YYYY-MM-DD  年月日 (入职)
time    HH:MM:SS 时分秒
year   YYYY   年份  红酒
datetime    年月日时分  0-9。。。。范围多
timestamp   1970 -2038 年 时间过短,企业不但愿这么短
create table time1 (y year , d date , t time);
三种均可以
insert into time1 values(now(),now(),now());
insert into time1 values(2010,20200320,111233) ;
insert into time1 values('2019-01-01 12:12:12') ;

create table time2 (dt datetime, ts timestamp);
insert into time2 values (now(),now());
insert into time2 valuse(1969010111212,1969010111212)
insert into time2 valuse(2040010111212,1969010111212)  后面的不行
 dt 能表示时间范围大,能够为空 ,没有默认值 
ts 能表示时间范围小,不能为空, 默认当前时间

create table time2 (dt datetime default current_timestamp, ts timestamp);
    人为设置datetime类型的默认值是当前时间

2.4 字符串

char 能表示的长度小  浪费节省存储空间 ,读写效率快
    定长字符串
        char(5)  'abc'  'abc  '  'abcde'
varchar 能表示的长度大   65535
    变长字符串
        varchar(5) 'ab'  --> 'ab2'(前面共两个字符的事)  ‘abc’  'abc3'  'abcde'--'abcde5'
        节省内存 查找速度和写入的速度慢  (写和读都须要算)

身份证号:char(18)
手机号码:char(11)
用户名:char(12)  频繁的读取的列,而且长度的 变化不大   
评论: varchar(255)     255个字

longblob    2的十位数方个
create table s1(c char(10) , v varchar(10));
create table s1(c char(255) , v varchar(255));    
insert into s2    显示的时候回去掉全部空格,来对用户形成欺骗。实际上存空格了
enum 和 set
枚举,单选 且自动剔除不存在的选项
    enum('male' , 'female')
集合,多选,自动剔除不存在的选项,自动去重
    set('洗脚','洗头','抽烟','喝酒')
create table es(name char(10) , sex enum('male','female') , hobby set('洗脚','洗头','抽烟','喝酒'))
查看表结构
desc 表名; 
    == describe 表名 ;

3. 完整性约束

设置整型无符号 int unsigned 
设置默认值 default 
是否能够为空 not null 
是否惟一  unique 
自增  auto_increment 
主键 primary key 
外键 foreign key
表结构 : id , name , phone ,sexx 
create table stu1 (
        id int,
        name char(12) not null,
        phone char(11),
        sex enum('male','female')
        );

not null 不生效
多是mysql 的配置有了问题

​ 就是你找到了一我的,人的名字会不会为空或者身份证

4. 表的建立\删除\修改\查找表结构

​ create table staff_info(id int,

​ name char(12) ,

​ age int,

​ sex char(6),

phone char(11),

​ job char(20)

​ ); #字符

5.表与表之间的关系

相关文章
相关标签/搜索