SQL必知必會(第3版)
Ben Forta 著
鐘鳴, 劉曉霞等 譯
第1章 了解SQL
- 基礎:資料庫、資料庫技術
資料庫
差別于資料庫軟體(資料庫管理系統,DBMS)
表(table)
- 某種特定類型(類别)資料的結構化清單
- 模式(shhema):關于資料庫和表的布局及特性的資訊。
列和資料類型
- 列(colomn):表中的一個字段
- 每個列都有相應的資料類型(datatype)
- 數值、日期、文本、注釋等
行(row)/記錄(record)
- 資料按行存儲
主鍵(primary key)
- 每一行應該有可以唯一辨別自己的一列(或一組列)
- 應該總是定義主鍵(即使不一定用到)
- 作為主鍵的列應滿足以下條件:
- 任意兩行都不具有相同的主鍵值
- 每個行都必須具有一個主鍵值(主鍵列不允許NULL值)
- 主鍵列中的值不允許修改或更新
- 主鍵值不能重用(如果某行從表中删除,它的主鍵不能賦給以後的新行)
什麼是SQL
- 結構化查詢語言(Structured Query Language),用來與資料庫通信的語言。
- SQL由很少的詞構成。
第2章 檢索資料
SELECT語句
- 從一個或多個表中檢索資訊
- 關鍵字(keyword):SQL保留字
檢索單個列
SELECT prod_name
FROM Products;
注意
- SQL語句并不區分大小寫。
- SQL語句可以分成多行,所有空格都被忽略
- 多條SQL語句必須以分号分隔,單條SQL語句并不需要
檢索多個列
SELECT prod_id, prod_name, prod_price
FROM Products;
檢索所有列 *通配符
SELECT *
FROM Products;
第3章 排序檢索資料
- SELECT語句的 ORDER BY子句
排序資料
關系資料庫設計理論認為:如果不明确規定排序順序,則不應該假定檢索出的資料的順序有意義。
子句(clause)
- ORDER BY子句取一個或多個列的名字,據此對輸出進行排序
SELECT prod_name
FROM Products
ORDER BY prod_name;
- ORDER BY子句,應保證它是SELECT語句中最後一條子句。
- 也可以通過非選擇列進行排序
按多個列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY , ;
- 分析:2, 3代表SELECT清單中的prod_price, prod_name
指定排序方向
- 預設升序排序(A-Z)
- 降序操作:DESC關鍵字
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
- 多列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
- 分析:DESC關鍵字隻作用于直接位于其前面的列名,想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。
- DESC為DESCENDING的縮寫,反義詞是ASC(ASCENDING)
注意:排序時是否區分大小寫要視DBMS而定。
第4章 過濾資料
- WHERE子句(指定搜尋條件(search criteria),即過濾條件(filter condition))
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = ;
- ORDER BY子句位于WHERE之後
WHERE子句操作符
- != 不等于
- BETWEEN 介于
- IS NULL 為NULL值
檢查單個值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price < ;
不比對檢查
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';
- Access中,不支援!=
- ‘DLL01’不能用雙引号
範圍值檢查
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN AND ;
- BETWEEN包含兩端的值。
- 最小值和最大值在AND前後的位置可互換。
空值檢查
- 空值NULL
SELECT vend_id
FROM Vendors
WHERE vend_state IS NULL;
第5章 進階資料過濾
- WHERE組合(AND, OR)
- NOT
- IN
AND操作符
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= ;
OR操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
計算次序
- AND優先級要高
- 必要時用括号()
IN操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
- 類似于OR的組合
- 優點:
- 使用長的選項清單時,IN操作符清楚直覺
- 計算次序容易管理
- 執行更快
- 可以包含其他SELECT語句,能夠更動态地建立WHERE子句
NOT操作符
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
- 類似于<>不等于,但是在複雜語句中更強大
- 與IN操作符搭配使用