學習重點
使用
SELECT語句從表中選取數據。為列設定顯示用的別名。
SELECT語句中可以使用常數或者表達式。通過指定
DISTINCT可以刪除重復的行。SQL 語句中可以使用注釋。
可以通過
WHERE語句從表中選取出符合查詢條件的數據。
一、列的查詢
從表中選取數據時需要使用 SELECT 語句,也就是只從表中選出(SELECT)必要數據的意思。通過 SELECT 語句查詢並選取出必要數據的過程稱為匹配查詢或查詢(query)。
KEYWORD
SELECT語句匹配查詢
查詢
SELECT 語句是 SQL 語句中使用最多的最基本的 SQL 語句。掌握了 SELECT 語句,距離掌握 SQL 語句就不遠了。
SELECT 語句的基本語法如下所示。
語法 1 基本的 SELECT 語句
SELECT <列名>,……
FROM <表名>;
該 SELECT 語句包含了 SELECT 和 FROM 兩個子句(clause)。子句是 SQL 語句的組成要素,是以 SELECT 或者 FROM 等作為起始的短語。
KEYWORD
- 子句
SELECT 子句中列舉了希望從表中查詢出的列的名稱,而 FROM 子句則指定了選取出數據的表的名稱。
接下來,我們嘗試從 表的創建 中創建出的 Product(商品)表中,查詢出圖 1 所示的 product_id(商品編號)列、product_name(商品名稱)列和 purchase_price(進貨單價)列。
圖 1 查詢出 Product 表中的列
對應的 SELECT 語句請參見代碼清單 1,該語句正常執行的結果如執行結果所示 [1]。
代碼清單 1 從 Product 表中輸出 3 列
SELECT product_id, product_name, purchase_price
FROM Product;
執行結果
product_id | product_name | purchase_price
-----------+--------------+---------------
0001 | T恤衫 | 500
0002 | 打孔器 | 320
0003 | 運動T恤 | 2800
0004 | 菜刀 | 2800
0005 | 高壓鍋 | 5000
0006 | 叉子 |
0007 | 擦菜板 | 790
0008 | 圓珠筆 |
SELECT 語句第一行的 SELECT product_id, product_name, purchase_price 就是 SELECT 子句。查詢出的列的順序可以任意指定。查詢多列時,需要使用逗號進行分隔。查詢結果中列的順序和 SELECT 子句中的順序相同 [2]。
二、查詢出表中所有的列
想要查詢出全部列時,可以使用代表所有列的星號(*)。
KEYWORD
- 星號(
*)
語法 2 查詢全部的列
SELECT *
FROM <表名>;
例如,查詢 Product 表中全部列的語句如代碼清單 2 所示。
代碼清單 2 輸出 Product 表中全部的列
SELECT *
FROM Product;
得到的結果和代碼清單 3 中的 SELECT 語句的結果相同。
代碼清單 3 與代碼清單 2 具有相同含義的 SELECT 語句
SELECT product_id, product_name, product_type, sale_price,
purchase_price, regist_date
FROM Product;
執行結果如下所示。
執行結果
product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+------------
0001 | T恤衫 | 衣服 | 1000 | 500 | 2009-09-20
0002 | 打孔器 | 辦公用品 | 500 | 320 | 2009-09-11
0003 | 運動T恤 | 衣服 | 4000 | 2800 |
0004 | 菜刀 | 廚房用具 | 3000 | 2800 | 2009-09-20
0005 | 高壓鍋 | 廚房用具 | 6800 | 5000 | 2009-01-15
0006 | 叉子 | 廚房用具 | 500 | | 2009-09-20
0007 | 擦菜板 | 廚房用具 | 880 | 790 | 2008-04-28
0008 | 圓珠筆 | 辦公用品 | 100 | | 2009-11-11
法則 1
星號(
*)代表全部列的意思。
但是,如果使用星號的話,就無法設定列的顯示順序了。這時就會按照 CREATE TABLE 語句的定義對列進行排序。
專欄
隨意使用換行符
SQL 語句使用換行符或者半角空格來分隔單詞,在任何位置進行分隔都可以,即使像下面這樣通篇都是換行符也不會影響
SELECT語句的執行。但是這樣可能會由於看不清楚而出錯。原則上希望大家能夠以子句為單位進行換行(子句過長時,為方便起見可以換行)。SELECT * FROM Product ;另外,像下面這樣插入空行(無任何字符的行)會造成執行錯誤,請特別注意。
SELECT * FROM Product;
三、為列設定別名
SQL 語句可以使用 AS 關鍵字為列設定別名。請參見代碼清單 4。
KEYWORD
AS關鍵字別名
代碼清單 4 為列設定別名
SELECT product_id AS id,
product_name AS name,
purchase_price AS price
FROM Product;
執行結果
id | name | price
------+---------+-------
0001 | T恤衫 | 500
0002 | 打孔器 | 320
0003 | 運動T恤 | 2800
0004 | 菜刀 | 2800
0005 | 高壓鍋 | 5000
0006 | 叉子 |
0007 | 擦菜板 | 790
0008 | 圓珠筆 |
別名可以使用中文,使用中文時需要用 雙引號(") 括起來 [3]。請注意不是單引號(')。設定中文別名的 SELECT 語句請參見代碼清單 5。
KEYWORD
- 雙引號(
")
代碼清單 5 設定中文別名
SELECT product_id AS "商品編號",
product_name AS "商品名稱",
purchase_price AS "進貨單價"
FROM Product;
執行結果
商品編號 | 商品名稱 | 進貨單價
----------+----------+---------
0001 | T恤衫 | 500
0002 | 打孔器 | 320
0003 | 運動T恤 | 2800
0004 | 菜刀 | 2800
0005 | 高壓鍋 | 5000
0006 | 叉子 |
0007 | 擦菜板 | 790
0008 | 圓珠筆 |
通過執行結果來理解就更加容易了。像這樣使用別名可以讓 SELECT 語句的執行結果更加容易理解和操作。
法則 2
設定漢語別名時需要使用雙引號(
")括起來。
四、常數的查詢
SELECT 子句中不僅可以書寫列名,還可以書寫常數。代碼清單 6 中的 SELECT 子句中的第一列 '商品' 是字符串常數,第 2 列 38 是數字常數,第 3 列 '2009-02-24' 是日期常數,它們將與 product_id 列和 product_name 列一起被查詢出來。[4]
KEYWORD
字符串常數
數字常數
日期常數
代碼清單 6 查詢常數
SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
product_id, product_name
FROM Product;
執行結果
string | number | date | product_id | product_name
---------+----------+-------------+------------+--------------
商品 | 38 | 2009-02-24 | 0001 | T恤衫
商品 | 38 | 2009-02-24 | 0002 | 打孔器
商品 | 38 | 2009-02-24 | 0003 | 運動T恤
商品 | 38 | 2009-02-24 | 0004 | 菜刀
商品 | 38 | 2009-02-24 | 0005 | 高壓鍋
商品 | 38 | 2009-02-24 | 0006 | 叉子
商品 | 38 | 2009-02-24 | 0007 | 擦菜板
商品 | 38 | 2009-02-24 | 0008 | 圓珠筆
如上述執行結果所示,所有的行中都顯示出了 SELECT 子句中的常數。
此外,SELECT 子句中除了書寫常數,還可以書寫計算式。我們將在 [算術運算符和比較運算符]({{<ref "602-02-02-算術運算符和比較運算符.md"="">}}) 中學習如何書寫計算式。
五、從結果中刪除重復行
想知道 Product 表中保存了哪些商品種類(product_type)時,如果能像圖 2 那樣刪除重復的數據該有多好啊。
圖 2 除去重復數據后的商品種類
如上所示,想要刪除重復行時,可以通過在 SELECT 子句中使用 DISTINCT 來實現(代碼清單 7)。
KEYWORD
DISTINCT關鍵字
代碼清單 7 使用 DISTINCT 刪除 product_type 列中重復的數據
SELECT DISTINCT product_type
FROM Product;
執行結果
product_type
---------------
廚房用具
衣服
辦公用品
法則 3
在
SELECT語句中使用DISTINCT可以刪除重復行。
在使用 DISTINCT 時,NULL 也被視為一類數據。NULL 存在於多行中時,也會被合並為一條 NULL 數據。對含有 NULL 數據的 purchase_price(進貨單價)列使用 DISTINCT 的 SELECT 語句請參見代碼清單 8。除了兩條 2800 的數據外,兩條 NULL 的數據也被合並為一條。
代碼清單 8 對含有 NULL 數據的列使用 DISTINCT 關鍵字
SELECT DISTINCT purchase_price
FROM Product;
執行結果

DISTINCT 也可以像代碼清單 9 那樣在多列之前使用。此時,會將多個列的數據進行組合,將重復的數據合並為一條。代碼清單 9 中的 SELECT 語句,對 product_type(商品種類)列和 regist_date(登記日期)列的數據進行組合,將重復的數據合並為一條。
代碼清單 9 在多列之前使用 DISTINCT
SELECT DISTINCT product_type, regist_date
FROM Product;
執行結果
product_type | regist_date
--------------+------------
衣服 | 2009-09-20
辦公用品 | 2009-09-11
辦公用品 | 2009-11-11
衣服 |
廚房用具 | 2009-09-20
廚房用具 | 2009-01-15
廚房用具 | 2008-04-28
如上述執行結果所示,product_type 列為 '廚房用具',同時 regist_date 列為 '2009-09-20' 的兩條數據被合並成了一條。
DISTINCT 關鍵字只能用在第一個列名之前。因此,請大家注意不能寫成 regist_date, DISTINCT product_type。
六、根據 WHERE 語句來選擇記錄
前面的例子都是將表中存儲的數據全都選取出來,但實際上並不是每次都需要選取出全部數據,大部分情況都是要選取出滿足“商品種類為衣服”“銷售單價在 1000 日元以上”等某些條件的數據。
SELECT 語句通過 WHERE 子句來指定查詢數據的條件。在 WHERE 子句中可以指定“某一列的值和這個字符串相等”或者“某一列的值大於這個數字”等條件。執行含有這些條件的 SELECT 語句,就可以查詢出只符合該條件的記錄了。[5]
KEYWORD
WHERE子句
在 SELECT 語句中使用 WHERE 子句的語法如下所示。
語法 3 SELECT 語句中的 WHERE 子句
SELECT <列名>, ……
FROM <表名>
WHERE <條件表達式>;
圖 3 顯示了從 Product 表中選取商品種類(product_type)為 '衣服' 的記錄。
圖 3 選取商品種類為’衣服’的記錄
從被選取的記錄中還可以查詢出想要的列。為了更加容易理解,我們在查詢 product_type 列的同時,把 product_name 列也讀取出來。 SELECT 語句請參見代碼清單 10。
代碼清單 10 用來選取 product_type 列為 '衣服' 的記錄的 SELECT 語句
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';
執行結果
product_name | product_type
--------------+--------------
T恤衫 | 衣服
運動T恤 | 衣服
WHERE 子句中的“product_type = '衣服'”就是用來表示查詢條件的表達式(條件表達式)。等號是比較兩邊的內容是否相等的符號,上述條件就是將 product_type 列的值和 '衣服' 進行比較,判斷是否相等。Product 表的所有記錄都會被進行比較。
KEYWORD
- 條件表達式
接下來會從查詢出的記錄中選取出 SELECT 語句指定的 product_name 列和 product_type 列,如執行結果所示,也就是首先通過 WHERE 子句查詢出符合指定條件的記錄,然后再選取出 SELECT 語句指定的列(圖 4)。
圖 4 選取行之后,再輸出列
代碼清單 10 中的語句為了確認選取出的數據是否正確,通過 SELECT 子句把作為查詢條件的 product_type 列也選取出來了,其實這並不是必須的。如果只想知道商品名稱的話,可以像代碼清單 11 那樣只選取出 product_name 列。
代碼清單 11 也可以不選取出作為查詢條件的列
SELECT product_name
FROM Product
WHERE product_type = '衣服';
執行結果
product_name
---------------
T恤衫
運動T恤
SQL 中子句的書寫順序是固定的,不能隨意更改。WHERE 子句必須緊跟在 FROM 子句之后,書寫順序發生改變的話會造成執行錯誤(代碼清單 12)。
代碼清單 12 隨意改變子句的書寫順序會造成錯誤
SELECT product_name, product_type
WHERE product_type = '衣服'
FROM Product;
執行結果(PostgreSQL)
ERROR: "FROM"或者其前后有語法錯誤
第3行: FROM Product;
^
法則 4
WHERE子句要緊跟在FROM子句之后。
七、注釋的書寫方法
最后給大家介紹一下注釋的書寫方法。注釋是 SQL 語句中用來標識說明或者注意事項的部分。
KEYWORD
- 注釋
注釋對 SQL 的執行沒有任何影響。因此,無論是英文字母還是漢字都可以隨意使用。
注釋的書寫方法有如下兩種。
-
單行注釋
書寫在“
--”之后,只能寫在同一行。[6]KEYWORD
-
單行注釋
-
--
-
-
多行注釋
書寫在“
/*”和“*/”之間,可以跨多行。KEYWORD
-
多行注釋
-
/* -
*/
-
實際的示例請參見代碼清單 13 和代碼清單 14。
代碼清單 13 單行注釋的使用示例
-- 本 SELECT 語句會從結果中刪除重復行。
SELECT DISTINCT product_id, purchase_price
FROM Product;
代碼清單 14 多行注釋的使用示例
/* 本 SELECT 語句,
會從結果中刪除重復行。*/
SELECT DISTINCT product_id, purchase_price
FROM Product;
任何注釋都可以插在 SQL 語句中(代碼清單 15、代碼清單 16)。
代碼清單 15 在 SQL 語句中插入單行注釋
SELECT DISTINCT product_id, purchase_price
-- 本 SELECT 語句會從結果中刪除重復行。
FROM Product;
代碼清單 16 在SQL 語句中插入多行注釋
SELECT DISTINCT product_id, purchase_price
/* 本 SELECT 語句,
會從結果中刪除重復行。*/
FROM Product;
這些 SELECT 語句的執行結果與沒有使用注釋時完全一樣。注釋能夠幫助閱讀者更好地理解 SQL 語句,特別是在書寫復雜的 SQL 語句時,希望大家能夠盡量多加簡明易懂的注釋。注釋不僅可以寫在 SELECT 語句中,而且可以寫在任何 SQL 語句當中,寫多少都可以。
法則 5
注釋是 SQL 語句中用來標識說明或者注意事項的部分。
分為單行注釋和多行注釋兩種。
請參閱
(完)
結果的顯示方式根據 RDBMS 的客戶端的不同略有不同(數據的內容都是相同的)。如無特殊說明,本教程中顯示的都是 PostgreSQL 9.5 的執行結果。 ↩︎
行的順序也可能存在與上述執行結果不同的情況。如果用戶不設定
SELECT語句執行結果中行的順序,就可能會發生上述情況。行的排序方法將在 對查詢結果進行排序 中進行學習。 ↩︎使用雙引號可以設定包含空格(空白)的別名。但是如果忘記使用雙引號就可能出錯,因此並不推薦。大家可以像
product_list這樣使用下划線(_)來代替空白。 ↩︎在 SQL 語句中使用字符串或者日期常數時,必須使用單引號 (
') 將其括起來。 ↩︎這和
Excel中根據過濾條件對行進行過濾的功能是相同的。 ↩︎MySQL 中需要在“
--”之后加入半角空格(如果不加的話就不會被認為是注釋)。 ↩︎
