整理自書籍《SQL必知必會(huì)》
1.1 數(shù)據(jù)庫基礎(chǔ)
數(shù)據(jù)庫
數(shù)據(jù)庫(database)是保存有組織的數(shù)據(jù)的容器(對(duì)于關(guān)系型數(shù)據(jù)庫而言)。
數(shù)據(jù)庫軟件又稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS)。數(shù)據(jù)庫是通過DBMS創(chuàng)建和操作的容器。
表
表是一種結(jié)構(gòu)化的文件,可用于存儲(chǔ)某種特定類型的數(shù)據(jù)。數(shù)據(jù)庫中的每個(gè)表都有一個(gè)唯一的名字。表的特性定義在模式(schema)中,模式可以用來描述庫中特定的表,也可以用來描述整個(gè)數(shù)據(jù)庫(和其中表的關(guān)系)。
列和數(shù)據(jù)類型
列(column):表中的一個(gè)字段。所有表都是由一個(gè)或多個(gè)列組成的。每個(gè)列都有相應(yīng)的數(shù)據(jù)類型。
數(shù)據(jù)類型(datatype):定義了列可以存儲(chǔ)哪些數(shù)據(jù)種類。
行
表中的數(shù)據(jù)是按行存儲(chǔ)的,所保存的每個(gè)記錄存儲(chǔ)在自己的行內(nèi)。
主鍵
表中每一行都應(yīng)該有一行或者多行可以唯一標(biāo)識(shí)自己,方便操作特定的行。應(yīng)該總是定義主鍵。
主鍵的特性:
- 任意兩行都不具有相同的主鍵
- 每一行都必須具有一個(gè)主鍵值(主鍵值不可為NULL)
- 主鍵的值不允許修改或更新
- 主鍵不能重用(如果某行從表中刪除,它的主鍵不能賦給其他的行)
主鍵通常定義在表的一列上,但是也可以使用多個(gè)列作為主鍵。在使用多個(gè)列作為主鍵時(shí),所有列必須滿足上述條件,所有列值的組合必須是唯一的。
2 檢索數(shù)據(jù)
2.1 SELECT語句
例:
SELECT prod_name
FROM Products;
SQL語句不區(qū)分大小寫,但是我們通常把關(guān)鍵字大寫,把列名和表名小寫,使代碼便于閱讀和調(diào)試。
檢索多個(gè)列時(shí)用逗號(hào)分隔。檢索所有列時(shí)使用通配符*,但是最好不要這么做,除非你確實(shí)是要檢索所有列。使用通配符的優(yōu)點(diǎn)是可以檢索出名字未知的列。
2.2 檢索不同的值
使用DISTINCT關(guān)鍵字檢索,只返回不同的值。DISTINCT關(guān)鍵字作用于所有檢索的列,不僅僅是跟在它后面的那一列。
2.3 限制結(jié)果
SQL Server / Access:
SELECT TOP 5 prod_name
FROM Products;
DB2:
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
Oracle:
SELECT prod_name
FROM Products
WHERE ROWNUM <= 5;
MySQL / MariaDB / PostgreSQL / SQLite:
SELECT prod_name
FROM Products
LIMIT 5;
上面的代碼都用于返回前5行數(shù)據(jù)。
用OFFSET指定從哪兒開始檢索:
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
LIMIT 5 OFFSET 5 指示MySQL返回從第5行開始(包含)的5行數(shù)據(jù)。LIMIT 5 OFFSET 5 也可以簡(jiǎn)寫為LIMIT 5,5。
2.4 注釋
行內(nèi)注釋
SELECT prod_name -- this is a comment
FROM Products;
另一種支持較少的行內(nèi)注釋,整行都將作為注釋:
# this is a comment
SELECT prod_name
FROM Products;
多行注釋
使用 /* */
3 排序檢索數(shù)據(jù)
3.1 排序數(shù)據(jù)
SELECT prod_name
FROM Products
ORDER BY prod_name;
使用ORDER BY子句對(duì)檢索的數(shù)據(jù)進(jìn)行排序。ORDER BY子句應(yīng)處于SELECT語句的最后。不一定要用檢索的列排序,用非檢索的列排序數(shù)據(jù)也是合法的。
3.2 按多個(gè)列排序
使用逗號(hào)分隔,先按位置在前的排序。
3.3 按列位置排序
SELECT prod_id, prod_name, prod_price
FROM Products
ORDER BY 1, 2;
使用簡(jiǎn)便,但是可能造成錯(cuò)用列名進(jìn)行排序。
3.4 指定排序方向
不指定則默認(rèn)升序,要按降序排序,則需指定DESC關(guān)鍵字。
4 過濾數(shù)據(jù)
4.1 使用WHERE子句
指定搜索條件(過濾條件)來提取所需的數(shù)據(jù)。WHERE子句寫在FROM子句之后。
4.2 WHERE子句操作符
- 等于 =
- 不等于 <> !=
- 小于 <
- 小于等于 <=
- 不小于 !<
- 大于 >
- 大于等于 >=
- 不大于 !>
- 在兩個(gè)值之間(包含邊界) BETWEEN ... AND ...
- 為NULL值 IS NULL