0%

SQL 学习笔记

本文记录学习 SQL 的笔记,主要是一些注意事项和技巧。

主要内容来自于《SQL 必知必会(第五版)》。

1. 关于 DISTINCT

DISTICT 关键字作用于所有的列,不仅仅是跟在其后的那一列

例如:SELECT DISTICT vendor_id, prod_price 会因为指定的两列不完全相同,所有的行都被选择出来。

2. 关于ORDER BY

  • 指定ORDER BY 语句时,应保证它是 SELECT 语句中的最后一句(要放在 WHERE 之后),否则会报错

  • ORDER BY 子句中选择的列也可以是不用于显示的列

  • 按多个列排序直接将列名用逗号隔开就行

    1
    2
    3
    4
    SELECT prod_id, prod_price, prod_name
    FROM Products
    ORDER BY prod_price, prod_name
    -- 先按照价格,后按照名称排序
  • 指定排序方向:DESC (DESCENDING)和 ASC (ASCENDING),默认为 ASC。对多个列指定排序顺序,需要对每一列分别指定(DESC 关键字只应用到直接位于其前面的列名),例如:

    1
    2
    3
    4
    SELECT 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) 返回字符串 substrstr 串的第一个出现的位置

5. COUNT 函数

  • COUNT(*) 对表中行的数目计数,不管表列中包含的是 NULL 还是非空
  • COUNT(col) 对特定列中具有值的行计数,忽略 NULL
  • DISTINCT 不能用于 COUNT(*),只能用于 COUNT(DISTINCT col) 形式

6. GROUP BY

计算被分组的列中各数据的数目:

1
2
3
SELECT vend_id, COUNT(*) as num_prods
FROM products
GROUP BY vend_id;

上面语句计算按 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
2
3
4
5
SELECT vend_id, COUNT(*) as num_prods
FROM products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2

SELECT 语句中的顺序:

1
2
3
4
5
6
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY