MySQL 零基础教程

MySQL 逻辑运算符

在 MySQL 中,WHERE 子句允许根据指定的条件过滤行。为了创建更精确、更复杂的过滤器,你可以使用逻辑运算符将多个条件组合起来:ANDORNOT。这些运算符使你能够构建基于各种条件组合来检索数据的强大查询。

1. 使用 AND 组合条件

AND 运算符用于组合两个或多个条件。对于要包含在结果集中的行,由 AND 连接的所有条件都必须为真(TRUE)。如果其中任何一个条件为假(FALSE),则该行的整个 AND 表达式计算为假,该行将被排除。在没有括号的情况下,AND 运算符的优先级高于 OR,这意味着数据库会先计算 AND 条件,再计算 OR 条件。

1.1 AND 语法

SELECT column1, column2
FROM table_name
WHERE condition1 AND condition2 AND condition3;

1.2 AND 示例

world 数据库中的 city(城市)表为例,该表包含全球城市的信息,包括名称(Name)、国家代码(CountryCode)、行政区(District)和人口(Population)。

示例 1:特定国家且满足最低人口要求的城市
要查找位于美国(CountryCode = 'USA')且人口大于 500,000 的城市,这两个条件都必须满足。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'USA' AND Population > 500000;

此查询会返回洛杉矶、芝加哥和休斯顿等城市,因为它们位于美国并且人口超过 500,000。人口不超过 500,000 的美国城市,或者人口超过 500,000 但不在美国的城市都将被排除。

示例 2:一个国家内特定行政区的城市
要查找位于印度(CountryCode = 'IND')且在“Gujarat”(古吉拉特邦)行政区的城市,这两个条件都必须为真。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'IND' AND District = 'Gujarat';

此查询将返回艾哈迈达巴德和苏拉特等城市,因为它们同时满足这两个标准。

示例 3:使用 AND 组合三个条件
要查找位于中国(CountryCode = 'CHN')且人口在 1,000,000 到 5,000,000 之间(含两端)的城市,需要组合三个条件。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'CHN' AND Population >= 1000000 AND Population <= 5000000;

这会选出像天津或重庆这样满足所有三个标准的城市。

2. 使用 OR 组合条件

OR 运算符组合两个或多个条件。如果由 OR 连接的条件中任何一个为真,该行就会被包含在结果集中。只有当由 OR 连接的所有条件都为假时,一行才会被排除。OR 运算符的优先级低于 AND

2.1 OR 语法

SELECT column1, column2
FROM table_name
WHERE condition1 OR condition2 OR condition3;

2.2 OR 示例

继续使用 city 表:

示例 1:来自两个特定国家之一的城市
要查找位于法国(CountryCode = 'FRA'德国(CountryCode = 'DEU')的城市,只要其中一个 CountryCode 条件为真即可。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'FRA' OR CountryCode = 'DEU';

此查询返回巴黎(来自法国)和柏林(来自德国)等城市,以及这两个国家中的任何其他城市。来自其他国家(例如意大利)的城市则被排除。

示例 2:具有特定名称或高人口的城市
要查找名为 'London'(伦敦)的城市人口大于 10,000,000 的城市,两个条件中只要满足一个即可。

SELECT Name, CountryCode, District, Population
FROM city
WHERE Name = 'London' OR Population > 10000000;

即使伦敦(英国)的人口不超过 1000 万,该查询也会将其包含在内;同样,像东京(日本)这样的城市即使名字不叫伦敦,也会被包含在内。

3. 使用 NOT 否定条件

NOT 运算符用于否定一个条件,实际上就是反转其真值。如果条件为真,NOT 使其为假;如果条件为假,NOT 使其为真。它通常用于排除满足特定标准的行。NOT 的优先级高于 ANDOR

3.1 NOT 语法

SELECT column1, column2
FROM table_name
WHERE NOT condition;

3.2 NOT 示例

继续使用 city 表:

示例 1:不在特定国家的城市
要查找在印度(CountryCode = 'IND')的城市,将 NOT 运算符应用于 CountryCode = 'IND' 条件。

SELECT Name, CountryCode, District, Population
FROM city
WHERE NOT CountryCode = 'IND';

此查询返回除印度以外的所有城市。编写此查询的等效方法是 WHERE CountryCode != 'IND'WHERE CountryCode <> 'IND'

示例 2:人口不超过特定值的城市
要查找人口大于 1,000,000 的城市(即小于或等于 1,000,000)。

SELECT Name, CountryCode, District, Population
FROM city
WHERE NOT Population > 1000000;

此查询包含所有人口为 1,000,000 或更少的城市。这相当于 WHERE Population <= 1000000

4. 组合使用 AND、OR 和 NOT

当组合多个逻辑运算符时,理解优先级并使用括号至关重要。括号 () 可用于明确定义求值顺序,覆盖默认的运算符优先级。括号内的条件会首先被计算。

优先级顺序(从高到低):

  1. NOT
  2. AND
  3. OR

4.1 组合运算符示例

继续使用 city 表:

示例 1:特定国家的城市 OR(高人口 AND 特定行政区)
要查找位于加拿大(CountryCode = 'CAN'或者(人口大于 5,000,000 并且位于“California”行政区)的城市。(此示例仅用于演示,因为加利福尼亚是美国的行政区,通常不在加拿大)。

SELECT Name, CountryCode, District, Population
FROM city
WHERE CountryCode = 'CAN' OR Population > 5000000 AND District = 'California';

在没有括号的情况下,由于优先级更高,AND 条件 (Population > 5000000 AND District = 'California') 会首先被计算。然后,该 AND 表达式的结果会使用 ORCountryCode = 'CAN' 组合。这意味着:

  • 包含加拿大的城市。
  • 不在加拿大但人口 > 5,000,000 并且位于 'California' 的城市也被包含在内。

示例 2:使用括号改变优先级
如果你的意图是查找位于加拿大人口大于 5,000,000 的城市,然后再从这些结果中仅筛选出位于“California”行政区的城市呢?

SELECT Name, CountryCode, District, Population
FROM city
WHERE (CountryCode = 'CAN' OR Population > 5000000) AND District = 'California';

在这里,括号内的 OR 条件 (CountryCode = 'CAN' OR Population > 5000000) 首先被计算。该结果(加拿大城市或拥有极高人口的城市集合)随后使用 ANDDistrict = 'California' 条件组合。这将返回满足这两个 OR 条件之一并且同时位于 'California' 行政区的城市。由于加利福尼亚没有加拿大城市,如果也没有人口 > 500 万的城市,结果集将为空。这证明了括号如何彻底改变查询的含义。

示例 3:将 NOT 与 AND 和 OR 组合
要查找在美国(CountryCode = 'USA'人口大于 1,000,000,或者位于“England”(英格兰)行政区的城市。

SELECT Name, CountryCode, District, Population
FROM city
WHERE (NOT CountryCode = 'USA' AND Population > 1000000) OR District = 'England';

在这里,NOT 运算符直接应用于 CountryCode = 'USA'。由于括号的存在,AND 条件 (NOT CountryCode = 'USA' AND Population > 1000000) 首先被计算,然后该结果与 OR District = 'England' 组合。这将返回:

  • 不在美国且人口 > 1,000,000 的城市。
  • “England”行政区内的任何城市,无论其国家或人口如何。