天天看點

SQL必知必會(第3版)學習筆記【1-5章】

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操作符搭配使用