SQL教學
SQL RDBMS概念
SQL簡介
SQL NOT NULL約束
SQL DEFAULT約束
SQL唯一約束
SQL主鍵
SQL外鍵
SQL CHECK約束
SQL示例數據庫
SQL索引約束
SQL NULL值
數據庫 - 第一範式(1NF)
數據庫 - 第二範式(2NF)
數據庫 - 第三範式(3NF)
SQL RDBMS數據庫
SQL語法
SQL數據類型
SQL操運算符
SQL算術運算符
SQL比較運算符
SQL邏輯運算符
SQL表達式
SQL創建數據庫(CREATE DATABASE)
SQL丟棄或刪除數據庫(DROP DATABASE)
SQL選擇數據庫(SELECT Database, USE語句)
SQL創建表(CREATE Table)
SQL從現有表創建表
SQL刪除表(DROP或DELETE Table)
SQL INSERT INTO插入查詢
SQL SELECT查詢語句
SQL WHERE子句
SQL AND和OR運算符
SQL UPDATE更新查詢
SQL DELETE刪除查詢
SQL LIKE子句
SQL TOP,LIMIT,ROWNUM子句
SQL ORDER BY排序子句
SQL GROUP BY(分組)
SQL Distinct關鍵字
SQL排序結果
SQL約束
SQL Join聯接
SQL INNER JOIN(內部連接)
SQL LEFT JOIN(左連接)
SQL RIGHT JOIN(右連接)
SQL FULL JOIN(全連接)
SQL自連接
SQL笛卡爾或交叉連接
SQL UNION子句/操作符
SQL INTERSECT子句
SQL EXCEPT子句
SQL別名語法
SQL索引
SQL ALTER TABLE(修改表)
SQL TRUNCATE TABLE(截斷表)
SQL View(視圖)
SQL Having子句
SQL事務
SQL通配符運算符
SQL日期函數
SQL ADDDATE()函數
SQL ADDTIME()函數
SQL CONVERT_TZ()函數
SQL CURDATE()函數
SQL CURRENT_DATE()函數
SQL CURTIME()函數
SQL CURRENT_TIME()函數
SQL CURRENT_TIMESTAMP()方法
SQL DATE(expr)函數
SQL DATEDIFF()方法
SQL DATE_ADD()和DATE_SUB()方法
SQL DATE_FORMAT()函數
SQL DATE_SUB()方法
SQL DAY()函數
SQL DAYNAME()函數
SQL DAYOFMONTH()函數
SQL DAYOFWEEK()函數
SQL DAYOFYEAR()函數
SQL EXTRACT()函數
SQL FROM_DAYS()函數
SQL FROM_UNIXTIME()函數
SQL HOUR()方法
SQL LAST_DAY()函數
SQL LOCALTIME和LOCALTIME()函數
SQL LOCALTIMESTAMP和LOCALTIMESTAMP()函數
SQL MAKEDATE()函數
SQL MAKETIME()函數
SQL MICROSECOND()函數
SQL MINUTE()函數
SQL MONTH()函數
SQL MONTHNAME()函數
SQL NOW()函數
SQL PERIOD_ADD()函數
SQL PERIOD_DIFF()函數
SQL QUARTER()函數
SQL SECOND()函數
SQL SEC_TO_TIME()函數
SQL STR_TO_DATE()函數
SQL SUBDATE()函數
SQL SUBTIME()函數
SQL SYSDATE()函數
SQL TIME()函數
SQL TIMEDIFF()函數
SQL TIMESTAMP()函數
SQL TIMESTAMPADD()函數
SQL TIMESTAMPDIFF()函數
SQL TIME_FORMAT()函數
SQL TIME_TO_SEC()函數
SQL TO_DAYS()函數
SQL UNIX_TIMESTAMP()函數
SQL UTC_DATE()函數
SQL UTC_TIME()函數
SQL UTC_TIMESTAMP()函數
SQL WEEK()函數
SQL WEEKDAY()函數
SQL WEEKOFYEAR()函數
SQL YEAR()函數
SQL YEARWEEK()函數
SQL臨時表
SQL克隆表
SQL子查詢
SQL使用序列(自動遞增)
SQL DISTINCT重複處理
SQL注入
SQL實用函數
SQL MAX()函數
SQL MIN()函數
SQL AVG()函數
SQL SUM()函數
SQL SQRT()函數
SQL RAND()函數
SQL CONCAT()函數
SQL數值函數
SQL ABS()函數
SQL ACOS()函數
SQL ASIN(X)函數
SQL ATAN(X)函數
SQL ATAN2()函數
SQL BIT_AND()函數
SQL BIT_COUNT()函數
SQL BIT_OR()函數
SQL CEIL()函數
SQL CONV()函數
SQL COS()函數
SQL COT()函數
SQL DEGREES()函數
SQL EXP(X)函數
SQL FLOOR(X)函數
SQL FORMAT(X,D)函數
SQL GREATEST()函數
SQL INTERVAL()函數
SQL LEAST()函數
SQL LOG()函數
SQL LOG10(X)函數
SQL MOD()函數
SQL OCT(N)函數
SQL PI()函數
SQL POW()函數
SQL RADIANS()函數
SQL ROUND()函數
SQL SIGN(X)函數
SQL SIN(X)函數
SQL SQRT(X)函數
SQL STD()函數
SQL TAN(X)函數
SQL TRUNCATE()函數
SQL字符串函數
SQL ASCII(str)函數
SQL BIN(N)函數
SQL BIT_LENGTH()函數
SQL CHAR()函數
SQL CHAR_LENGTH()函數
SQL CHARACTER_LENGTH()函數
SQL字符串CONCAT()函數
SQL CONCAT_WS()函數
SQL CONV(N,from_base,to_base)函數
SQL ELT()函數
SQL EXPORT_SET()函數
SQL FIELD()函數
SQL FIND_IN_SET()函數
SQL FORMAT()函數
SQL HEX()函數
SQL INSERT()函數
SQL INSTR()函數
SQL LCASE()函數
SQL LEFT()函數
SQL LENGTH()函數
SQL LOAD_FILE()函數
SQL LOCATE()函數
SQL LOWER()函數
SQL LPAD()函數
SQL LTRIM()函數
SQL MAKE_SET()函數
SQL MID()函數
SQL OCT()函數
SQL OCTET_LENGTH()函數
SQL ORD()函數
SQL POSITION()函數
SQL QUOTE()函數
SQL REGEXP模式
SQL REPEAT()函數
SQL REPLACE()函數
SQL REVERSE()函數
SQL RIGHT()函數
SQL RPAD()函數
SQL SOUNDEX()函數
SQL SPACE()函數
SQL STRCMP()函數
SQL SUBSTRING()函數
SQL SUBSTRING_INDEX()函數
SQL TRIM()函數
SQL UCASE()函數
SQL UNHEX()函數
SQL UPPER()函數

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語句外,還可以在UPDATE或DELETE語句中使用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;

執行上面示例代碼,得到以下結果 -

SQL

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

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

執行上面示例代碼,得到以下結果 -
SQL

帶有字符示例的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;

執行上面示例代碼,得到以下結果 -

SQL

如果想查詢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

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