1.聚合查询
(1)使用SQL内置的 COUNT() 函数查询:
SELECT COUNT(*) FROM students;
COUNT*表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是 COUNT *。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果。
(2)COUNT(*)和COUNT(id)实际上是一样的效果。另外注意,聚合查询同样可以使用WHERE条件,因此我们可以方便地统计出有多少男生、多少女生、多少80分以上的学生等:
SELECT COUNT(*) boys FROM students WHERE gender = 'M';
(3)除了COUNT()函数外,SQL还提供了如下聚合函数:
要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL
2.分组聚合
(1)按class_id分组:
SELECT COUNT(*) num FROM students GROUP BY class_id;
(2)把class_id列也放入结果集中:
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
(3)使用多个列进行分组。例如,我们想统计各班的男生和女生人数
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
3.多表查询
(1)查询多张表的语法是:SELECT * FROM <表1> <表2>。
例如,同时从students表和classes表的“乘积”,即查询数据,可以这么写:
SELECT * FROM students, classes;
这种一次查询两个表的数据,查询的结果也是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回。结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。
(2)上述查询的结果集有两列id和两列name,两列id是因为其中一列是students表的id,而另一列是classes表的id,但是在结果集中,不好区分。两列name同理
要解决这个问题,我们仍然可以利用投影查询的“设置列的别名”来给两个表各自的id和name列起别名:
SELECT
students.id sid,
students.name,
students.gender,
students.score,
classes.id cid,
classes.name cname
FROM students, classes;
(3)多表查询也是可以添加WHERE条件的
SELECT
s.id sid,
s.name,
s.gender,
s.score,
c.id cid,
c.name cname
FROM students s, classes c
WHERE s.gender = 'M' AND c.id = 1;