Skip to content
On this page

分组和子查询

分组

分组语法如下:

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;