设 students
表有 id
, class_id
, name
, gender
, score
列,设 class
表有 id
, name
列
排序
先按score
列倒序,如果有相同分数的,再按gender
列排序
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
分页
把结果集分页,每页10条记录,展示第1页
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 10;
如果需要显示第3页,offset
计算公式为每页记录数x(页数-1),即10x(3-1)=20,语句为LIMIT 10 OFFSET 20
(offset
超过了查询的最大数量并不会报错,而是得到一个空的结果集。)
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 10 OFFSET 20;
聚合查询
查询所有男生的行数,设置结果集的列名为boys
,语句为COUNT(*) boys
SELECT COUNT(*) boys FROM students WHERE gender = 'M';
每页10条记录,通过聚合查询获得总页数(CEILING
为向上取整,FLOOR
为向下取整)
SELECT CEILING(COUNT(*) / 3) FROM students;
其他常用聚合函数 SUM
,AVG
,MAX
,MIN
分组聚合查询
统计各班的男生和女生人数
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
结果为
class_id | gender | num |
---|---|---|
1 | M | 15 |
1 | F | 15 |
2 | M | 15 |
2 | F | 15 |
查出每个班级的平均分,保留一位小数点
SELECT class_id,ROUND(AVG(score),1) avg_score from students GROUP by class_id;
结果为
class_id | avg_score |
---|---|
1 | 86.5 |
2 | 66.6 |
3 | 23.3 |
多表查询
使用多表查询一班女生的信息
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;
由于两个表中都有 id 和 name 列,务必要给相应的列设置别名,也可以给表设置别名使语句更加简洁。
多表查询的结果集可能非常巨大,要小心使用。
连接查询
选出students表的所有学生信息,并连接class表的班级名称
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;
JOIN查询对比
设A表和B表,设查询语句:
SELECT * FROM A JOIN B ON A.c1 = B.c2;
INNER JOIN是选出两张表都存在的记录:
LEFT OUTER JOIN是选出左表存在的记录:
RIGHT OUTER JOIN是选出右表存在的记录:
FULL OUTER JOIN则是选出左右表都存在的记录: