SQL SELECT 語句基礎


學習重點

  • 使用 SELECT 語句從表中選取數據。

  • 為列設定顯示用的別名。

  • SELECT 語句中可以使用常數或者表達式。

  • 通過指定 DISTINCT 可以刪除重復的行。

  • SQL 語句中可以使用注釋。

  • 可以通過 WHERE 語句從表中選取出符合查詢條件的數據。

一、列的查詢

從表中選取數據時需要使用 SELECT 語句,也就是只從表中選出(SELECT)必要數據的意思。通過 SELECT 語句查詢並選取出必要數據的過程稱為匹配查詢查詢(query)。

KEYWORD

  • SELECT 語句

  • 匹配查詢

  • 查詢

SELECT 語句是 SQL 語句中使用最多的最基本的 SQL 語句。掌握了 SELECT 語句,距離掌握 SQL 語句就不遠了。

SELECT 語句的基本語法如下所示。

語法 1 基本的 SELECT 語句

SELECT <列名>,……
 FROM <表名>;

SELECT 語句包含了 SELECTFROM 兩個子句(clause)。子句是 SQL 語句的組成要素,是以 SELECT 或者 FROM 等作為起始的短語。

KEYWORD

  • 子句

SELECT 子句中列舉了希望從表中查詢出的列的名稱,而 FROM 子句則指定了選取出數據的表的名稱。

接下來,我們嘗試從 表的創建 中創建出的 Product(商品)表中,查詢出圖 1 所示的 product_id(商品編號)列、product_name(商品名稱)列和 purchase_price(進貨單價)列。

查詢出 Product 表中的列

圖 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(進貨單價)列使用 DISTINCTSELECT 語句請參見代碼清單 8。除了兩條 2800 的數據外,兩條 NULL 的數據也被合並為一條。

代碼清單 8 對含有 NULL 數據的列使用 DISTINCT 關鍵字

SELECT DISTINCT purchase_price
  FROM Product;

執行結果

對含有 NULL 數據的列使用 DISTINCT 關鍵字

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 語句中用來標識說明或者注意事項的部分。

分為單行注釋和多行注釋兩種。

請參閱

(完)


  1. 結果的顯示方式根據 RDBMS 的客戶端的不同略有不同(數據的內容都是相同的)。如無特殊說明,本教程中顯示的都是 PostgreSQL 9.5 的執行結果。 ↩︎

  2. 行的順序也可能存在與上述執行結果不同的情況。如果用戶不設定 SELECT 語句執行結果中行的順序,就可能會發生上述情況。行的排序方法將在 對查詢結果進行排序 中進行學習。 ↩︎

  3. 使用雙引號可以設定包含空格(空白)的別名。但是如果忘記使用雙引號就可能出錯,因此並不推薦。大家可以像 product_list 這樣使用下划線(_)來代替空白。 ↩︎

  4. 在 SQL 語句中使用字符串或者日期常數時,必須使用單引號 (') 將其括起來。 ↩︎

  5. 這和 Excel 中根據過濾條件對行進行過濾的功能是相同的。 ↩︎

  6. MySQL 中需要在“--”之后加入半角空格(如果不加的話就不會被認為是注釋)。 ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM