分组和子查询
分组
分组语法如下:
SQL
SELECT 列名,查询表达式
FROM <表名>
WHERE <条件>
GROUP BY <分组字段>
HAVING 分组后的过滤条件
ORDER BY 列名 [ASC,DESC]
LIMIT 偏移量,条数
单列分组
根据
性别
分组,并求出不同性别的年龄的平均值
SQL
SELECT gender, AVG(age) FROM teachers GROUP BY gender;
统计每种性别的最大年龄,并且年龄从大到小排列
SQL
SELECT gender, MAX(age) FROM teachers GROUP BY gender ORDER BY MAX(age) DESC;
多列分组
根据年龄和性别分组,并统计每组的人数
SQL
SELECT COUNT(*), age, gender FROM teachers GROUP BY age, gender;
根据年龄和性别分组,并统计每组的人数,并按照人数从多到少倒序排列
SQL
SELECT COUNT(*), age, gender FROM teachers GROUP BY age, gender ORDER BY COUNT(*) DESC;
分组筛选
语法如下
SQL
SELECT 列名,查询表达式
FROM <表名>
WHERE <条件>
GROUP BY {col_name|expr|position}
HAVING {col_name|expr|position}
ORDER BY {col_name|expr|position} [ASC|DESC]
LIMIT offset,row_count
WHERE
:用于过滤掉不符合条件的记录HAVING
:用于过滤分组后的记录GROUP BY
:用于对筛选后的结果进行分组
根据年龄和性别分组,并统计每组的人数,并筛选出人数大于等于2的
SQL
SELECT COUNT(*), age, gender FROM teachers GROUP BY age, gender HAVING COUNT(*) >= '2';
先筛选出
gender
为1的数据,然后根据年龄分组,最后筛出根据年龄分组后的总数大于2的数据
SQL
SELECT COUNT(*), age FROM teachers WHERE gender = '1' GROUP BY age HAVING COUNT(*) >= '2';
子查询
- 子查询就是指出现在其它SQL语句中的SELECT语句,必须始终出现在圆括号中
- 查询可以包含多个关键字或条件
- 子查询的外层查询可以是: SELECT、INSERT、UPDATE、SET等
- 子查询可以返回常量、一行数据、一列数据或其它子查询
子查询比较运算符
运算符 | 含义 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
<> | 不等于 |
!= | 不等于 |
<=> | 安全不等于 |
查询年龄大于平均年龄的数据
SQL
SELECT * FROM teachers WHERE age > (SELECT AVG(age) FROM teachers);
ANY、SOME、ALL
ANY:任意一个符合条件即可
SOME:只要有符合条件的即可,和
ANY
一样ALL:所有的都要符合条件
查询年龄大于任意一个男性(假设gender = 0 为男性)的数据,只要年龄比其中某个男性的年龄大就行
SQL
SELECT t.* FROM teachers t WHERE age > ANY (SELECT age FROM teachers WHERE gender = '0') ORDER BY age DESC;
SELECT t.* FROM teachers t WHERE age > SOME (SELECT age FROM teachers WHERE gender = '0') ORDER BY age DESC;
查询年龄大于所有男性(假设gender = 0 为男性)的数据,年龄比所有男性的年龄都大才会返回
SQL
SELECT t.* FROM teachers t WHERE age > ALL (SELECT age FROM teachers WHERE gender = '0') ORDER BY age DESC;