SQL Select語句


在本教學中,您將學習如何使用SQL SELECT語句從單個表中查詢資料。

1. SQL SELECT語句簡介

要查詢表中的資料,請使用SQL SELECT語句。 SELECT語句包含用於選擇列,選擇行分組資料連線表以及執行簡單計算的語法。

SELECT語句是SQL中最複雜的命令之一,因此,在本教學中,我們將僅介紹基礎知識。

下面說明了從單個表中檢索資料的SELECT語句的基本語法。

SELECT 
    column1, column2, column3, ...
FROM
    table_name;

在此語法中,指定查詢SELECT子句中的資料是使用逗號分隔列的列表,並在FROM子句中指定表名。 在評估SELECT語句時,資料庫系統首先計算FROM子句,然後再計算SELECT子句。

分號(;)不是查詢的一部分。 通常,資料庫系統使用分號分隔兩個SQL查詢。 有關更多資訊,請檢視SQL語法。

如果要查詢表的所有列中的資料,可以使用星號(*)運算子而不是列列表,如下所示。

SELECT 
    *
FROM
    table_name;

請注意,SQL不區分大小寫。所以資料庫系統處理SELECTselect都是相同操作。 但是,為了使SQL語句更具可讀性,我們將使用SQL關鍵字的大寫字母(如SELECTFROM)和小寫字母(如表名和列名)等識別符號。

除了SELECTFROM子句之外,SELECT語句還可以包含許多其他子句,例如 -

  • WHERE - 用於根據指定條件過濾資料
  • ORDER BY - 用於對結果集進行排序
  • LIMIT - 用於限制返回的行
  • JOIN - 用於查詢來自多個相關表的資料
  • GROUP BY - 用於根據一列或多列對資料進行分組
  • HAVING - 用於過濾分組

您將在後續教學中瞭解這些子句的使用。

2. SQL SELECT語句範例

我們將使用範例資料庫中的employees表進行演示。

3. SQL SELECT - 查詢所有列範例

要查詢表中的所有列,請使用星號(*)而不是指定每列。 例如,以下語句從employees表中檢索所有資料:

SELECT 
    *
FROM
    employees;

執行上面範例程式碼,得到以下結果 -

+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
| employee_id | first_name | last_name | email                     | phone_number   | hire_date  | job_id | salary | manager_id | department_id |
+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
|         100 | Steven     | Lee       | [email protected]     | 0532-86011111  | 1987-06-17 |      4 | 24000  | NULL       |             9 |
|         101 | Neena      | Wong      | [email protected]      | 0551-4243311   | 1989-09-21 |      5 | 17000  |        100 |             9 |
|         102 | Lex        | Liang     | [email protected]       | 0571-87622362  | 1993-01-13 |      5 | 17000  |        100 |             9 |
|         103 | Alexander  | Lee       | [email protected]   | 020-95105105   | 1990-01-03 |      9 | 9000   |        102 |             6 |
... ...
|         201 | Michael    | Zhou      | [email protected]   | 010-67237328   | 1996-02-17 |     10 | 13000  |        100 |             2 |
|         202 | Pat        | Zhou      | [email protected]       | 0755-28114518  | 1997-08-17 |     11 | 6000   |        201 |             2 |
|         203 | Susan      | Zhou      | [email protected]     | 0755-83587526  | 1994-06-07 |      8 | 6500   |        101 |             4 |
|         204 | Hermann    | Wu        | [email protected]     | 0513-83512816  | 1994-06-07 |     12 | 10000  |        101 |             7 |
|         205 | Shelley    | Wu        | [email protected]     | 0898-31686222  | 1994-06-07 |      2 | 12000  |        101 |            11 |
|         206 | William    | Wu        | [email protected]     | 022-26144822   | 1994-06-07 |      1 | 8300   |        205 |            11 |
+-------------+------------+-----------+---------------------------+----------------+------------+--------+--------+------------+---------------+
40 rows in set

使用星號(*)運算子只能方便地通過SQL用戶端應用程式以互動方式查詢資料。 但是,如果在應用程式的嵌入語句中使用星號(*)運算子,則可能存在一些潛在問題。

首先,因為表的結構將發展以適應新的業務需求,例如,可以新增新列並刪除現有列。 如果使用星號(*)運算子並且未更改應用程式程式碼以使其與新表結構一起使用,則應用程式可能無法正常執行。

星號(*)運算子的另一個問題是它可能會增加資料庫伺服器和應用程式之間傳輸的不必要資料,因為應用程式可能只需要表的部分資料。

4. SQL SELECT - 查詢特定列

SELECT語句用於準確指定要以任何順序檢索資料的列,它不必按表中定義的順序排列。

例如,如果想要檢視所有員工的員工ID,名字,姓氏和雇用日期,則使用以下查詢:

SELECT 
    employee_id, 
    first_name, 
    last_name, 
    hire_date
FROM
    employees;

請注意,結果集僅包含SELECT子句中指定的四列。如下所示 -

+-------------+------------+-----------+------------+
| employee_id | first_name | last_name | hire_date  |
+-------------+------------+-----------+------------+
|         100 | Steven     | Lee       | 1987-06-17 |
|         101 | Neena      | Wong      | 1989-09-21 |
|         102 | Lex        | Liang     | 1993-01-13 |
|         103 | Alexander  | Lee       | 1990-01-03 |
... ...
|         202 | Pat        | Zhou      | 1997-08-17 |
|         203 | Susan      | Zhou      | 1994-06-07 |
|         204 | Hermann    | Wu        | 1994-06-07 |
|         205 | Shelley    | Wu        | 1994-06-07 |
|         206 | William    | Wu        | 1994-06-07 |
+-------------+------------+-----------+------------+
40 rows in set

5. SQL SELECT - 執行簡單的計算

如前所述,SELECT語句用於執行簡單的計算。 例如,以下查詢使用FLOOR()DATEDIFF()CURRENT_DATE函式計算員工的服務年份。要計算服務年份,將DATEDIFF()函式的結果除以365FLOOR()函式返回小於或等於數值表示式結果的最大整數。YoS是下面表示式的列別名,用於在返回的結果集中顯示使用者友好的標題。

FLOOR(DATEDIFF(NOW(), hire_date) / 365)

完整的寫法如下所示 -

SELECT 
    employee_id,
    first_name,
    last_name,
    FLOOR(DATEDIFF(NOW(), hire_date) / 365) AS YoS
FROM
    employees;

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+-----+
| employee_id | first_name | last_name | YoS |
+-------------+------------+-----------+-----+
|         100 | Steven     | Lee       |  31 |
|         101 | Neena      | Wong      |  29 |
|         102 | Lex        | Liang     |  26 |
|         103 | Alexander  | Lee       |  29 |
|         104 | Bruce      | Wong      |  27 |
|         105 | David      | Liang     |  21 |
|         106 | Valli      | Chen      |  20 |
|         107 | Diana      | Chen      |  19 |
|         108 | Nancy      | Chen      |  24 |
... ...
|         203 | Susan      | Zhou      |  24 |
|         204 | Hermann    | Wu        |  24 |
|         205 | Shelley    | Wu        |  24 |
|         206 | William    | Wu        |  24 |
+-------------+------------+-----------+-----+
40 rows in set

此查詢適用於MySQL。 如果使用SQL Server,則可以使用以下查詢:

SELECT 
    employee_id,
    first_name,
    last_name,
    DATEDIFF(year, hire_date,CURRENT_TIMESTAMP)
FROM
    employees;

通過上面範例和學習,您應該知道如何使用SQL SELECT語句從單個表中查詢資料。