<style></style>
Python学习day45-数据库(总结)数据库的概念用户基本操作MySQL支持的数据类型MySQL的约束条件多表关系单表与多表查询多表的连接方式子查询视图View事务
Python学习day45-数据库(总结)
今天正式结束数据库的学习,对于之前几天的内容进行一下总结,以及一些小的扩展.
数据库的概念
xxxxxxxxxx12 1
'''2
数据库:,3
之前我们了解过,数据库主要包括库(文件夹),表(表结构文件,表数据文件,也就是索引结构),字段(数据的描述),记录(记录的本体)4 5
关于数据库的分类:6
对其进行分类主要是效率有区别,分类的标准通常是7
1. 内存或者硬盘,也就是运行的区域8
2. 关系或者非关系,即数据库里面表之间的关系9
3. 存储方式,sql或者key-value的方式10
数据库的基本连接:11
即mysql -h地址 -P 端口 -u 用户名 -p密码12
'''
用户
xxxxxxxxxx5 1
'''2
用户的操作主要在于数据库对永无的创建以及赋予权限,比如:3
grant 权限们 on 数据库表.表名 to 用户名@主机名 identified by '密码';4
另外一些比较基本的操作可以查看前面day41的博客5
'''
基本操作
xxxxxxxxxx39 1
'''2
数据库的一些基本操作,包括对于数据库,表,字段和数据的.3
4
库:5
创建:create datebase 数据库名;6
删除:drop database 数据库名;7
查看所有数据库:show databases;8
查看指定数据库的详细信息:show create database 数据库名;9 10
表:11
增:create table 表名(12
(属性名1 类型(长度) 约束条件)13
...14
(属性名n 类型(长度) 约束条件)15
)engine=引擎(InnDB) DEFAULT charset=默认字符集;16
删:drop table 表名;17
改:18
alter table 旧表名 rename 新表名;19
alter table 表名 change 旧字段名 新字段名 新字段属性20
alter table 表名 modify 字段名 字段新属性 [字段位置]21
查:22
show tables;查看当前库所有表23
show create table 表名;查看具体表的详细信息24
desc 表名;查看表结构25 26
字段:27
增:28
insert [into][数据库名.]表名 values(值1,...,值n);29
alter table 表名 add 新字段 类型[(长度) 约束条件];# 默认末尾增加30
alter table 表名 add 新字段 类型[(长度) 约束条件] first;# 头部添加31
alter table 表名 add 新字段 类型[(长度) 约束条件] after 旧字段名;32
删:33
delete from [数据库名.]表名 where 条件34
alter table 表名 drop 字段名;35
改:36
update [数据库名.]表名 set 字段1=新值1,字段n=新值n where 字段=旧值;37
查:38
select * from [数据库名.]表名;39
'''
MySQL支持的数据类型
x1
'''2
1. 整型3
tinyint:1字节 -128~127 默认长度为44
smallint:2字节 -32768~32767 默认长度为65
mediumint:3字节 -8388608~8388 6076
int:4字节 -2147483648~2147483647 默认长度为117
bigint:8字节 -9233372036854775808~92233720368547758078
2. 浮点型9
float:4字节,3.4E–38~3.4E+38 *10
double:8字节,1.7E–308~1.7E+30811
decimal:M要比D的最大值基础上+212
限制存储宽度13
(M, D) => M为位数,D为小数位,即总位数至少要比小数位多两位14
3. 字符串15
char(4):以4个字符存储定长存储数据,效率高,16
varchar(4):数据长度决定字符长度,为可变长度存储数据17
char: 一定按规定的宽度存放数据, 以规定宽度读取数据, 通常更占空间18
varchar: 首先根据数据长度计算所需宽度, 并在数据开始以数据头方式将宽度信息保存起来, 是一个计算耗时过程, 取先读取宽度信息,以宽度信息为依准读取数据, 通常节省空间,但是存取效率和char有差距19
4. 时间类型20
year:yyyy(1901/2155)21
date:yyyy-MM-dd(1000-01-01/9999-12-31)22
time:HH:mm:ss23
datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)24
timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/203825
结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07)26
5. 枚举与集合27
ENUM中文意思就是枚举,他的值是通过创建表的时候事先定义好的几个选项中选择所得到的,需要注意的是ENUM只能单选不能多选,多选要用SET28
其实就是为某一个字段提供选项:29
枚举enum:只能单选,非安全模式不选的话会报警,安全模式不选会报错30
集合set:可以多选,可以不选,都不会报错31
注意,对set类型的字符串赋值的时候,需要用一个引号包裹住(注意,只能有一个引号,多余引号就会插入失败),并且在引号内部用逗号将选项隔开,且不能添加空格或者其他任何额外的字符32
insert into tc2 values('rocky1','female','male,female')33
'''
MySQL的约束条件
x9 10 1
'''2
常用的约束条件有以下几种:3
1. primary key:主键,每一条数据的唯一标识,如果我们没有对于数据的唯一性或者自增性进行设置,那么主键就会是系统默认分配的一个数据,是隐藏字段.主键所起到的主要作用就是优化查询速度.4
2. foreign key:外键,用于指定改行记录从属于主表中的一条记录,主要用于参照完整性.5
foreign key(所在表的外键字段) references 关联表(关联字段)6
注意:7
外键的字段名是自定义的,但为了索引方便通常将外键名字定义为 关联表_关联字段8
外键字段本身可以唯一或者不唯一,但是外键所关联的字段一定是唯一的,这点非常重要9
3. unique:唯一性,加上该约束条件的数据唯一,即同样的数据不能重复插入该表,unique还可以规定联合唯一,比如我们创建一个表用来存储登录用户的IP地址和端口号,这是两个字段,我们就需要把IP和端口绑定起来作为一个联合唯一的约束条件,语句为unique(ip,port)10
4. auto_increment:自增,顾名思义,每次插入数值,若没有给该字段赋值,该字段就会自动加+1,所以自增的字段通常为整型或浮点型.这里要注意的一点是,我们在删除有自增的数据的表的时候,要用truncate,,不能用delete,delete只能删除数据本身,不能删除其索引号以及各种内层的数据关系,但是truncate可以.11
5. not null:不为空,即加了该条件的值不能为空值,如如若为空值则会报错,通常用在一些不允许填空值的场合,比如注册时用户的用户名,以及出生人的性别.12
6. default:默认值,即若该行字段为多个字段,如果我们对默认值以外的字段赋值,并没有给有默认值的字段赋值,那么有默认值的字段就会自动被赋予默认值13
'''
多表关系
xxxxxxxxxx1 14 1
'''2
多表关系通常有三种,且通常建立在外键的基础上:3
1. 一对一:外键在任何一方定义都可以,此时外键要设置唯一键,即unique4
作者(author):id,name,gender,age,mobile,info,address5
作者详情(author_detail):id,info,address,author_id6
2. 一对多:外键必须放在多的那边,且外键值不唯一7
书(book):id,name,price,publish_id8
出版社(publish):id,name,address,phone9
3. 多对多:一定要创建第三张关系表,每一个外键不唯一,但是多个外键可以建立联合唯一10
作者(author):id,name,age11
出版社(publish):id,name,address12
关系表(author_publish):id,author_id,publish_id13
'''
单表与多表查询
x1
'''2
实际上我们日常的查询都是单表查询,因为即便是多表查询也是把多个单表连接成一个表,然后进行查询,所以还是单表查询.3 4
单表查询的语法如下:5
select [distinct]6
字段1,字段2...7
from 表名8
[where 条件]9
[group by]10
[having]11
[order by]12
[limit]13
'''14
中括号包裹的都为可选项,即可以有可以没有,关键字执行的优先级为:15
1. from:找到表16
2. where:拿着where指定的约束条件,去文件/表中取出一条条记录17
where后面的条件判断:18
比较符合:> | < | >= | <= | = | !=19
区间符号:between 开始 and 结束 | in(自定义容器)20
逻辑符号:and | or | not21
相思符号:like _|%22
正则符号:regexp 正则语法23
3. group by:将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组24
联合分组:按多个字段综合结果进行分组25
select group_concat(name),area,port from emp group by area,port;26
这里要注意,后面有group by 的查询语句,前面select后面必须有group by 后面的参数,而且select后面不能写一般的字段,只能写聚合函数,切记,切记,不然会报错.27
having 可以对 聚合结果 再进行筛选,但是where不可以28
常用聚合函数如下:29
max():最大值30
min():最小值31
avg():平均值32
sum():和33
count():记数34
group_concat():组内字段拼接,用来查看组内其他字段35
4. select:执行select36
5. distinct:去重,对参与查询的所有字段,整体去重(即所查询的所有字段的值都相同才会认为是重复数据)37
6. having:将分组的结果进行having过滤38
7. order by:将结果按条件排序:order by39
8. limit:限制结果的显示条数40
41
注意:42
以上这些关键字的执行顺序要严格执行,可以没有某个关键字,一旦需要用到,就要按照关键字的顺序来使用,乱序会直接导致报错
多表的连接方式
xxxxxxxxxx1 10 1
'''2
多表常用的连接方式有四种:3
1. 内连接4
关键字 :inner join on(内连接的inner关键字通常可以省略,所以直接使用join默认就是内连接)5
语法: from A表 inner join B表 on A表.关联字段=B表.关联字段6
2. 左连接7
关键字 :left join on8
语法: from 左表 left join 右表 on 左表.关联字段=B表.关联字段9
3. 右连接10
关键字 :right join on11
语法: from 左表 right join 右表 on 左表.关联字段=B表.关联字段12
4. 全连接13
关键字 : join on union(union可以将左连接和右连接合并起来,作为一个表)14
语法: 将左连接和右连接用union连接起来即可15
'''
子查询
当一次查询已经得不到我们想要的结果的时候,我们可以考虑用子查询,一步一步拿到自己想要查询的数据.
xxxxxxxxxx1 1
增:insert into 表 select (子查询)2
删:delete from 表 条件是(子查询)(子查询的表不能和delete的表相同)3
查:select 字段 from 表 条件是(子查询)4
改:update 表 set 字段=值 条件是(子查询)(子查询的表不能和update的表相同)
视图View
x1
'''2
视图的概念:3
1. 视图是存在内存中的临时表4
2. 视图的创建依赖select语句,所以就是select语句操作的结果形成的表5
3. 视图支持对数据的增删改查6
4. 视图不允许对视图表的字段做修改7
5. 视图本身支持创建,也支持更新与删除8
9
首先要保证视图是可更新视图,用了以下结构的视图均为不可更新视图:10
(1)聚合函数;11
(2)DISTINCT关键字12
(3)GROUP BY子句;13
(4)ORDER BY子句;14
(5)HAVING子句;15
(6)UNION运算符;16
(7)位于选择列表中的子查询;17
(8)FROM子句中包含多个表;18
(9)SELECT语句中引用了不可更新视图;19
(10)WHERE子句中的子查询,引用FROM子句中的表;20
(11)ALGORITHM 选项指定为TEMPTABLE21
'''
事务
xxxxxxxxxx1 14 1
# 事务:通常一些业务需要多条sql参与,参与的sql会形成一个执行整体,该整体我们就称之为事务2
# 简单来说:事务就是包含多条执行的sql语句3
# 比如:转账就是一个事务,从一个客户将资金转出,再将资金转入到另一个用户4
5
# 只在内存操作,不在硬盘操作,全部完成之后会有一个请求,才会真正写入到内存中6
7
'''8
事务的四大特性:9
1.原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功,即and的关系10
2.一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态),即总和是不变的11
3.隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离12
4.持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响13
'''