一、子查询
什么是子查询?
一个查询语句里面嵌套一个查询。外层的叫做符查询,内层里面嵌套的叫做子查询。
语法:
select ....... from 表名 where 字段 比较运算符 (子查询);
#其中,在查询过程中,先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。
注意:将子查询和比较运算符联合使用时,必须保证子查询返回的值只有一个,否则比较运算符必须用 IN。
使用 IN 关键字可以使父查询匹配子查询返回多个单字段值,也就是可以返回多个值。
示例:
#使用IN子查询
SELECT studentNo,studentName FROM student
WHERE studentNo IN (
SELECT studentNo FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject`
WHERE subjectName ='Logic Java'
)AND examDate =(
SELECT MAX(examDate) FROM result
WHERE subjectNo=(
SELECT subjectNo FROM `subject`
WHERE subjectName ='Logic Java'
)
)
);
二、分组查询
1.使用group by 分组查询:
示例:
#使用group by 子句实现查询
select subjectNo,avg(studentResult) as 课程平均成绩
from result
group by subjectNo;
多列分组查询:
#统计每个学期的男,女人数
select count(*) as 人数,gradeId AS 年级,sex as 性别
from student
group by grade ,sex
order by grade;
注意:在使用group by分组查询时,在select 后面的列的是限制的,一般允许如下:
- group by 子句后的列
- 聚合函数计算出的列
2.使用HAVING 子句进行分则查询
#使用having子句对分组后的数据进行筛选
select count(*) as 人数,gradeId AS 年级 from student
group by gradeId
having count(*) >3;
#注意:having 子句必须是写在分组后面的
使用子句查询的顺序:
where > group by > having > order by > limit ;
如下所示:
#分组查询
select 列 from 表 where 分组前条件
group by 分组列 having 分组后条件
order by 排序列
limit 分页;