基本查询

要查询数据库表的数据,我们使用如下的 SQL 语句:

1
SELECT * FROM <表名>

SELECT 是关键字,表示将要执行一个查询,*表示“所有列”,FROM 表示将要从哪个表查询。

1
SELECT 100+200; // 输出: 300

SELECT 可以用作计算,但它并不是 SQL 的强项。但是,不带 FROM 子句的 SELECT 语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条 SELECT 1;来测试数据库连接。

条件查询

条件查询的语法就是:

1
SELECT * FROM <表名> WHERE <条件表达式>

条件表达式可以用<条件 1> AND <条件 2>表达满足条件 1 并且满足条件 2

第二种条件是<条件 1> OR <条件 2>,,表示满足条件 1 或者满足条件 2

第三种条件是 NOT <条件>,表示“不符合该条件”的记录。

如果不加括号,条件运算按照 NOT、AND、OR 的优先级进行,即 NOT 优先级最高,其次是 AND,最后是 OR。加上括号可以改变优先级。

常用的条件表达式

条件 表达式举例 1 表达式举例 2 说明
使用=判断相等 score = 80 name = ‘abc’ 字符串需要用单引号括起来
使用>判断大于 score > 80 name > ‘abc’ 字符串比较根据 ASCII 码, 中文字符比较根据数据库设置
使用>=判断大于或相等 score >= 80 name >= ‘abc’
使用<判断小于 score < 80 name <= ‘abc’
使用<=判断小于或相等 score <= 80 name <= ‘abc’
使用<>判断不相等 score <> 80 name <> ‘abc’
使用 LIKE 判断相似 name LIKE ‘ab%’ name LIKE ‘%bc%’ %表示任意字符,例如’ab%’将匹配’ab’,’abc’,’abcd’

投影查询

可以用SELECT 列1, 列2, 列3 FROM ...,让结果集仅包含指定列。这种操作称为投影查询。

使用SELECT 列1, 列2, 列3 FROM ...时,还可以给每一列起个别名,这样,结果集的列名就可以与原表的列名不同。它的语法是SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...

投影查询同样可以接 WHERE 条件,实现复杂的查询。

排序

加上ORDER BY xxx子句。从低到高进行排序

加上ORDER BY xxx DESC。从高到低进行排序

如果某列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender 表示先按 score 列倒序,如果有相同分数的,再按 gender 列排序:

默认的排序规则是 ASC(升序),即从小到大。ASC 可以省略,即 ORDER BY score ASC 和 ORDER BY score 效果一样。

如果有 WHERE 子句,那么 ORDER BY 子句要放到 WHERE 子句后面。

分页

使用 SELECT 查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大。这个时候就可以采用分页显示。要实现分页功能(假设一个分页显示 100 页),实际上就是从结果集中显示第 1100 条记录作为第 1 页,显示第 101200 条记录作为第 2 页,以此类推。因此,分页实际上就是从结果集中“截取”出第 M~N 条记录。这个查询可以通过 LIMIT OFFSET 子句实现。

对结果集分页,假设每页 3 条记录。要获取第 1 页的记录,可以使用 LIMIT 3 OFFSET 0:查询 LIMIT 3 OFFSET 0 表示,对结果集从 0 号记录开始,最多取 3 条。

注意 SQL 记录集的索引从 0 开始。

分页查询的关键在于,首先要确定每页需要显示的结果数量 pageSize(这里是 3),然后根据当前页的索引 pageIndex(从 1 开始),确定 LIMIT 和 OFFSET 应该设定的值:

LIMIT 总是设定为 pageSize。OFFSET 计算公式为 pageSize * (pageIndex - 1)。

OFFSET 是可选的,如果只写 LIMIT 15,那么相当于 LIMIT 15 OFFSET 0。

在 MySQL 中,LIMIT 15 OFFSET 30 还可以简写成 LIMIT 30, 15。

使用LIMIT <M> OFFSET <N>分页时,随着 N 越来越大,查询效率也会越来越低。

聚合查询

对于统计总数、平均数这类计算,SQL 提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

COUNT()表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是 COUNT()。通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果。

COUNT(*)和 COUNT(id)实际上是一样的效果。另外注意,聚合查询同样可以使用 WHERE 条件

除了 COUNT()函数外,SQL 还提供了如下聚合函数:

函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值

注意,MAX()和 MIN()函数并不限于数值类型。如果是字符类型,MAX()和 MIN()会返回排序最后和排序最前的字符。

如果聚合查询的 WHERE 条件没有匹配到任何行,COUNT()会返回 0,而 SUM()、AVG()、MAX()和 MIN()会返回 NULL:

对于聚合查询,SQL 还提供了“分组聚合”的功能。我们观察下面的聚合查询。例如:

1
SELECT COUNT(*) num FROM students GROUP BY class_id;

也可以使用多个列进行分组。例如,我们想统计各班的男生和女生人数:

1
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;

聚合查询的列中,只能放入分组的列。