书摘:《SQL 必知必会》

文章目录
  1. 1. Chap.1 了解 SQL
    1. 1.1. 模式
      1. 1.1.1. 三层结构
    2. 1.2. 主键
    3. 1.3. 外键
    4. 1.4. SQL 语言的注释
  2. 2. Chap 2. 检索数据
    1. 2.1. 检索单个列
    2. 2.2. 检索多个列
    3. 2.3. 检索所有列
    4. 2.4. 检索不同的值
    5. 2.5. 限制结果
    6. 2.6. SQL 语句和大小写
  3. 3. Chap. 3 排序数据
    1. 3.1. 什么是子句
    2. 3.2. 排序数据
    3. 3.3. 按多个列排序
      1. 3.3.1. 按结果显示的列位置排序
    4. 3.4. 老子要降序排列
  4. 4. Chap 4. 筛选数据
    1. 4.1. 使用 WHERE 子句
    2. 4.2. WHERE 子句操作符
      1. 4.2.1. 范围值检查
  5. 5. Chap 5. 高级数据过滤
    1. 5.1. AND 和 OR
      1. 5.1.1. 顺序
    2. 5.2. IN
    3. 5.3. NOT
  6. 6. Chap 6. 用通配符进行过滤
  7. 7. Chap 7. 创建计算字段

摘录一些《SQL 必知必会》中值得一记的内容。

Chap.1 了解 SQL

模式

  表具有一些特性,这些特性定义了数据在表中的存储,包括存储什么样的数据,数据如何分解,各部分信息如何命名等信息。这些信息称作模式

三层结构

  通过三层结构,保障无论概念模式(表结构)或是内模式(换服务器/硬盘了,诶~)变了,外模式(用户写的程序)都可以不用改。

三层结构

主键

  • 任意两行都不具有相同的主键值
  • 每一行都必须有一个主键值(主键列不允许空值NULL)
  • 主键列中的值不允许修改或更新
  • 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)

外键

  说是挺重要的,详见第 12 章。是不是就是说这一列的取值只能是另一列出现过的值?譬如「学生 - 选课」列只能取「课程 - 课程号」列中的某个值。

SQL 语言的注释

1
2
3
4
5
/*
块注释
*/
SELECT a FROM b -- 行注释
SELECT a FROM b # 行注释

Chap 2. 检索数据

这一课介绍如何使用 SELECT 语句从表中检索一个或多个数据列。

检索单个列

1
SELECT column_name FROM TableName;

检索多个列

1
SELECT column1, column2 FROM TableName;

检索所有列

1
SELECT * FROM TableName;

检索不同的值

即去重检索。

1
2
SELECT DISTINCT column_name
FROM TableName;

注意:DISTINCT 对于后面所有的列都生效(后面你就知道,有些限定关键字只对紧接着的列生效)。换言之,下面这一行语句,会对三列都进行去重检索。

1
SELECT DISTINCT a, b, c FROM TableName;

有人说这一句相当于:

1
SELECT a, b, c FROM TableName group by a, b, c

有人说实际效果是只有三列都一样才认为是一样(予以折叠)。

限制结果

我只想要一定数量的行。

1
SELECT column_name FROM TableName LIMIT 5;

上面这条语句只对 MySQL、PostgreSQL 等有效,对于 Oracle 等无效。

SQL 语句和大小写

Page 12

  • SQL 语句不区分大小写
  • 约定
    • SQL 关键字:大写
    • 列名:小写
    • 表名:首字母大写(?

Chap. 3 排序数据

这一节讲授如何使用 SELECT 语句的 ORDER BY 字句,根据需要对检索出的数据进行排序。

什么是子句

SELECT 语句、FROM 字句、ORDER BY 字句。

排序数据

默认是升序排列。

1
2
SELECT prod_name FROM Products
ORDER BY prod_name

但其实你也可以不用显示出来的列进行排序:

1
2
SELECT prod_name FROM Products
ORDER BY price

注意:ORDER BY 字句必须位于 SELECT 语句的最后面。

按多个列排序

先按价格升序排,再按名字字母顺序升序排。

1
2
SELECT id, price, name FROM Products
ORDER BY price, name

按结果显示的列位置排序

1
2
SELECT id, price, name FROM Products
ORDER BY 2, 3;

和上面的排法一样:先按价格升序排,再按名字字母顺序升序排。

老子要降序排列

按照价格降序排列。

1
2
SELECT id, price, name FROM Products
ORDER BY price DESC;

按照价格降序,价格一样的按照名字升序

1
2
SELECT id, price, name FROM Products
ORDER BY price DESC, name;
1
2
SELECT id, price, name FROM Products
ORDER BY price DESC, name ASC;

按照价格降序,价格一样的按照名字降序

1
2
SELECT id, price, name FROM Products
ORDER BY price DESC, name DESC;

Chap 4. 筛选数据

使用 SELECT 语句的 WHERE 子句。

使用 WHERE 子句

1
2
SELECT name, price FROM Products
WHERE price = 233;

另外,正如之前所言,ORDER BY 子句要丢最后,意味着要用就得这么用:

1
2
3
SELECT name, price FROM Products
WHERE price = 233
ORDER BY name;

WHERE 子句操作符

操作符 说明
= 等于
<> / != 不等于
!< 不小于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为 NULL 值

范围值检查

1
2
SELECT name, price FROM Products
WHERE price BETWEEN 5 AND 10;

Chap 5. 高级数据过滤

这一课讲授如何组合 WHERE 子句以建立功能更强、更高级的搜索条件。我们还将学习如何使用 NOT 和 IN 操作符。

AND 和 OR

逻辑操作符:AND 和 OR。

1
2
3
SELECT id, price, name
FROM Products
WHERE factory_id = 'TSMC' AND price <= 10

顺序

优先处理 AND 操作符,再处理 OR。当然,你可以用括号。

IN

1
2
3
SELECT name, price FROM Products
WHERE factory_id IN ('TSMC', 'SAMSUNG')
ORDER BY name;

其实用 OR 也能实现

1
2
3
SELECT name, price FROM Products
WHERE factory_id = 'TSMC' OR factory_id = 'SAMSUNG'
ORDER BY name;

但相比用一连串的 OR,IN 的最大优点是可以包含其他 SELECT 语句。详见 Chap. 11。

NOT

1
2
3
SELECT name, price FROM Products
WHERE NOT factory_id IN ('TSMC', 'SAMSUNG')
ORDER BY name;

注意,而不是 NOT IN!是 NOT {column} IN,别的也一样:NOT {column} = 1

Chap 6. 用通配符进行过滤

有点像正则表达式。

  • LIKE 操作符。
    • 其实它在技术上应该称作「谓词」
  • 百分号 %:任意字符出现任意次数
1
2
SELECT id, name FROM Products
WHERE name LIKE 'Fish%';

找出以 Fish 打头,后面内容随意的 name。

  • 下划线 _:任意字符出现一次
  • 方括号 [ABC]:匹配字符集 A/B/C 中的一个字符一次。
    • [^ABC]:除了 ABC 以外的
1
2
3
SELECT name FROM users
WHERE name LIKE '[JM]%'
ORDER BY name;

结果如下:

1
2
3
4
5
name
------------
Jim Jones
John Smith
Michelle Green

Chap 7. 创建计算字段

  • TRIM():去掉字符串左右两边的空格
    • LTRIM()RTRIM()
  • AS:给计算字段赋一个别名