选
ORDER BY COUNT(*) DESC -- 6 二次分组
LIMIT 1 -- 7 限定行数 肯定是你执行完之后最终的结果的 行数
-- 这7步顺序千万不能搞错
2、多表查询
2.1、相关子查询
子查询必须依赖于主查询 ,子查询单独运行会报错,依赖于主查询的结果
select嵌套 只能返回单行单列
每次主查询 执行一次,子查询也会执行一次,最终执行N+1次,效率低下,如果主查询没有提供数据,子查询无法执行
语法:select 列名1,列名2,(select 列名 from 表名 where 条件) from 表名
例:SELECT s_name,(SELECT c_name FROM t_class WHERE c_id=s_classid) FROM t_student
2.2 非相关子查询
from 嵌套 必须要给嵌套的子查询表起别名,可返回多行多列数据
子查询对主查询没有依赖 子查询只会执行一次,只会在from的时候才执行,性能较高,能独立运行,只是给主查询提供条件值
语法:select 列名1 ,列名2,.... from (select 列名 from 表名 [where 条件] ) [where 条件]
例:查询性别为女 并且姓名为张三的
SELECT * FROM (SELECT * FROM t_student WHERE s_sex='女') AS t1
WHERE t1.s_name='张三';
where 嵌套 执行2次,子查询可以单独运行,不依赖主查询,只是给主查询提供条件值
语法:select 列名1,列名2, .... from 表名 where 列名 关系运算符 (select 列明 from 表名 where 条件)
例:查询一班的学生有哪些
SELECT * FROM t_student WHERE s_classid=(SELECT c_id FROM t_class WHERE c_name='一班')
in 多条值
例:查询一班的学生有哪些
语法:select 列名1,列名2,.... from 表名 where 列名 in (select 列明 from 表名 where 条件)
SELECT * FROM t_student WHERE s_classid in (SELECT c_id FROM t_class WHERE c_name='一班')
any 和all 必须跟子查询 不能单独使用
all 任意值
语法:select 列名1,列名2, .... from 表名 where 列名 关系运算符 all (select 列明 from 表名 where 条件)
例:查询分数高于任意一个张三的所有学生 -- 使用all
SELECT * FROM t_student WHERE s_score>ALL(SELECT s_score FROM t_student WHERE s_name='张三')
any
语法:select 列名1,列名2, .... from 表名 where 列名 关系运算符 any (select 列明 from 表名 where 条件)
例:查询分数高于任意一个张三的所有学生
SELECT * FROM t_student WHERE s_score>ANY( SELECT s_score FROM t_student WHERE s_name='张三');
还可以使用MIN
SELECT * FROM t_student WHERE s_score>(SELECT MIN(s_score) FROM t_student WHERE s_name='张三');
子查询不管怎么变,都只有三种,在where中嵌套一个,form 一个,select一个