本文记录学习 SQL 的笔记,主要是一些注意事项和技巧。
主要内容来自于《SQL 必知必会(第五版)》。
1. 关于 DISTINCT
DISTICT
关键字作用于所有的列,不仅仅是跟在其后的那一列
例如:SELECT DISTICT vendor_id, prod_price
会因为指定的两列不完全相同,所有的行都被选择出来。
2. 关于ORDER BY
指定
ORDER BY
语句时,应保证它是SELECT
语句中的最后一句(要放在WHERE
之后),否则会报错ORDER BY
子句中选择的列也可以是不用于显示的列按多个列排序直接将列名用逗号隔开就行
1
2
3
4SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name
-- 先按照价格,后按照名称排序指定排序方向:
DESC
(DESCENDING)和ASC
(ASCENDING),默认为ASC
。对多个列指定排序顺序,需要对每一列分别指定(DESC
关键字只应用到直接位于其前面的列名),例如:1
2
3
4SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name
-- prod_name 默认 ASC,可以不写
3. 关于通配符
%
通配符:匹配0或任意多个任意字符,不包括 NULL_
通配符:匹配1个任意字符- 通配符搜索比较耗时,因此尽量减少使用通配符搜索,如果可以用其他操作符代替的话
4. 字符串函数
注:在 SQL 中,索引从 1 开始
函数 | 功能 |
---|---|
LENGTH(str) |
返回字符串的长度 |
LTRIM(str) /RTRIM(str) /TRIM(str) |
去除字符串左边/右边/两边的空格 |
SUBSTR(str, pos) |
返回字符串从 pos 开始到结束的子字符串(包括 pos 位置的字符) |
SUBSTR(str, pos, len) |
返回字符串从 pos 开始长度为 len 的子字符串返回字符串从 pos 开始到结束的子字符串(包括 pos 位置的字符) |
INSTR(str, substr) |
返回字符串 substr 在 str 串的第一个出现的位置 |
5. COUNT 函数
COUNT(*)
对表中行的数目计数,不管表列中包含的是NULL
还是非空COUNT(col)
对特定列中具有值的行计数,忽略NULL
值DISTINCT
不能用于COUNT(*)
,只能用于COUNT(DISTINCT col)
形式
6. GROUP BY
计算被分组的列中各数据的数目:
1 | SELECT vend_id, COUNT(*) as num_prods |
上面语句计算按 vend_id
分组,每个分组内有多少条数据
一些规定:
GROUP BY
子句可以包含任意数目的列,因此可以对分组进行嵌套。如果在GROUP BY
子句中嵌套了分组,数据将在最后指定的分组上进行汇总- 除聚合函数语句外,
SELECT
语句的每一列都必须在GROUP BY
子句中给出 - 如果在
SELECT
中使用表达式,则必须在GROUP BY
子句中指定相同的表达式,不能使用别名 GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前- 如果分组列中包含具有
NULL
值的行,则NULL
将作为一个分组返回,列中如有多行NULL
,它们将分为一组
6.1. 用 HAVING 语句过滤分组
WHERE
过滤行,HAVING
过滤分组,WHERE
子句在数据分组前过滤,而 HAVING
子句在数据分组后过滤。举例:
1 | SELECT vend_id, COUNT(*) as num_prods |
SELECT
语句中的顺序:
1 | SELECT |