基本查询
SELECT * FROM students;
条件查询
SELECT * FROM students where score >= 80 AND gender='M';
score 和 gender 是查询条件
SELECT * FROM students WHERE NOT class_id = 2;
按 NOT 条件查询 students,查找条件不为 id=2 的数据
SELECT * FROM students WHERE score < 80 OR score > 90 AND gender = 'M';
如果不加括号,条件运算按照 NOT、AND、OR 的优先级进行,即 NOT 优先级最高,其次是 AND,最后是 OR。加上括号可以改变优先级。
投影查询
SELECT id, score points, name FROM students;
SELECT 语句将列名 score 重命名为 points,而 id 和 name 列名保持不变
排序
SELECT id, name, gender, score FROM students ORDER BY score;
默认按 score 从低到高
SELECT id, name, gender, score FROM students ORDER BY score DESC;
按照成绩从高到底排序,我们可以加上 DESC 表示 “倒序”
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
如果 score 列有相同的数据,要进一步排序,可以继续添加列名。例如,使用 ORDER BY score DESC, gender 表示先按 score 列倒序,如果有相同分数的,再按 gender 列排序
分页查询
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;
我们把结果集分页,每页 3 条记录。要获取第 1 页的记录,可以使用 LIMIT 3 OFFSET 0 LIMIT3 表示每页最多 3 条记录,0 是结果集从 0 号记录开始。如果想查看第二页的记录,将 offset 设为 3.
聚合查询
对于统计总数、平均数这类计算,SQL 提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果
SELECT COUNT(*) num FROM students;
COUNT () 表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是 COUNT ()。
通常,使用聚合查询时,我们应该给列名设置一个别名(num),便于处理结果
除了 COUNT () 函数外,SQL 还提供了如下聚合函数
函数 | 说明 |
---|---|
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值 |
MIN | 计算某一列的最小值 |
注意,MAX () 和 MIN () 函数并不限于数值类型。如果是字符类型,MAX () 和 MIN () 会返回排序最后和排序最前的字符
SELECT AVG(score) average FROM students WHERE gender = 'M';
使用聚合查询计算男生平均成绩
分组查询
SELECT COUNT(*) num FROM students GROUP BY class_id;
按 class_id 分组
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
但是这 3 行结果分别是哪三个班级的,不好看出来,所以我们可以把 class_id 列也放入结果集中
多表查询
SELECT * FROM students, classes;
利用投影查询的 “设置列的别名” 来给两个表各自的 id 和 name 列起别名
SELECT
students.id sid,
students.name,
students.gender,
students.score,
classes.id cid,
classes.name cname
FROM students, classes;
给表名取别名
SELECT
s.id sid,
s.name,
s.gender,
s.score,
c.id cid,
c.name cname
FROM students s, classes c;
连接查询
连接查询是另一种类型的多表查询。连接查询对多个表进行 JOIN 运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地 “连接” 在主表结果集上。
内连接 INNER JOIN
- 先确定主表,仍然使用 FROM <表 1> 的语法;
- 再确定需要连接的表,使用 INNER JOIN <表 2> 的语法;
- 然后确定连接条件,使用 ON <条件…>,这里的条件是 s.class_id = c.id,表示 students 表的 class_id 列与 classes 表的 id 列相同的行需要连接;
- 可选:加上 WHERE 子句、ORDER BY 等子句。
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;
选出所有学生,同时返回班级名称
外连接 OUTER JOIN
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
RIGHT OUTER JOIN classes c
ON s.class_id = c.id;
查询范式
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;