SQL 查询语句复习笔记

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 20offset超过了查询的最大数量并不会报错,而是得到一个空的结果集。)

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;

其他常用聚合函数 SUMAVGMAXMIN

分组聚合查询

统计各班的男生和女生人数

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则是选出左右表都存在的记录:


未完待续

参考内容:SQL教程 - 廖雪峰的官方网站

你可能感兴趣的:(SQL 查询语句复习笔记)