MySQL WHERE 子句:AND、OR、IN、NOT IN 查询示例
⚡ 智能摘要
MySQL WHERE 子句在行到达结果集之前对其进行筛选,为 SELECT、UPDATE 和 DELETE 语句应用精确的条件。理解 AND、OR、IN、NOT IN 和比较运算符可以让初学者准确检索查询所需的记录。

什么是 WHERE 子句 MySQL?
WHERE子句 in MySQL 是用于指定受特定 SQL 语句影响的数据或行的确切条件的关键字。WHERE 子句可与 INSERT、UPDATE、SELECT 和 DELETE 等 SQL 语句一起使用,以筛选记录并对数据执行各种操作。
我们研究了如何从 数据库 使用上一教程中的 SELECT 语句。SELECT 语句返回查询数据库表的所有结果。
然而,有时我们希望将查询结果限制在特定条件下。SQL 中的 WHERE 子句在这种情况下非常有用,它在其他语言中也以相同的方式工作。 删除或更新查询 就像在 SELECT 查询中一样。
WHERE 子句语法
WHERE 子句的基本语法如下。
SELECT * FROM tableName WHERE condition;
点击这里
- “从表名中选择 *” 是标准 选择语句
- “在哪里” 是用于限制结果集的关键字,并且 “健康)状况” 是应用于结果的筛选条件。筛选条件可以是范围、单个值或子查询。
假设我们想要从成员表中获取成员编号为 1 的成员的详细信息。下面的脚本可以实现这一点。
SELECT * FROM `members` WHERE `membership_number` = 1;
执行此脚本 MySQL 工作台 在“myflixdb”上搜索会得到以下结果。
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
单个条件通常不够。以下部分将 WHERE 子句与 逻辑运算符.
WHERE 子句与 – 相结合 AND 逻辑上 Opera器
使用 AND 逻辑运算符时,只有当所有指定的条件都满足时,才会返回一行。
假设我们想要查找 2008 年上映的所有 2 类电影。下面的脚本可以实现这一点。
SELECT * FROM `movies` WHERE `category_id` = 2 AND `year_released` = 2008;
对“myflixdb”执行上述脚本会产生以下结果。
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
AND 函数会缩小结果集范围,OR 函数会扩大结果集范围。
WHERE 子句与 – 相结合 OR 逻辑上 Opera器
使用 OR 运算符,如果满足任何指定的条件,则返回一行。
以下脚本获取所有属于第 1 类或第 2 类的电影。
SELECT * FROM `movies` WHERE `category_id` = 1 OR `category_id` = 2;
结果如下所示。
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 1 | Pirates of the Caribean 4 | Rob Marshall | 2011 | 1 |
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
串联多个 OR 条件会使代码难以阅读。IN 关键字可以解决这个问题。
WHERE 子句与 – 相结合 IN 关键字
WHERE 子句与 IN 关键字一起使用时,只会影响值与提供的列表匹配的行。IN 可以减少您原本需要编写的 OR 子句的数量。
下列 MySQL WHERE IN 查询返回 membership_number 为 1、2 或 3 的行。
SELECT * FROM `members` WHERE `membership_number` IN (1,2,3);
结果如下所示。
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 3 | Robert Phil | Male | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
NOT IN 执行相反的过滤操作。
WHERE 子句与 – 相结合 不在 关键字
使用 NOT IN 关键字时,WHERE 子句会排除所有值与提供的列表匹配的行。
以下查询返回 membership_number 不为 1、2 或 3 的行。
SELECT * FROM `members` WHERE `membership_number` NOT IN (1,2,3);
结果如下所示。
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
WHERE 还使用比较运算符按大小和相等性筛选值。
WHERE 子句与 – 相结合 对比 Opera职权范围
小于 (<)、等于 (=)、大于 (>) 和不等于 (<>) 比较运算符都可以与 WHERE 子句一起使用。
= 等于
以下脚本使用等于比较运算符从成员表中获取所有女性成员。
SELECT * FROM `members` WHERE `gender` = 'Female';
结果如下所示。
| membership_number | full_names | gender | date_of_birth | physical_address | postal_address | contct_number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
> 比...更棒
以下脚本从付款表中获取所有大于 2,000 的付款。
SELECT * FROM `payments` WHERE `amount_paid` > 2000;
结果如下所示。
| payment_id | membership_number | payment_date | description | amount_paid | external_reference_number |
|---|---|---|---|---|---|
| 1 | 1 | 23-07-2012 | Movie rental payment | 2500 | 11 |
| 3 | 3 | 30-07-2012 | Movie rental payment | 6000 | NULL |
<> 不等于
以下脚本获取所有类别 ID 不为 1 的电影。
SELECT * FROM `movies` WHERE `category_id` <> 1;
结果如下所示。
| movie_id | title | director | year_released | category_id |
|---|---|---|---|---|
| 2 | Forgetting Sarah Marshal | Nicholas Stoller | 2008 | 2 |
| 5 | Daddy's Little Girls | NULL | 2007 | 8 |
| 6 | Angels and Demons | NULL | 2007 | 6 |
| 7 | Davinci Code | NULL | 2007 | 6 |
| 9 | Honey mooners | John Schultz | 2005 | 8 |
快速参考:WHERE 子句 Opera职权范围
下面总结了最常与 WHERE 搭配使用的运算符。完整定义请参见…… MySQL 操作员参考.
| Opera器 | 意 | 示例条件 |
|---|---|---|
| = | 等于 | `gender` = '女性' |
| <> | 不等于 | `category_id` <> 1 |
| > / | 大于/小于 | `amount_paid` > 2000 |
| 和/或 | 所有标准/任何标准 | `category_id` = 2 且 `year_released` = 2008 |
| 进入/未进入 | 匹配/排除列表 | `membership_number` IN (1,2,3) |
| 为空 / 不为空 | 缺失值检验 | `postal_address` 为空 |
⚠️ 注意: NULL 永远不会与 = 或 <> 匹配。当列可能不包含值时,请使用 IS NULL 或 IS NOT NULL。
脑筋急转弯:找出逾期归还的电影
假设我们想要查找在 2012 年 06 月 25 日截止日期前未归还的已租电影。将 WHERE 语句与小于运算符和 AND 语句结合使用即可实现此目的。
SELECT * FROM `movierentals` WHERE `return_date` < '2012-06-25' AND movie_returned = 0;
在以下位置执行上述脚本 MySQL 工作台给出以下结果。
| reference_number | transaction_date | return_date | membership_number | movie_id | movie_returned |
|---|---|---|---|---|---|
| 14 | 21-06-2012 | 24-06-2012 | 2 | 2 | 0 |

