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

MySQL 中的 WHERE 子句是什么?

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

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

然而,有时我们需要将查询结果限制为特定条件。在这种情况下,SQL 中的 WHERE 子句非常有用。

WHERE clause in MySQL
MySQL 中的 WHERE 子句

WHERE 子句语法

在 MySQL SELECT WHERE 语句中使用 WHERE 子句的基本语法如下。

SELECT * FROM tableName WHERE condition;

HERE

  • “SELECT * FROM tableName” 是标准的 SELECT 语句
  • “WHERE” 是限制我们 SELECT 查询结果集的关键字,“condition” 是要应用于结果的过滤器。过滤器可以是范围、单个值或子查询。

现在我们来看一个实际示例

假设我们想从 members 表中获取一个会员的个人详细信息,已知会员编号为 1,我们将使用以下脚本来实现。

SELECT * FROM `members` WHERE `membership_number` = 1;

在“myflixdb”上的 MySQL workbench 中执行上述脚本将产生以下结果。

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 子句结合 – AND 逻辑运算符

当 WHERE 条件在 MySQL 中与 AND 逻辑运算符一起使用时,只有在满足所有指定的过滤条件时才会执行。

现在我们来看一个实际示例 – 假设我们想获取 2008 年发布的类别 2 中所有电影的列表,我们将使用下面所示的脚本来实现。
SELECT * FROM `movies` WHERE `category_id` = 2 AND `year_released` = 2008;
在 MySQL workbench 中针对“myflixdb”执行上述脚本会产生以下结果。
movie_id title director year_released category_id
2 Forgetting Sarah Marshal Nicholas Stoller 2008 2

WHERE 子句结合 – OR 逻辑运算符

当 WHERE 子句与 OR 运算符一起使用时,只有在满足指定的一个或所有过滤条件时才会执行。
以下脚本获取类别 1 或类别 2 中的所有电影
SELECT * FROM `movies` WHERE `category_id` = 1 OR `category_id` = 2;
在 MySQL workbench 中针对“myflixdb”执行上述脚本会产生以下结果。
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

WHERE 子句结合 – IN 关键字

MySQL 中的 WHERE 子句与 IN 关键字一起使用时,仅影响值与 IN 关键字中提供的值列表匹配的行。MySQL IN 语句有助于减少您可能需要使用的 OR 子句的数量。
以下 MySQL WHERE IN 查询给出 membership_number 为 1、2 或 3 的行
SELECT * FROM `members` WHERE `membership_number` IN (1,2,3);

在 MySQL workbench 中针对“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
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

WHERE 子句结合 – NOT IN 关键字

当 WHERE 子句与 NOT IN 关键字一起使用时,不会影响值与 NOT IN 关键字中提供的值列表匹配的行。
以下查询给出 membership_number 不是 1、2 或 3 的行
SELECT * FROM `members` WHERE `membership_number` NOT IN (1,2,3);

在 MySQL workbench 中针对“myflixdb”执行上述脚本会产生以下结果。

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 子句一起使用

= 等于

以下脚本使用等于比较运算符从 members 表中获取所有女性会员。
SELECT * FROM `members` WHERE `gender` = 'Female';

在 MySQL workbench 中针对“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
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

> 大于

以下脚本获取 payments 表中所有金额大于 2,000 的付款。
SELECT * FROM `payments` WHERE `amount_paid` > 2000;
在 MySQL workbench 中针对“myflixdb”执行上述脚本会产生以下结果。
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;
在 MySQL workbench 中针对“myflixdb”执行上述脚本会产生以下结果。
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

摘要

  • SQL WHERE 子句用于限制 SELECT、UPDATE 或 DELETE 查询影响的行数。
  • SQL 中的 WHERE 条件可以与 AND 和 OR 等逻辑运算符、= 等比较运算符结合使用。
  • 当与 AND 逻辑运算符一起使用时,必须满足所有条件。
  • 当与 OR 逻辑运算符一起使用时,必须满足任何条件。
  • 关键字 IN 用于选择匹配值列表的行。

脑筋急转弯

假设我们想获取未按时(2012 年 6 月 25 日)归还的已租赁电影列表。我们可以使用 SQL WHERE 语句子句以及小于比较运算符和 AND 逻辑运算符来实现。
SELECT * FROM `movierentals` WHERE `return_date` < '2012-06-25' AND movie_returned = 0;

在 MySQL workbench 中执行上述脚本会得到以下结果。

reference_number transaction_date return_date membership_number movie_id movie_returned
14 21-06-2012 24-06-2012 2 2 0