學習重點
使用
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 中需要在“
--
”之后加入半角空格(如果不加的話就不會被認為是注釋)。 ↩︎