MySQL WHERE 子句:AND、OR、IN、NOT IN 查询示例

⚡ 智能摘要

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

  • 🔍 核心宗旨: WHERE 子句限制语句操作的行,因此 SELECT、UPDATE 和 DELETE 只会影响匹配的行。
  • 🔗 AND OperaTOR: 只有当所有条件都为真时才返回行,从而缩小结果集。
  • 🔀 OR OperaTOR: 当任何一个条件评估结果为真时,都会返回相应的行,从而扩大结果集。
  • 📋 在内和不在内: IN 关键字用于匹配一个表达式中的值列表,而 NOT IN 则排除该列表。
  • 对比 Opera目的: 等于(=)、大于(>)、小于(<)和不等于(<>)筛选数值、文本和日期列。
  • ⚠️ 空值处理: NULL 永远不会与 = 或 <> 匹配,因此需要使用 IS NULL 和 IS NOT NULL 来测试缺失值。

什么是 WHERE 子句 MySQL?

WHERE子句 in MySQL 是用于指定受特定 SQL 语句影响的数据或行的确切条件的关键字。WHERE 子句可与 INSERT、UPDATE、SELECT 和 DELETE 等 SQL 语句一起使用,以筛选记录并对数据执行各种操作。

我们研究了如何从 数据库 使用上一教程中的 SELECT 语句。SELECT 语句返回查询数据库表的所有结果。

然而,有时我们希望将查询结果限制在特定条件下。SQL 中的 WHERE 子句在这种情况下非常有用,它在其他语言中也以相同的方式工作。 删除或更新查询 就像在 SELECT 查询中一样。

WHERE 子句 MySQL

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 email
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 email
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 email
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 email
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

常见问题

WHERE 筛选单个行,然后再进行分组ping因此,它不能引用聚合函数。HAVING 子句在 GROUP BY 子句运行之后筛选分组,使其成为诸如 COUNT(*) > 5 之类的条件的合适位置。

使用 IS NULL 或 IS NOT NULL。 Opera诸如 = 和 <> 之类的运算符对于 NULL 返回未知值,因此 `postal_address` = NULL 不匹配任何内容,而 `postal_address` IS NULL 则有效。

是的,当筛选后的列被建立索引时, MySQL 只读取匹配的行,而不是扫描整个表。ping 函数中的列,例如 YEAR(`date_of_birth`) = 1980,会阻止索引的使用。

是的。人工智能助手可以将纯英语转换成 SQL 语句,而且 MySQL 工作台 可以运行结果。 Rev请对照您的模式检查每个条件,因为模型可能会自行创建列名。

先用 SELECT 语句测试一下。错误的 WHERE 子句会导致问题。 删除或更新查询 可以修改每一行。预览匹配的行,然后重复使用相同的条件进行写入。

总结一下这篇文章: