回顾
列属性:注释和唯一键
关系:一对一,多对一,多对多
范式:规范数据表设计的方式
外键:外键约束(严格,置空,级联)
高级数据操作:增删改查
查询操作
完整语法
select select选项 表达式 from子句 where子句 group by子句 having子句 order by子句 limit子句
group by分组
分组语法
group by就是根据某个条件对数据进行分组。
语法:group by 字段
分组之后,会对数据进行取第一条。
分组主要是用来进行数据统计。
统计函数
(分组统计函数)
max:求最大值
min:最小值
avg:平均值
count:总记录数,如果使用count(*)那么是统计记录数,如果count(字段)其实也是统计记录数,如果改字段某个值为null,那么不统计。
sum:求和
count不统计为空的字段(以字段为统计单位)
分组统计原理
group_concat:将分组统计中的某个字段的所有数据进行连接操作
多字段分组
group by字段1,字段2….
分组排序
语法:group by 字段 [asc|desc]
回溯统计
注:能理解就去花时间
系统根据分组的情况,逐层向上回溯,最终直到顶层。
语法:在所有的分组字段之后使用 with rollup;
having子句
having子句与where子句一样,都是用于条件判断的。
区别1
where是判断数据从磁盘读入内存的时候
having是判断分组统计之前的所有条件
区别原理
区别2
having子句中可以使用字段别名,而where不能使用
区别3
having能够使用统计函数,但是where不能使用
order by子句
排序子句,对对应的字段进行排序。排序依赖校对集。
语法
order by 字段 [asc|desc];
多字段排序
order by 字段 [asc|desc],字段2 [asc|desc];
limit子句
limit的基本使用用于限制数据的访问量。
limit标准使用语法
limit offset,length;
从指定位置(offset)开始,获取对应长度(length)条记录
limit的应用:分页
分页必须知道的条件:页码,每页显示的数据长度
length:长度
offset:(页码 – 1) * length 开始位置
联合查询
联合查询:将多个查询的结果,进行纵向的联合,而不改变字段数,只改变记录数。
语法
select 语句
union union选项
select 语句
union选项:与select选项完全一致,union选项默认的是distinct(去重)
注意
1. union使用的时候,必须保证多条查询语句之间的字段数要求一致
2. union使用的时候,没有数据的类型的概念,只有列数相同的概念。
union意义
1. 合并不同表的数据(数据量太大,导致一张表存不下),往往是用于数据的统计
2. 对同一张表进行数据的不同形式的展示。
需求:将学生表中1班的学生按照年龄升序排序,2班的学生按照年龄降序排序
order by使用
(select 语句 order by子句)
union
(select 语句 order by 子句);
(select 语句 order by子句 limit子句)
union
(select 语句 order by 子句 limit子句);
需求:
1. 获取1班的所有学生
select * from student where c_id = 1;
2. 获取1班的所有学生,还要获取对应的班级信息
3. select * from student as s left join class c on s.c_id = c.id where c_id = 1;
连接查询
连接查询:将两个表中的数据,进行字段上的拼接,字段数一定会增加。
连接查询分为几类:内连接,外连接,交叉连接,自然连接
连接关键字:join
左表:join关键字左边的表是左表
右表:join关键字右边的表是右表
交叉连接
select * from 表1,表2;
交叉连接:cross join
交叉连接得到的结果是笛卡尔积,所以应该尽量避免笛卡尔积出现。
内连接
内连接:左表中出现的数据,在右表中也同样存在,那么记录保存,如果不存在就不需要该记录。
语法:
l_table [inner] join r_table on 连接条件
没有连接条件的内连接
内连接
内连接原理
内连接的条件匹配可以使用where,on可以用where代替
外连接
外连接:以某一张表为主表,拿着表中的所有记录去另外的一张表中匹配,如果匹配成功,保留全部记录,如果匹配失败,那么未匹配成功的字段全部置空。
语法:
左(外)连接:左表为主表,右表为副表,l_table left [out] join r_table on 连接条件
右(外)连接:右表为主表,左表为副表,l_table right [out] join r_table on 连接条件
左连接
右连接
左连接转右连接
需求:获取学生以及对应的班级信息,要求只获取1班的所有的学生
自然连接
自然连接:在连接表的时候,不需要指定连接条件,系统自动匹配。
自然连接包括:自然内连接,自然外连接
语法:
l_table natural [left/right] join r_table;
自然内连接
修改student表的name字段之后
自然连接在匹配之后,只会保留一个同名字段(保留的是左表)
自然外连接
内连接和外连接模拟自然连接:使用同名字段作为连接条件,并且合并同名字段。
语法:using(字段列表)
内连接模拟
外连接模拟
using模拟多字段自然连接
注意:实际项目开发中,需求上的满足通常是使用内连接和外连接,很少使用自然连接和交叉连接。
多表连接:与两张表完全一样
A join B on A.字段 = B.字段 join C on A.字段 = C.字段 …
需求:
1. 查出所有1班的学生;
select * from student where c_id =1;
2. 查出所有PHP141115班的学生
解决方案1:select * from student s left join class c on s.c_id = c.id where c.name = ‘PHP141115’;
解决方案2:
找出php141115对应的班级id:select id from class where name = ‘PHP141115’;
通过id找出所有该班级学生:select * from student where id = ?;