SQL4必知必會摘錄(一)

zimenglan發表於2013-06-20

2013-06-18:
1 主鍵-primary key
一列或者一組列,其值能夠唯一標示表中的每一行
任意兩行都不具有相同的主鍵值
每一行都必須具有一個主鍵值,即主鍵列不允許NUL值
主鍵列中的值不允許修改或更新
主鍵值不能重用,如果某行從表中刪除,它的主鍵不能賦給以後的新行

2 DISTINCT關鍵字,指示資料庫只返回不同的值,如果使用DISTINCT關鍵字,它必須直接放在列名的前面
Eg:SELECT DISTINCT vend_id FROM Products;

3 LIMIT關鍵字,返回檢索結果的第一行或者一定數量的行
LIMIT number 指定返回的行數
LIMIT index OFFSET number 從哪兒開始以及檢索的行數
注意:index是從0開始

4 註釋
行內註釋 -- 兩個連字元 嵌在行內 之後的文字就是註釋
Eg:SELECT prod_name -- 這是一條註釋 FROM Products
# 在一行的開始處使用#,這一整行都將作為註釋
/**/ 多行註釋, 可以在指令碼的任何位置停止和開始

2013-06-21:
5 排序 ORDER BY
關聯式資料庫設計理論認為,如果不明確規定排序順序,則不應該假定檢索出來的資料的順序有任何意義
為了明確排序用SELECT語句檢索出的資料,可以使用ORDER BY子句
ORDER BY 子句取一個或者多個欄位,據此對輸出進行排序
Eg: SELECT prod_name FROM Products ORDER BY prod_name
注意:在指定一條ORDER BY 子句時,應該保證它是SELECT語句中最後一條子句,否則將會出現錯誤訊息 要按多個欄位排序,簡單指定欄位名,欄位之間用逗號分開即可,這樣排序時是從左往右依次按欄位來排序 除了能用列名指出排序順序外,ORDER BY還支援按選擇列的相對位置進行排序(位置從1開始)
預設是升序排序,可以用DESC來顯性降序排序,ASC為升序排序
Eg:SELECT prod_id, prod_price, prod_nameFROM Products ORDER BY prod_price DESC;
DESC關鍵字只應用到直接位於其前面的列名,如果想在多個列上進行降序排序,必須對每一列指定DESC關鍵字
學習瞭如何用SELECT 語句的ORDER BY 子句對檢索出的資料進行排序。這個子句必須是SELECT 語句中的最後一條子句。根據需要,可以利用它在一個或多個列上對資料進行排序

6 子句 clause
SQL語句由子句構成,有些子句是必需的,有些則是可選的
一個子句通常由一個關鍵字加上所提供的資料組成
子句的例子有我們在前面看到的SELECT語句的FROM子句

7 WHERE子句
SELECT語句的WHERE子句指定搜尋條件,只檢索所需資料需要指定搜尋條件(search criteria),搜尋條件也稱為過濾條件(filter condition)
SQL過濾與應用過濾
資料也可以在應用層過濾,為此SQL的SELECT語句為客戶端應用檢索出超過實際所需的資料,然後客戶端程式碼對返回的資料進行遍歷,提取出需要的行
通常這種做法極其不妥 優化資料庫後可以更快速有效地對資料進行過濾,而讓客戶端應用或者開發語言處理資料庫的工作將會極大地影響應用的效能,並且使所建立的應用完全不具備可伸縮性,此外如果在客戶端過濾資料,伺服器不得不通過網路傳送多餘的資料,這將導致網路頻寬的浪費
WHERE子句的位置,應該在ORDER BY子句之前
WHERE子句操作符

何時使用引號?單引號用來限定字串,如果將值與字串型別的列進行比較,就需要限定引號用來與數值列進行比較的值不用引號
BETWEEN操作符,在使用時必須指定兩個值—所需範圍的低端值和高階值,這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中所有的值,包括指定的開始值和結束值
eg:SELECT pro_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
空值檢測,在一個列不包含值時,稱其包含空值NULL(NULL與欄位包含0、空字串或僅僅包含空格不同)。IS NULL子句用來檢測具有NULL值的列,其語法如下:WHERE column_name IS NULL;
在過濾資料時,一定要驗證被過濾列中含NULL的行確實出現在返回的資料中,因為資料庫不知道它們是否匹配,所以在進行匹配過濾或者非匹配過濾時,不會返回這些結果

