查询操作
基本查询
要查询数据库表的数据,我们使用如下的 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
对结果集分页,假设每页 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; |
聚合查询的列中,只能放入分组的列。