目錄
- 一、列的查詢
- 二、查詢出表中所有的列
- 三、為列設定別名
- 四、常數的查詢
- 五、從結果中洗掉重復行
- 六、根據 WHERE 陳述句來選擇記錄
- 七、注釋的書寫方法
- 請參閱
學習重點
使用
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 陳述句中用來標識說明或者注意事項的部分,
分為單行注釋和多行注釋兩種,
請參閱
- SELECT 陳述句基礎
- 算術運算子和比較運算子
- 邏輯運算子
(完)
結果的顯示方式根據 RDBMS 的客戶端的不同略有不同(資料的內容都是相同的),如無特殊說明,本教程中顯示的都是 PostgreSQL 9.5 的執行結果, ??
行的順序也可能存在與上述執行結果不同的情況,如果用戶不設定
SELECT陳述句執行結果中行的順序,就可能會發生上述情況,行的排序方法將在 對查詢結果進行排序 中進行學習, ??使用雙引號可以設定包含空格(空白)的別名,但是如果忘記使用雙引號就可能出錯,因此并不推薦,大家可以像
product_list這樣使用下劃線(_)來代替空白, ??在 SQL 陳述句中使用字串或者日期常數時,必須使用單引號 (
') 將其括起來, ??這和
Excel中根據過濾條件對行進行過濾的功能是相同的, ??MySQL 中需要在“
--”之后加入半角空格(如果不加的話就不會被認為是注釋), ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/344520.html
標籤:其他
上一篇:SQL SELECT 陳述句基礎
下一篇:為什么在redux中狀態未定義
