SQL WHERE 子句
WHERE 子句是 SQL 的基础组成部分,它允许你根据特定条件过滤数据。它是创建定向查询、仅检索你需要的信息的基石,能让你的数据分析和应用逻辑更加高效。本章将探讨如何在 WHERE 子句中使用比较运算符和逻辑运算符,以创建强大且精确的数据过滤器。
1. 比较运算符 (Comparison Operators)
比较运算符用于将一列的值与特定的值或另一列的值进行对比。这些运算符构成了 WHERE 子句条件的基础模块。
1.1 等于 (=)
等于运算符检查一列的值是否与指定的值完全相同。
示例: 假设我们有一个名为 products(产品)的表,包含 product_id(产品ID)、product_name(产品名称)和 price(价格)等列。
SELECT product_name, price
FROM products
WHERE price = 24.99;此查询将返回 products 表中所有 price 完全等于 24.99 的行。
代码解释:
SELECT product_name, price: 指定要检索的列。FROM products: 指定要从中检索数据的表。WHERE price = 24.99: 过滤结果,仅包含price列等于 24.99 的行。
1.2 不等于 (!= 或 <>)
不等于运算符(!= 和 <>)检查一列的值是否不等于指定的值。这两个运算符实现的效果是相同的。
示例:
SELECT product_name, price
FROM products
WHERE price != 24.99; -- 或者写成 WHERE price <> 24.99;此查询将返回所有价格不是 24.99 的产品。
代码解释:
WHERE price != 24.99 子句过滤结果,仅包含 price 不等于 24.99 的行。
1.3 大于 (>)
大于运算符检查一列的值是否大于指定的值。
示例:
SELECT product_name, price
FROM products
WHERE price > 50.00;此查询返回所有价格大于 50.00 的产品。
代码解释:
WHERE price > 50.00 子句过滤结果,仅包含 price 大于 50.00 的行。
1.4 小于 (<)
小于运算符检查一列的值是否小于指定的值。
示例:
SELECT product_name, price
FROM products
WHERE price < 10.00;此查询返回所有价格小于 10.00 的产品。
代码解释:
WHERE price < 10.00 子句过滤结果,仅包含 price 小于 10.00 的行。
1.5 大于或等于 (>=)
大于或等于运算符检查一列的值是否大于或等于指定的值。
示例:
SELECT product_name, price
FROM products
WHERE price >= 50.00;此查询返回所有价格为 50.00 或以上的产品。
代码解释:
WHERE price >= 50.00 子句过滤结果,仅包含 price 大于或等于 50.00 的行。
1.6 小于或等于 (<=)
小于或等于运算符检查一列的值是否小于或等于指定的值。
示例:
SELECT product_name, price
FROM products
WHERE price <= 10.00;此查询返回所有价格为 10.00 或以下的产品。
代码解释:
WHERE price <= 10.00 子句过滤结果,仅包含 price 小于或等于 10.00 的行。
1.7 BETWEEN (在...之间)
BETWEEN 运算符用于选择给定范围内的值。它包含范围的起始值和结束值。
示例:
SELECT product_name, price
FROM products
WHERE price BETWEEN 20.00 AND 30.00;此查询返回所有价格在 20.00 到 30.00 之间(含 20.00 和 30.00)的产品。
代码解释:
WHERE price BETWEEN 20.00 AND 30.00 等同于 WHERE price >= 20.00 AND price <= 30.00。
1.8 LIKE (模糊匹配)
LIKE 运算符用于模式匹配。它通常与通配符一起使用:
%:代表零个、一个或多个字符。_:代表单个字符。
使用 % 的示例:
SELECT product_name
FROM products
WHERE product_name LIKE 'Laptop%';此查询返回所有以 "Laptop" 开头的产品名称。
代码解释:
WHERE product_name LIKE 'Laptop%' 过滤结果,仅包含 product_name 以 "Laptop" 开头的行。% 通配符表示 "Laptop 后面的任意字符"。
使用下划线 _ 的示例:
SELECT product_name
FROM products
WHERE product_name LIKE 'C_t';此查询返回所有以 "C" 开头,第二位是任意字符,且以 "t" 结尾的产品名称。例如,"Cat"、"Cot" 和 "Cut" 都会被匹配。
1.9 IN (包含于)
IN 运算符允许你指定一个值列表来进行匹配。
示例:
SELECT product_name, price
FROM products
WHERE product_id IN (1, 2, 3);此查询返回 product_id 为 1、2 或 3 的所有产品。
代码解释:
WHERE product_id IN (1, 2, 3) 过滤结果,仅包含 product_id 存在于指定值列表中的行。
1.10 IS NULL 和 IS NOT NULL (空与非空)
这两个运算符用于检查空值。NULL 表示缺失或未知的值。你不能使用 = 或 != 来检查 NULL 值。
检查 IS NULL 示例:
SELECT product_name, discount
FROM products
WHERE discount IS NULL;此查询返回 discount(折扣)列为 NULL 值的所有产品。
检查 IS NOT NULL 示例:
SELECT product_name, discount
FROM products
WHERE discount IS NOT NULL;此查询返回 discount 列具有非 NULL 值的所有产品。
2. 逻辑运算符 (Logical Operators)
逻辑运算符用于在 WHERE 子句中组合多个条件。
2.1 AND (与)
AND 运算符要求运算符两侧的两个条件都必须为真(True),该行才会被包含在结果集中。
示例:
SELECT product_name, price, category
FROM products
WHERE price > 20.00 AND category = 'Electronics';此查询返回价格大于 20.00 并且 属于 'Electronics'(电子产品)类别的所有产品。
代码解释:
WHERE price > 20.00 AND category = 'Electronics' 要求这两个条件都满足,行才会被返回。
2.2 OR (或)
OR 运算符要求运算符两侧的条件中至少有一个为真,该行就会被包含在结果集中。
示例:
SELECT product_name, price, category
FROM products
WHERE price > 50.00 OR category = 'Clothing';此查询返回价格大于 50.00 或者 属于 'Clothing'(服装)类别的所有产品(满足其一或同时满足均可)。
代码解释:
WHERE price > 50.00 OR category = 'Clothing' 只要满足其中至少一个条件即可。
2.3 NOT (非)
NOT 运算符用于否定(反转)一个条件。
示例:
SELECT product_name, price
FROM products
WHERE NOT category = 'Electronics';此查询返回不属于 'Electronics'(电子产品)类别的所有产品。
代码解释:
WHERE NOT category = 'Electronics' 反转了条件,选择了 category 不是 'Electronics' 的行。
结合 NOT LIKE 的示例:
SELECT product_name
FROM products
WHERE product_name NOT LIKE 'Laptop%';此查询返回所有名称不以 "Laptop" 开头的产品。
3. 运算符优先级 (Operator Precedence)
当组合多个逻辑运算符时,了解运算符的优先级非常重要。
优先级顺序为:NOT 优先级最高,其次是 AND,最后是 OR。
你可以使用括号 () 来覆盖默认的优先级,并控制条件的评估顺序。
未使用括号的示例:
SELECT product_name, price, category
FROM products
WHERE category = 'Electronics' OR category = 'Clothing' AND price < 25.00;如果没有括号,这个查询会被解析为:
WHERE category = 'Electronics' OR (category = 'Clothing' AND price < 25.00);这意味着它将返回:
- 'Electronics' 类别中的所有产品。
- 'Clothing' 类别中且价格小于 25.00 的产品。
使用括号的示例:
SELECT product_name, price, category
FROM products
WHERE (category = 'Electronics' OR category = 'Clothing') AND price < 25.00;有了括号,这个查询会被明确解析为:
WHERE (category = 'Electronics' OR category = 'Clothing') AND price < 25.00;这意味着它将返回:
- 属于 'Electronics' 或 'Clothing' 类别的产品。
- 并且 这些产品的价格必须小于 25.00。
4. 组合使用比较与逻辑运算符
你可以将比较运算符和逻辑运算符结合起来,创建极其复杂的过滤器。
示例:
SELECT product_name, price, category, discount
FROM products
WHERE (price > 25.00 AND category = 'Home Goods') OR (discount > 0.10 AND category = 'Books');此查询返回满足以下任意一项条件的产品:
- 产品的价格大于 25.00 且属于 'Home Goods'(家居用品)类别。
- 产品的折扣大于 0.10 且属于 'Books'(图书)类别。