8 組合WHERE子句
操作符(operator)用來聯結或者改變WHERE子句中的子句關鍵字,也稱為邏輯操作符(logical operator),如AND和OR
AND用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行,當進行多個過濾條件時,每個條件間都要用AND關鍵字
OR操作符與AND操作符正好相反,它指示檢索匹配任一條件的行,一般情況下會進行短路操作
WHERE子句可以包含任意數目的AND和OR操作符,允許兩者結合以進行復雜、高階的過濾,需要注意的是OR操作符的優先順序高於AND操作符,所以需要用圓括號對操作符進行明確分組
IN操作符用來指定條件範圍,範圍中的每一個條件都可以進行匹配,IN取一組由逗號分隔、括在圓括號中的合法值
eg:SELECT prod_name, prod_price FROM Products WHERE vend_id IN (‘ddl01’, ‘brs01’) ORDER BY prod_name;
為什麼使用IN操作符?
1 在很多合法選項時,IN操作符的語法更清楚、更直觀
2 在與其他AND和OR操作符組合使用IN時,求值順序更容易理解和管理
3 IN操作符一般比一組OR操作符執行的更快
4 IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句
NOT操作符,在WHERE子句中的NOT操作符有且只有一個功能,那就是否定其後所跟的任何條件,因為NOT從不單獨使用(總是和其他操作符一起使用),所以它的語法與其他操作符有所不同
NOT關鍵字可以用在要過濾的前面,不僅是在其後
eg:SELECT prod_name FROM Products WHERE NOT vend_id = ‘dll01’;
在簡單的WHERE子句裡使用NOT關鍵字,確實沒啥優勢,但是在更復雜的子句中,NOT是非常有用的,如在與IN操作符聯合使用時,NOT可以非常簡單地找出與條件列表不匹配的行

9 萬用字元進行過濾
萬用字元(wildcard)用來匹配值的一部分的特殊字元,實際上是SQL的WHERE子句中有特殊含義的字元 搜尋模式(search pattern)由字面值、萬用字元或兩者組合構成的搜尋條件
為了在搜尋子句中使用萬用字元,必須使用LIKE操作符
操作符何時不是操作符?答案是,它作為謂詞(predicate)時,從技術上說,LIKE是謂詞而不是操作符,雖然最終的結果是相同的
%操作符,在搜尋條件中,它表示任何字元出現任意次數
eg:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;
(注意,如果使用的是Microsoft Access,需要使用*而不是%; 區分大小寫,根據DBMS的不同及其配置,搜尋可以區分大小寫的)
萬用字元%看起來像是可以匹配任何東西,但有個例外,這個就是NULL
萬用字元可以在搜尋模式中的任意位置使用,並且可以使用多個萬用字元
下劃線()萬用字元,跟%一樣,但是它只能匹配單個字元,而不是多個字元(注:DB2不支援萬用字元,Access的為?),下劃線_總是剛好匹配一個字元,不多也不少
方括號([])萬用字元用來指定一個字符集,它必須匹配指定位置(萬用字元的位置)的一個字元
並不是所有的DBMS都支援建立集合的 [] ,只有Access和SQL Server支援集合,為確定你使用的DBMS是否支援集合,請參閱相應的文件
Eg:SELECT cust_contact FROM Customers WHERE cust_contact LIKE ‘[JM]’;
此萬用字元可以用字首字元^來否定(類似正規表示式),
Eg:SELECT cust_contact FROM Customers WHERE cust_contact LIKE ‘[^JM]’;
當然也可以用NOT操作符得出相同的結果
Eg:SELECT cust_contact FROM Customers WHERE NOT cust_contact LIKE ‘[JM]’;
是不是感受到SQL萬用字元的強大之處了?但是這種強大是需要付出代價的,即萬用字元搜尋一般比前面討論的其他搜尋需要花費更長的處理時間,這裡給出一些使萬用字元時要記住的技巧:
1 不要過度使用萬用字元,如果其他操作符能達到相同的目的,應該使用其他操作符
2 確實需要使用萬用字元時,儘量不要把它們放在搜尋模式的開始處(短路搜尋)
3 仔細注意萬用字元的位置,如果放錯地方,可能不會返回相要的資料

相關文章