摘要:在本教程中,您将学习如何在SELECT
语句中使用 MySQL WHERE
子句来过滤结果集中的行。
MySQL WHERE
子句简介
WHERE
子句允许您为查询返回的行指定搜索条件。下面显示了WHERE
子句的语法:
SELECT
select_list
FROM
table_name
WHERE
search_condition;
Code language: SQL (Structured Query Language) (sql)
search_condition
是使用逻辑运算符AND
、 OR
和NOT
的一个或多个表达式的组合。
在 MySQL 中,谓词是一个布尔表达式,其计算结果为TRUE
、 FALSE
或UNKNOWN
。
SELECT
语句将包含结果集中满足search_condition
任何行。
除了SELECT
语句之外,您还可以在UPDATE
或DELETE
语句中使用WHERE
子句来指定要更新或删除的行。
当执行带有WHERE
子句的SELECT
语句时,MySQL 会计算FROM
子句之后、 SELECT
和ORDER BY
子句之前的WHERE
子句:
MySQL WHERE 子句示例
我们将使用示例数据库中的employees
表进行演示。

1) 使用带有等号运算符的 MySQL WHERE 子句示例
以下查询使用WHERE
子句查找职位为Sales Rep
的所有员工:
SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle = 'Sales Rep';
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+-----------+
| lastname | firstname | jobtitle |
+-----------+-----------+-----------+
| Jennings | Leslie | Sales Rep |
| Thompson | Leslie | Sales Rep |
| Firrelli | Julie | Sales Rep |
| Patterson | Steve | Sales Rep |
| Tseng | Foon Yue | Sales Rep |
| Vanauf | George | Sales Rep |
| Bondur | Loui | Sales Rep |
| Hernandez | Gerard | Sales Rep |
| Castillo | Pamela | Sales Rep |
| Bott | Larry | Sales Rep |
| Jones | Barry | Sales Rep |
| Fixter | Andy | Sales Rep |
| Marsh | Peter | Sales Rep |
| King | Tom | Sales Rep |
| Nishi | Mami | Sales Rep |
| Kato | Yoshimi | Sales Rep |
| Gerard | Martin | Sales Rep |
+-----------+-----------+-----------+
17 rows in set (0.00 sec)
Code language: plaintext (plaintext)
在此示例中, SELECT
语句检查employees
表的所有行,并仅选择jobTitle
列中的值为Sales Rep
的行。
2) 使用带有 AND 运算符的 MySQL WHERE 子句
以下示例使用WHERE
子句查找职位为Sales Rep
且办公室代码为 1 的员工:
SELECT
lastname,
firstname,
jobtitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' AND
officeCode = 1;
Code language: SQL (Structured Query Language) (sql)
+----------+-----------+-----------+------------+
| lastname | firstname | jobtitle | officeCode |
+----------+-----------+-----------+------------+
| Jennings | Leslie | Sales Rep | 1 |
| Thompson | Leslie | Sales Rep | 1 |
+----------+-----------+-----------+------------+
2 rows in set (0.00 sec)
Code language: plaintext (plaintext)
在此示例中, WHERE
子句中的表达式使用AND
运算符来组合两个条件:
jobtitle = 'Sales Rep' AND officeCode = 1;
Code language: SQL (Structured Query Language) (sql)
仅当两个表达式的计算结果均为TRUE
时, AND
运算符的计算结果才为TRUE
。因此,查询返回jobTitle
列中的值为Sales Rep
且officeCode
为 1 的行。
3) 使用带有 OR 运算符的 MySQL WHERE 子句
此查询查找职位为Sales Rep
员工或办公室代码为 1 的员工:
SELECT
lastName,
firstName,
jobTitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' OR
officeCode = 1
ORDER BY
officeCode ,
jobTitle;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+--------------------+------------+
| lastName | firstName | jobTitle | officeCode |
+-----------+-----------+--------------------+------------+
| Murphy | Diane | President | 1 |
| Bow | Anthony | Sales Manager (NA) | 1 |
| Jennings | Leslie | Sales Rep | 1 |
| Thompson | Leslie | Sales Rep | 1 |
| Firrelli | Jeff | VP Marketing | 1 |
| Patterson | Mary | VP Sales | 1 |
| Firrelli | Julie | Sales Rep | 2 |
| Patterson | Steve | Sales Rep | 2 |
| Tseng | Foon Yue | Sales Rep | 3 |
| Vanauf | George | Sales Rep | 3 |
| Bondur | Loui | Sales Rep | 4 |
| Hernandez | Gerard | Sales Rep | 4 |
| Castillo | Pamela | Sales Rep | 4 |
| Gerard | Martin | Sales Rep | 4 |
| Nishi | Mami | Sales Rep | 5 |
| Kato | Yoshimi | Sales Rep | 5 |
| Fixter | Andy | Sales Rep | 6 |
| Marsh | Peter | Sales Rep | 6 |
| King | Tom | Sales Rep | 6 |
| Bott | Larry | Sales Rep | 7 |
| Jones | Barry | Sales Rep | 7 |
+-----------+-----------+--------------------+------------+
21 rows in set (0.00 sec)
Code language: plaintext (plaintext)
仅当表达式之一计算结果为TRUE
时, OR
运算符计算结果为TRUE
:
jobtitle = 'Sales Rep' OR officeCode = 1
Code language: SQL (Structured Query Language) (sql)
因此,查询将返回职位为“销售代表”或办公室代码为 1 的所有员工。
4) 使用 MySQL WHERE 子句和 BETWEEN 运算符示例
如果值在某个值范围内,则BETWEEN
运算符返回TRUE
:
expression BETWEEN low AND high
Code language: SQL (Structured Query Language) (sql)
以下查询查找办公室代码为 1 到 3 的办公室的员工:
SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode BETWEEN 1 AND 3
ORDER BY officeCode;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+------------+
| firstName | lastName | officeCode |
+-----------+-----------+------------+
| Diane | Murphy | 1 |
| Mary | Patterson | 1 |
| Jeff | Firrelli | 1 |
| Anthony | Bow | 1 |
| Leslie | Jennings | 1 |
| Leslie | Thompson | 1 |
| Julie | Firrelli | 2 |
| Steve | Patterson | 2 |
| Foon Yue | Tseng | 3 |
| George | Vanauf | 3 |
+-----------+-----------+------------+
10 rows in set (0.00 sec)
Code language: plaintext (plaintext)
5) 使用 MySQL WHERE 子句和 LIKE 运算符示例
如果值与指定模式匹配,则LIKE
运算符的计算结果为TRUE
。
要形成模式,请使用%
和_
通配符。 %
通配符匹配零个或多个字符的任何字符串,而_
通配符匹配任何单个字符。
以下查询查找姓氏以字符串'son'
结尾的员工:
SELECT
firstName,
lastName
FROM
employees
WHERE
lastName LIKE '%son'
ORDER BY firstName;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+
| firstName | lastName |
+-----------+-----------+
| Leslie | Thompson |
| Mary | Patterson |
| Steve | Patterson |
| William | Patterson |
+-----------+-----------+
4 rows in set (0.00 sec)
Code language: plaintext (plaintext)
6) 使用 MySQL WHERE 子句和 IN 运算符示例
如果某个值与列表中的任何值匹配,则IN
运算符返回TRUE
。
value IN (value1, value2,...)
Code language: SQL (Structured Query Language) (sql)
以下示例使用WHERE
子句和IN
运算符来查找位于办公室代码为 1 的办公室的员工。
SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode IN (1 , 2, 3)
ORDER BY
officeCode;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+------------+
| firstName | lastName | officeCode |
+-----------+-----------+------------+
| Diane | Murphy | 1 |
| Mary | Patterson | 1 |
| Jeff | Firrelli | 1 |
| Anthony | Bow | 1 |
| Leslie | Jennings | 1 |
| Leslie | Thompson | 1 |
| Julie | Firrelli | 2 |
| Steve | Patterson | 2 |
| Foon Yue | Tseng | 3 |
| George | Vanauf | 3 |
+-----------+-----------+------------+
10 rows in set (0.00 sec)
Code language: plaintext (plaintext)
7) 使用带有 IS NULL 运算符的 MySQL WHERE 子句
要检查值是否为NULL
,请使用IS NULL
运算符,而不是等于运算符 ( =
)。如果值为NULL
, IS NULL
运算符将返回TRUE
。
value IS NULL
Code language: SQL (Structured Query Language) (sql)
在数据库世界中, NULL
是一个标记,表示某个值丢失或未知。并且 NULL 不等于数字 0 或空字符串。
以下语句使用带有IS NULL
运算符的WHERE
子句来获取reportsTo
列中的值为NULL
的行:
SELECT
lastName,
firstName,
reportsTo
FROM
employees
WHERE
reportsTo IS NULL;
Code language: SQL (Structured Query Language) (sql)
+----------+-----------+-----------+
| lastName | firstName | reportsTo |
+----------+-----------+-----------+
| Murphy | Diane | NULL |
+----------+-----------+-----------+
1 row in set (0.01 sec)
Code language: plaintext (plaintext)
8) 使用带比较运算符的 MySQL WHERE 子句
下表显示了可用于构成WHERE
子句中的表达式的比较运算符。
操作员 | 描述 |
---|---|
= | 等于。您几乎可以将它用于任何数据类型。 |
<> 或 != | 不等于 |
< | 少于。通常将其与数字和日期/时间数据类型一起使用。 |
> | 比...更棒。 |
<= | 小于或等于 |
>= | 大于或等于 |
以下查询使用不等于 (<>) 运算符来查找不是Sales Rep
所有员工:
SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle <> 'Sales Rep';
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+----------------------+
| lastname | firstname | jobtitle |
+-----------+-----------+----------------------+
| Murphy | Diane | President |
| Patterson | Mary | VP Sales |
| Firrelli | Jeff | VP Marketing |
| Patterson | William | Sales Manager (APAC) |
| Bondur | Gerard | Sale Manager (EMEA) |
| Bow | Anthony | Sales Manager (NA) |
+-----------+-----------+----------------------+
6 rows in set (0.00 sec)
Code language: plaintext (plaintext)
以下查询查找办公室代码大于 5 的员工:
SELECT
lastname,
firstname,
officeCode
FROM
employees
WHERE
officecode > 5;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+------------+
| lastname | firstname | officeCode |
+-----------+-----------+------------+
| Patterson | William | 6 |
| Bott | Larry | 7 |
| Jones | Barry | 7 |
| Fixter | Andy | 6 |
| Marsh | Peter | 6 |
| King | Tom | 6 |
+-----------+-----------+------------+
6 rows in set (0.00 sec)
Code language: plaintext (plaintext)
以下查询返回办公室代码小于或等于 4 (<=4) 的员工:
SELECT
lastname,
firstname,
officeCode
FROM
employees
WHERE
officecode <= 4;
Code language: SQL (Structured Query Language) (sql)
+-----------+-----------+------------+
| lastname | firstname | officeCode |
+-----------+-----------+------------+
| Murphy | Diane | 1 |
| Patterson | Mary | 1 |
| Firrelli | Jeff | 1 |
| Bondur | Gerard | 4 |
| Bow | Anthony | 1 |
| Jennings | Leslie | 1 |
| Thompson | Leslie | 1 |
| Firrelli | Julie | 2 |
| Patterson | Steve | 2 |
| Tseng | Foon Yue | 3 |
| Vanauf | George | 3 |
| Bondur | Loui | 4 |
| Hernandez | Gerard | 4 |
| Castillo | Pamela | 4 |
| Gerard | Martin | 4 |
+-----------+-----------+------------+
15 rows in set (0.00 sec)
Code language: plaintext (plaintext)
概括
- 使用
WHERE
子句按条件过滤行。 - MySQL 在
FROM
子句之后、SELECT
和ORDER BY
子句之前评估WHERE
子句。