MySQL 逻辑运算符
在 MySQL 中,WHERE 子句允许根据指定的条件过滤行。为了创建更精确、更复杂的过滤器,你可以使用逻辑运算符将多个条件组合起来:AND、OR 和 NOT。这些运算符使你能够构建基于各种条件组合来检索数据的强大查询。
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 的优先级高于 AND 和 OR。
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
当组合多个逻辑运算符时,理解优先级并使用括号至关重要。括号 () 可用于明确定义求值顺序,覆盖默认的运算符优先级。括号内的条件会首先被计算。
优先级顺序(从高到低):
NOTANDOR
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 表达式的结果会使用 OR 与 CountryCode = '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) 首先被计算。该结果(加拿大城市或拥有极高人口的城市集合)随后使用 AND 与 District = '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”行政区内的任何城市,无论其国家或人口如何。