PostgreSQL 教程

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);

这意味着它将返回:

  1. 'Electronics' 类别中的所有产品。
  2. '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;

这意味着它将返回:

  1. 属于 'Electronics' 或 'Clothing' 类别的产品。
  2. 并且 这些产品的价格必须小于 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'(图书)类别。