SQL基礎:從表中檢索數據
SELECT從數據庫里的一個或多個表中檢索行、列和派生值。
基本語法是:
SELECT columns FROM tables [JOIN joins] [WHERE search_conditions] [GROUP BY grouping_columns] [HAVING search_condition] [ORDER BY sort_columns];
本文包含內容:
1.使用SELECT和FROM檢索列
2.使用AS創建列的別名
3.使用DISTINCT消除重復的行
4.使用ORDER BY排序行
5.使用WHERE篩選行
6.使用AND、OR和NOT組合及求反條件
7.使用LIKE匹配模式
8.使用BETWEEN進行范圍篩選
9.使用IN進行列表篩選
10.使用IS NULL測試空值
1.使用SELECT和FROM檢索列
SELECT column(s) FROM table;
從一個表中檢索列,可以是一列、多列或全部的列。
FROM子句指定從中提取列的表。
檢索多個列:多個列的名稱以逗號分隔,列將按照在columns中給出的順序顯示,而不是按照表中定義的順序顯示。
從一個表中檢索全部的列:
SELECT * FROM table;
檢索全部的列時,列將按照在table中定義的順序顯示。
從一個表中確定列的操作,稱為投影。
2.使用AS創建列的別名
在查詢結果中,列的標題使用默認值,即表中定義的列名。
列的別名是為了控制在結果中列的標題如何顯示而指定的另一個名稱(標識符)。
在SELECT語句的SELECT子句中,列的別名直接跟在列名的后面。如果別名是保留關鍵字或者包含空格、標點或特殊字符,則用單引號或雙引號將別名括起來。
SELECT column1 [AS] alias1, column2 [AS] alias2, … columnN [AS] aliasN FROM table;
很多時候,關鍵字AS是可選的,但應該始終使用它,並用對別名加雙引號,以使SQL代碼更具有可移植性和可讀性。
3.使用DISTINCT消除重復的行
SELECT DISTINCT columns FROM table;
如果包含多列,則所有列值的組合決定了行的唯一性。
雖然空值是未知的,彼此絕不相等,但是DISTINCT認為所有的空值是彼此相等的。
無論遇到多少個空值,SELECT DISTINCT在結果中只返回一個空值。
SELECT語句的語法包括ALL關鍵字選項,但在實際中很少看到,因為它是默認行為:顯示所有的行。
語法關系是:
SELECT [ALL | DISTINCT] columns FROM table;
4.使用ORDER BY排序行
查詢結果中行是無序的,因此行可以按任意順序顯示。
ORDER BY經常是SELECT子句中最后一個子句。
1.按一列排序
SELECT columns FROM table ORDER BY sort_column [ASC | DESC]
columns是一個或多個以逗號分隔的列名,sort_column是在其上對結果進行排序的列的列名。
ASC為升序,DESC為降序。
如果沒有指定排序的方向,則默認為升序。
2.按多列排序
SELECT columns FROM table ORDER BY sort_column1 [ASC | DESC] sort_column2 [ASC | DESC] … sort_columnN [ASC | DESC]
行首先按sort_column1排序,然后對sort_column1中值相等的行再按sort_column2中的值排序,以此類推。
3.排序時還可以指定列的序號:
SELECT columns FROM table ORDER BY sort_num1 [ASC | DESC] sort_num2 [ASC | DESC] … sort_numN [ASC | DESC]
sort_num1, sort_num2, sort_numN是在1和columns列數之間的整數。
每一個整數指定了某一列在columns中的相對位置。
排序和空值
排序是SQL違反空值不等於任何其他值(包括其他空值)概念的情形之一。
當空值被排序時,它們被認為是彼此相等的。
在排序列中的空值是第一個還是最后一個被列出,這依賴於DBMS。
5.使用WHERE篩選行
可以使用WHERE子句從結果中篩選想要的行。
在WHERE子句里指定查詢條件,查詢條件有一個或多個需要被表中的行滿足的條件。
條件或斷言是一個值為true、false或者unknown的邏輯表達式。
條件為true的行出現在結果中;條件為假或未知的被排除在外。
條件和操作符:
比較 =、<>(不等於)、<、<=、>、>=
模式匹配 LIKE
范圍篩選 BETWEEN
列表篩選 IN
空值測試 IS NULL
使用比較篩選行:
SELECT columns FROM table WHERE test_column op value;
test_column是表中的列的名稱,不是必須在columns中列出,op是一個比較操作符。
在SELECT語句中,將WHERE子句放在ORDER BY子句之前(在兩者都要出現的時候)。
空值表示未知,不和任何內容(甚至另一個空值)匹配。在比較中,包含空值的行將不在結果中。
比較的左邊項和右邊項都可以是表達式。普通的表達形式為:
expr1 op expr2
如果在SELECT子句中給列定義了別名,不能在WHERE子句中引用它,因為WHERE子句是在SELECT子句之前計算的。
從表中選擇特定行的操作,稱為限制。
6.使用AND、OR和NOT組合及求反條件
可以在單個的WHERE子句中定義多個條件,也就是說,可以基於在多個列中的值檢索行。
AND、OR和NOT是邏輯操作符,使用它們可以構造復合條件。
SQL使用三值邏輯(three-value logic,3VL),在三值邏輯中,邏輯表達式的結果是true、false和unknown。
如果復合條件的結果是false或unknown,行將被排斥在結果之外。
當復合條件表達式中使用多個邏輯操作符時,使用優先規則確定哪一個操作符先運算,NOT是最先計算的,然后是AND,最后才是OR。可以使用圓括號改變這個順序:圓括號內的先運算。
注意AND和OR的計算遵循短路原則,所以如果將為真可能性相對較小的條件放在AND操作符的左邊和OR操作符的右邊(為真可能性大的放在OR的左邊),查詢將會變快。
如果條件有相同的可能性,首先放置復雜度最小的表達式。
7.使用LIKE匹配模式
可以使用LIKE依據部分信息檢索行。
如果不知道精確值或者想用類似值檢索行,那么可以使用LIKE。
LIKE條件的主要特點如下:
LIKE只對字符串起作用,對數字或日期不起作用。
LIKE使用匹配對照值的模式。模式是被引起來的包含要匹配的字面量的字符串及通配符的結合。
通配符是用於匹配部分值的特殊字符:
百分號%匹配零個或多個字符串;
下划線_匹配任意一個字符。
通過匹配模式篩選行:
SELECT columns FROM table WHERE test_column [NOT] LIKE ‘pattern’;
test_column是table中的列名(不是必須在columns中列出),pattern是和test_column中的值相比較的模式。
NOT LIKE檢索不匹配pattern的行。
匹配轉義符
使用關鍵字ESCAPE可以定義轉義符。緊挨在通配符之前的轉義符出除去了通配符的特殊含義。
例如,如果定義!為轉義符,那么!%可以被用來查找%。
SELECT columns FROM table WHERE test_column [NOT] LIKE ‘pattern’ ESCAPE ‘escape_char’;
escape_char是單個字符,在pattern中跟在escape_char之后的單個字符將被解釋為字面量,escape_char本身不是查找模式的一部分。
test_column可以是一個表達式。
在模式不包含通配符的情況下,LIKE和=一樣,NOT LIKE和<>一樣。
但是,對於LIKE考慮尾部的空格,而=不考慮。如果這點不重要,=比LIKE要快。
SQL標准對於正則表達式的匹配使用SIMILAR操作符。
8.使用BETWEEN進行范圍篩選
使用BETWEEN確定給定值是否落在特定的范圍之內。
BETWEEN條件的主要特點如下:
BETWEEN條件適用於字符串、數字和日期。
BETWEEN范圍包含用AND分隔的低端值和高端值,低端值必須小於或等於高端值。它可以用AND改寫。
要指定不包含端點的排他范圍,使用>和<比較。
可以用NOT BETWEEN否定BETWEEN條件。
可以用AND和OR將BETWEEN條件和其他條件組合。
使用范圍篩選行:
SELECT columns FROM table WHERE test_column [NOT] BETWEEN low_value AND high_value;
test_column是表中的列名(不是必須在columns中列出),test_column也可以是表達式。
9.使用IN進行列表篩選
用IN確定給定值是否匹配指定列表中的值。
IN可以處理字符串、數字、日期等。
IN列表是由一個或多個逗號分隔、加上括號的值的列表。這個列表的項不需要特定的順序。
IN可以用OR改寫。
可以用AND和OR將IN條件和其他條件組合。
使用列表篩選行:
SELECT columns FROM table WHERE test_column [NOT] IN (value1, value2,…);
test_column是表中的列名(不是必須在columns中列出),test_column也可以是表達式。
value1, value2是和test_column中的值比較的,一個或多個逗號分隔的值。
為了加快速度,應首先列出最可能出現的值。
10.使用IS NULL測試空值
空值表示缺失或者未知的值。
這種情況引發一個問題:因為未知的值不能滿足特定條件,所以LIKE、BETWEEN、IN和其他的WHERE子句條件不能發現空值。
空值不與其他值匹配——即使是其他空值。
不能使用=或<>去測試一個值是否為空值。
SQL提供了IS NULL來確定給定值是否為空值。
IS NULL條件的主要特點如下:
IS NULL可以應用於任意數據類型的列。
可以用IS NOT NULL否定IS NULL。
可以用AND和OR將IS NULL條件和其他條件組合。
使用空值或非空值檢索行:
SELECT columns FROM table WHERE test_column IS [NOT] NULL;
test_column是表中的列名(不是必須在columns中列出),test_column也可以是表達式。
參考資料
《SQL基礎教程(第3版)》第四章
