SQL Where子句


在本教學中,您將學習如何使用SQL WHERE子句根據指定的條件篩選表中的行記錄。

1. SQL WHERE子句簡介

要從表中選擇某些行,請在SELECT語句中使用WHERE子句。 以下說明了SELECT語句中WHERE子句的語法:

SELECT 
    column1, column2, ...
FROM
    table
WHERE
    condition;

WHERE子句緊跟在FROM子句之後出現。 WHERE子句包含一個或多個邏輯表示式,用於計算表中的每一行。 如果條件計算為true,則滿足條件的行記錄將包含在結果集中; 否則,它將被排除在外。

請注意,SQL具有三值邏輯,即TRUEFALSEUNKNOWN。 這意味著如果某行導致條件計算為FALSENULL,則不會返回該行。

請注意,WHERE子句後面的邏輯表示式也稱為謂詞。 可以使用各種運算子來形成WHERE子句中使用的行選擇條件。

下表顯示了SQL比較運算子

編號 運算子 含義
1 = 等於
2 <>!= 不等於
3 < 小於
4 > 大於
5 <= 小於或等於
6 >= 大於或等於

要形成一個簡單的表示式,可以使用上面的一個運算子和兩個運算元,這兩個運算元可以是一側的列名,另一側是文字值,例如:

salary > 1000

表示:「工資是否大於1000?」。或者可以在運算子的兩側使用列名稱,例如:

min_salary < max_salary

這個表示式提出了另一個問題:「最低工資是否低於最高薪水?」。
在表示式中使用的文字值可以是數位,字元,日期和時間,具體取決於使用的格式:

  • 數位:使用可以是整數或小數的數位而不使用任何格式,例如:100,200.5
  • 字元:使用由單引號或雙引號括起的字元,例如:'100''John Dan'
  • 日期:使用資料庫儲存的格式。 它取決於資料庫系統,例如,MySQL使用'yyyy-mm-dd'格式來儲存日期資料。
  • 時間:使用資料庫系統用於儲存時間的格式。 例如,MySQL使用'HH:MM:SS'來儲存時間資料。

SELECT語句外,還可以在UPDATEDELETE語句中使用WHERE子句指定要更新或刪除的行。

2. SQL WHERE範例

我們將使用employees表來演示如何使用WHERE子句從表中選擇資料。

mysql> desc employees;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| employee_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name    | varchar(20)  | YES  |     | NULL    |                |
| last_name     | varchar(25)  | NO   |     | NULL    |                |
| email         | varchar(100) | NO   |     | NULL    |                |
| phone_number  | varchar(20)  | YES  |     | NULL    |                |
| hire_date     | date         | NO   |     | NULL    |                |
| job_id        | int(11)      | NO   | MUL | NULL    |                |
| salary        | decimal(8,2) | NO   |     | NULL    |                |
| manager_id    | int(11)      | YES  | MUL | NULL    |                |
| department_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set

帶有數位比較範例的SQL WHERE子句

以下查詢查詢薪水大於14000的員工,並根據薪水按降序對結果集進行排序。

SELECT
    employee_id, first_name, last_name, salary
FROM
    employees
WHERE
    salary > 14000
ORDER BY
    salary DESC;

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

以下查詢查詢在部門ID為5中工作的所有員工。

SELECT
    employee_id, first_name, last_name, department_id
FROM
    employees
WHERE
    department_id = 5
ORDER BY
    first_name;

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

帶有字元範例的SQL WHERE子句

SQL不區分大小寫。 但是,當涉及比較中的值時,它區分大小寫。 例如,以下查詢查詢姓氏(last_name)為Zhang的員工。

SELECT
    employee_id, first_name, last_name
FROM
    employees
WHERE
    last_name = 'Zhang';

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

mysql> SELECT
    employee_id, first_name, last_name
FROM
    employees
WHERE
    last_name = 'Zhang';
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         116 | Shelli     | Zhang     |
|         117 | Sigal      | Zhang     |
|         118 | Guy        | Zhang     |
|         119 | Karen      | Zhang     |
+-------------+------------+-----------+
4 rows in set

但是,如果查詢值是:ZHangzhang,則不會返回任何行記錄。

帶有日期範例的SQL WHERE子句

要獲得1999年1月1日之後加入公司的所有員工,請使用以下查詢:

SELECT
    employee_id, first_name, last_name, hire_date
FROM
    employees
WHERE
    hire_date >= '1999-01-01'
ORDER BY
    hire_date DESC;

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

如果想查詢1999年加入公司的員工,可以通過以下幾種方式實現:

  • 使用YEAR函式從hire_date列獲取年份資料,並使用等於(=)運算子來形成表示式。
  • 使用AND運算子使用兩個表示式。
  • 使用BETWEEN運算子。

以下語句說明了如何使用第一種方式:

SELECT
    employee_id, first_name, last_name, hire_date
FROM
    employees
WHERE
    YEAR (hire_date) = 1999
ORDER BY
    hire_date DESC;

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

在本教學中,我們向您展示了如何使用SQL WHERE子句根據指定的條件過濾資料。