mysql(事务,联合查询,连接查询,子查询,备份与恢复).doc
回顾
列属性:唯一键和注释
关系:一对一,一对多,多对多(中间表)
外键:外键约束,约束模式(严格模式(默认的),级联模式,置空模式)
范式:三范式,逆规范化
高级数据操作
增加:蠕虫复制,主键冲突(duplicatekey,replace)
修改:limit长度
删除:limit长度,truncate(先drop,后create)
查询:select[select选项]字段表达式[别名][from子句][where子句][groupby子句][having子句][orderby子句][limit子句]
高级查询操作
having子句
having本质上与where是一致,用来判断记录是否满足条件的。但是having比where要强大一点,能够做一些where做不到的事情。
where不能使用字段别名,但是having可以
having可以使用分组统计函数,where却不可以使用
分组统计函数是groupby的,在where之后。where是从磁盘操作数据,没有进行分组,不能统计。
orderby子句
排序子句,按照某个字段进行升序或者降序排序,排序一定会触发校对集进行校验。
语法:orderby字段[asc|desc],默认是asc
多字段排序:先对第一个字段进行排序,然后在排序好的基础上,按照第二个字段进行排序。(分组)
语法:orderby字段1[asc|desc],字段2[asc|desc]…
limit子句
限制查询数据或者操作(删和改)记录数
语法1:limit长度
语法2:limitoffset,length
从某个位置开始(默认的所有的记录查询得到之后,记录的下标是从0开始),获取指定长度的数据,语法1其实是offset默认是0
语法2的limit的使用:分页
分页的几个条件:
页码:用户提交的页码page
计算起始位置:(page–1)*length
每页显示的数据长度:length(如果当前数据量不够length长,只获取已有的数据)
分页的优点
提高效率:数据库查询效率,PHP解析效率,网络传输效率
提高体验:减少用户等待时间,界面友好型增强
虚拟表
在mysql中,因为select语句可以没有数据源直接工作,mysql为了保证SQL语句的结构的完整性,系统提供了一个虚拟表:dual,如果没有数据源的select语句,可以使用fromdual
布尔数据类型
mysql没有布尔数据类型,但是支持布尔操作以及布尔关键字。
联合查询
将多个表的数据(单表),进行纵向的连接(记录数增加,字段数不改变)。
语法
select字段列表1from表1
union[union选项]
select字段列表2from表2;
条件
字段列表1与字段列表2的数量必须一致,数据类型不限制(在网络传输的过程中,没有数据类型的说法)
表1和表2,可以是同一张,也可以是不同的表
union选项:all全部和distinct去重(默认的)
union去重
字段要求与数据类型不要求
union使用
分表保存数据,但是需要合并数据查询。
对同一张表中的不同的数据进行不同操作,然后进行合并
需求:4班以前的学生,年龄升序排序;4班以后的学生年龄降序排序。
select*fromts_studentwherec_id=4orderbys_ageasc;
select*fromts_studentwherec_id4orderbys_agedesc;
orderby使用
在union中,如果要使用orderby,那么必须将查询语句使用括号进行包含
在union中,若要使用orderby,那么orderby必须配合limit子句
需求:查出所有的学生信息,要求得到学生所在的班级名称,以及教室。
先找出所有的学生信息,包含了班级id,c_id
拿着c_id去班级表ts_class中找出对应的班级信息。
连接查询
将多张表的数据,从横向上进行连接(记录不增加,但是字段增加)
mysql中,连接查询分类:内连接,外连接,自然连接,交叉连接
所有的连接查询都使用关键字:join,连接查询是多表操作(至少2张表)
左表:join关键字左边的表,叫左表
右表:join关键字右边的表
交叉连接
交叉连接指的是一张表的一个记录与另外一张表的所有记录都进行连接,保存所有的连接结果。最终形成的结果是笛卡尔积。
语法:左表crossjoin右表
交叉连接得到的结果是笛卡尔积,所以没有意义,应该尽量避免。
内连接
内连接指的是一个数据在左表中存在,同时,连接条件指定在右表中也必须有对应的结果存在,这个时候匹配才算成功,才