SQL 简单用法

本文最后更新于 2024年6月25日 晚上

SQL 简单用法

SQL,全称是 Structured Query Language,结构化查询语言。SQL 提供了一组数据库查询标准,因此我们可以使用 SQL 来对遵循这一套标准的数据库管理系统(DBMS,口头简称数据库)进行数据库操作,包括查询记录、删除记录、建表等等。

下面的内容使用的数据库是 MySQL,以 sakila 数据库为例。

查找

SELECT 关键词用来查找指定的列。

SELECT city_id FROM city;

用 * 指代所有列。

SELECT * FROM city;

用 * 指代所有列的效果等同于选中所有列。

SELECT city_id, city, contry_id, last_update FROM city;

限制行数

直接使用 SELECT … FROM … 会取出所有的行,但是一般我们只需要部分内容,所以可以使用 LIMIT 限制返回的行的总数。

SELECT * FROM city LIMIT 10;

偏移

使用 OFFSET 舍弃前 N 行,然后限制行的总数。

SELECT * FROM city LIMIT 10 OFFSET 6;

注意:只有当 LIMIT 存在的时候才能使用 OFFSET,并且 OFFSET 必须在 LIMIT 之后。

也可以简化 OFFSET,上面的 SQL 等同于这条语句。

SELECT * FROM city LIMIT 6, 10;

舍弃前 6 行,然后从第 7 行开始取 10 行。

排序

使用 ORDER BY 可以按照选中的列进行排序,用 ASC 表示升序,DESC 表示降序。ORDER BY 默认使用 ASC,也就是升序。注意,在没有使用 ORDER BY 的情况下,SQL 执行返回的结果顺序是随机的(不是一定有序)。

SELECT * FROM city ORDER BY city_id DESC LIMIT 10;

允许使用 SELECT 未选中的列进行排序。

SELECT city FROM city ORDER BY city_id DESC LIMIT 10;

用多个列进行排序,可以为每个参与排序的列都声明升序或者降序。

SELECT * FROM city ORDER BY city_id DESC, city LIMIT 10;

排序会按照参与排序的列的先后顺序进行,当一个参与排序的列的值相等时,会使用下一个参与排序的列继续进行排序,直到排出结果为止。如果两行所有参与排序的列的值都相同,那么这个排序是不起效果的,返回的结果是随机的。(如果你觉得这里有点绕,不妨自己去实际试一下)

在上面的例子中,数据行会先根据 city_id 进行降序排序,如果 city_id 相等,则再根据 city 的进行升序排序。

注意:ORDER 的位置在 LIMIT 之前。

筛选

使用 WHERE 配合运算符可以对行进行筛选,选中符合条件的行加入结果集。

运算符 描述
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!=或<> 不等于
IS NULL 值为 NULL
IS NOT NULL 不为 NULL
BETWEEN … AND … 在两个值之间
IN (…, …) 在给定的集合内

选出 city_id 小于等于 10 的所有行。

SELECT * FROM city WHERE city_id <= 10;

选出 city_id 为 1 或者 5 或者 7 的行。

SELECT * FROM city WHERE city_id IN (1, 5, 7);

对于字符条件,需要用引号包围。

SELECT * FROM city WHERE city = "Brest";

模糊匹配

还可以用 WHERE 配合 LIKE 进行模糊匹配。
% 用于匹配任意长度的任意字符,_用于匹配单个任意字符。

选出 A 开头的所有城市。

SELECT * FROM city WHERE city LIKE "A%";

选出 A 开头,且 A 后面三个字符为任意字符的城市。

SELECT * FROM city WHERE city LIKE "A___"

条件组合

使用多个条件可以用 AND 和 OR 连接,表示 并列 和 或者。

SELECT * FROM city WHERE city_id < 10 AND city LIKE "A%";

注意:AND 的优先级是高于 OR 的,即多个 AND 和 OR 出现时,会先对 AND 连接的条件进行运算,最后结果再使用 OR 进行运算。

WHERE 的条件在 ORDER BY 之前生效。

聚合

聚合函数

SELECT 除了可以选择列以外,也可以使用聚合函数对结果进行一些统计运算。在数据库进行这些运算可以直接返回需要的值,减少网络传输量。

函数名 描述
COUNT() 返回行的总数
MAX() 返回选择列的最大值
MIN() 返回选择列的最小值
AVG() 返回选择列的平均值
SUM() 返回选择列的总和

统计 city 表的行的总数。

SELECT COUNT(*) FROM city;

统计 city 表的 A 开头的城市总数。

SELECT COUNT(*) FROM city WHERE city LIKE "A%";

使用聚合函数的同时,如果 SELECT 还选中了普通的列名,那么将会报错。聚合函数和 GROUP BY 一起使用时,可以让 SELECT 选中已分组的列。

分组

使用 GROUP BY 可以对有相同值的行进行分组。

GROUP BY 分组操作一般和聚合函数一起使用,用于对不同的分组进行聚合。

统计各个演员出演的电影数量。

SELECT actor_id, COUNT(*) FROM film_actor GROUP BY actor_id;

当使用 GROUP BY 时,SELECT 只能选中被 GROUP BY 选中的列或者使用聚合函数。

聚合筛选

当我们要从聚合查询的结果中进行筛选时,使用的是 HAVING,而不是 WHERE。

选出出演电影数量大于 25 部的演员编号。

SELECT actor_id, COUNT(*) FROM film_actor GROUP BY actor_id HAVING COUNT(*) > 25;

选出出演电影数量大于 25 部的演员编号,并按照出演电影数量降序排序。

SELECT actor_id, COUNT(*) FROM film_actor GROUP BY actor_id HAVING COUNT(*) > 25 ORDER BY COUNT(*) DESC;

注意:聚合操作的位置在 SELECT 之后,在 ORDER BY 之前。

联合

UNION 用于合并查询结果。

UNION 可以合并两个 SQL 语句的执行结果,要求待合并的两个结果集列的数量和顺序相同,列的类型也需要相似。

选出 city_id 为 1 或 5 或 7 的元素,与 city 为 A 开头后面三个字符任意的结果合集。

SELECT * FROM city WHERE city_id IN (1, 5, 7)
UNION
SELECT * FROM city WHERE city LIKE "A___";

UNION 操作会自动将结果重复的行进行合并,如果不希望合并重复的行,可以使用 UNION ALL。

SELECT * FROM city WHERE city_id IN (1, 5, 7)
UNION ALL
SELECT * FROM city WHERE city LIKE "A___";

SQL 简单用法
https://blog.avezah.com/tech/20230209-sql-simple-use/
作者
avezah
发布于
2023年2月9日
许可协议