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___";