《SQL 必知必会》精要

检索数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SELECT prod_name  -- 检索单列
FROM Products;

SELECT prod_id, prod_name, prod_price -- 检索多列
FROM Products;

SELECT * -- 通配符检索所有列,可以检索未知列
FROM Products;

SELECT DISTINCT vend_id -- 只检索不同值
FROM Products;

SELECT prod_name
FROM Products
LIMIT 5; -- 返回不超过五行数据

SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5; -- 检索从第 6 行开始 5 行

SELECT prod_name
FROM Products
LIMIT 5,5; -- 以上等价形式

# 注释
SELECT prod_name -- 注释
FROM Products; # 注释

/* SELECT prod_name, vend_id
FROM Products; */ -- 多行注释
SELECT prod_name
FROM Products;

排序检索数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT prod_name
FROM Products
ORDER BY prod_name; -- 以 prod_name 列按字母顺序排序数据,ORDER BY 应为 SELECT 语句最后一条子句

SELECT prod_name, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name; -- 先按 prod_price 排序,再按 prod_name 排序

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2,3; -- 以上等价形式,优点无需重新输入列名,缺点可能用错列名排序,对 SELECT 进行更改容易忘记更改 ORDER BY 子句,进行排序列需在 SELECT 清单中

SELECT prod_id, prod_price
FROM Products
ORDER BY 2,prod_name; -- 混用两种形式

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC; -- 降序按 prod_price 排列数据

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name; -- 先降序按 prod_price 排列,再正序按 prod_name 排列

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name DESC; -- 在 prod_price 和 prod_name 同时按降序排序,每个都指定 DESC 关键字

SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price ASC, prod_name ASC; -- ASC 关键字按正序排列,无需单独声明

过滤数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49; -- 从 Products 检索 prod_name, prod_price 列,只返回 prod_price 值为 3.49 的行

SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01'; -- 如果将值与字符串类型列比较,需要引号,与数值列进行比较不需要引号

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10; -- 检索 prod_name 和 prod_price 列,返回 prod_price 值在 5 到 10 之间的行

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL; -- 检索 cust_name 列返回 cust_email 为 NULL 的行
操作符说明
=等于
<>不等于
!=不等于
<小于
<=小于等于
!<不小于
>大于
>=大于等于
!>不大于
BETWEEN在指定两个值之间
IS NULL为 NULL 值

高级数据过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4; -- 检索 vend_id 为 DLL01 且 prod_price 小于 4 的 prod_id, prod_price, prod_name 值

SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'; -- 检索 vend_id 为 DLL01 的行或为 BRS01 的行
# 许多 DBMS 为惰性求值,第一个条件满足,无论第二个条件是否满足都被检索出来

SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10; -- AND 求值顺序先于 OR

SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01') -- IN 操作符的优点为容易管理求值顺序,比 OR 执行更快,可以包含其他 SELECT 语句
ORDER BY prod_name;

SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01' -- NOT 否定任何跟在其后条件
ORDER BY prod_name;

用通配符进行过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%'; -- 检索以 Fish 开头的词,% 表示任何字符串出现任意次数

SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%'; -- 检索任何位置上包含 bean bag 的词

SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%y'; -- 检索以 F 开头以 y 结尾的词
# 通配符 % 的例外是不会匹配产品名称为 NULL 的行

SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear'; -- _ 通配符总是刚好匹配一个字符

SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact; -- mysql 不支持,匹配 J 或 M 开头的字符

SELECT cust_contact
FROM Customers
WHERE cust_dontact LIKE '[^JM]%'
ORDER BY cust_contact; -- mysql 不支持,匹配不以 J 或 M 开头的字符
本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处! © 雨落
  1. 1. 检索数据
  2. 2. 排序检索数据
  3. 3. 过滤数据
  4. 4. 高级数据过滤
  5. 5. 用通配符进行过滤