注意点:
①后面可以加where限定条件
②可以使用as别名
统计该列有几行数据, 其中null会被忽略
求该列所有数据的总和
求该列所有数据的平均值
求该列的最大值数据
求该列的最小值数据
select 要分组的字段,聚合函数(列名),... from 表名 (where 限定条件) group by 按什么字段分组
注意:
通常要搭配聚合函数使用
举例:
假如一个表里有三个角色(员工,CEO,BOSS), 每个角色的工资不是一个水平, 我们想查每个角色的平均工资就可以,查询"角色","avg(工资)",分组依据"角色"
. group by将查出来的数据分组, 然后聚合函数再对各组进行操作.
where是来筛序需要被分组的数据, 当数组分组完毕还需要筛选的话, 那就要使用having
举例:
select 角色,avg(工资) from 工资表 角色!=员工 group by 角色 having avg(工资)<20000;
这句话就是查询各个角色(除了普通员工)的平均工资, 然后把平均工资小于20000的去掉
实际开发中数据往往来自不同的表, 所以需要多表联合查询, 多表查询就是取两个表的笛卡尔积
假如有两个表
student(id, name, class_id)有数据:
1 张三 1
2 李四 2
classes(id,name)有数据:
1 火箭班
2 奥赛班
联合查询select * from student,classes;
结果是笛卡尔积
id,name,class_id,id,name
1 张三 1 1 火箭班 有效数据
1 张三 1 2 奥赛班 无效数据
2 李四 2 1 火箭班 无效数据
2 李四 2 2 奥赛班 有效数据
此时加上限定条件where student.class_id=classes.id
就能选择出有效数据
id,name,class_id,id,name
1 张三 1 1 火箭班 有效数据
2 李四 2 2 奥赛班 有效数据
select 字段 from 表1 (别名1) (inner) Join 表2 (别名2) on 连接条件 (and 其他条件)
-- Join on 这种方式是在连接时指定条件,从而使连接更明确。
select 字段 from 表1 (别名1) ,表2 (别名2) where 连接条件 (and 其他条件)
-- where 这种情况下,连接条件会在连接后的结果集上进行过滤。
select stu.id,stu.name,stu.sn,stu.email,sum(sco.score) as '总分' --精简查询结果
from student stu,score sco -- 做笛卡尔积
where student.id=score.student_id -- 确认连接关系
group by student.id --分组依据
外连接分为左外连接和右外连接
联合查询, 如果左侧的表完全显示就是左外连接, 右侧的表完全显示就是右外连接
左外连接和右外连接不会影响查询结果中列的展示顺序,它们只会影响连接后是否展示特定的行。
①左外连接: 表1完全显示, 如果右表没匹配到数据则会填充null
select 字段名 from 表1 left Join 表2 on 连接条件
②右外连接: 表2完全显示
select 字段名 from 表1 right Join 表2 on 连接条件
就是在同一张表连接自身进行查询
-- 查询语文成绩比数学成绩高的人(首先知道语文和数学的id)
select s1.*
from score s1
join score s2
on s1.student_id = s2.student_id
and s1.score < s2.score
and s1.course_id = 1
and s2.course_id = 3;
是指嵌入在其他sql语句中的select语句, 也叫嵌套查询
返回一行记录的子查询
示例: 查询小明的同班同学
-- 查询小明的同班同学
select *
from student
where classes_id = (select classes_id
from student
where name='小明');
-- 先查小明的班级id,再把结果传给外面的sql查询改班级学生
返回多行记录的子查询
只要字段属性匹配,用union可以查询不同的表
示例: 查询"语文"或"英语"课程的成绩信息
-- 使用in
select *
from score
where course_id in (select id
from course
where name='语文' or name='英语');
实际中为了合并多个select的查询结果, 可以使用集合操作符union, union all
该操作符用于取得两个结果集的并集, 会自动去掉重复行
示例: 查询id小于3,或者名字为’英语’的课程
select * from course where id<3
union
select * from course where name='英语';
-- 可以用or来实现
select * from course where id<3 or name='英语';
和union完全一样, 唯一区别就是不会去掉重复行