数据库37天
数据库
总览
day1 介绍数据库\安装\基础的命令
day2 数据库的表操作
day3 数据库的数据操作,查询(单表\多表)
day4 查询和其他内容的拾遗
day5 索引原理和python操作mysql
软件就是让频繁的人做的事情,交给机器去做了 ------- Eva-j
day1
背景
数据库在开发的过程中占据着什么样的位置?
我们把数据存储在文件里
#写 write
#读 read
#改 读->写->删->改
能够更加简单的 使用 存储在文件中的数据
查 一行数据 从userinfo 条件 id = 10 或者 id =1 找500000 得找500000行,文件的太费时,从前往后,
在整个项目中又有什么意义?
数据库: 能够更加简单的 使用 存储在文件中的数据
能够更好的解决并发问题
第一个相对论:即使client 依赖数据库 又是server 提供用户
数据的统一问题
数据
1,alex,alex3714 # 一行内容就是一条数据
2,python,19800,6 months # 一条数据
数据库 DataBase DB
存储数据的地方,我们把所有的数据都存储在一个固定的地方,那么这个地方就是数据库
数据库管理系统 DBMS
负责管理数据仓库中存储的所有文件中的内容
能够更好(简单 高效 安全)的帮助我们完成数据的增删改查
数据库服务器
什么是服务器 : 本质就是一台计算机
当一台计算机上安装了某个软件能够对外提供服务的时候,那么这台机器就成为服务器
数据库服务器
当这台机器上安装的服务是一个数据库的server端的时候,我们就得到了一台数据库服务器
数据库管理员 DBA
专门帮助我们管理数据库 并且优化数据库的工作人员
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了
1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
3、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;
![没外键所有的都可以重复](E:\Download\qq_download\teacher_huatu_download\s20py\db\day 37\没外键所有的都可以重复.png)
问题:如何更改表名?
操作文件和操作数据:
文件:操作 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 只有一个存储引擎![目录结构两个文件存](E:\Download\qq_download\teacher_huatu_download\s20py\db\day 37\目录结构两个文件存.png)
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的工作流程
-
检测是否合法 root还是别的用户
-
分析优化
-
然后存储找数据
-
去硬盘上找
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)
); #字符