PostgreSQL WHERE 用法与实例

本文介绍了在 PostgreSQL 中如何在 SELECT 语句中使用 WHERE 过滤返回的行。

默认情况下,SELECT 查询数据表中的所有行数。但是,我们可能只想查询满足一定条件的行。比如年龄是 18 的学生,成绩中等的学生等。

在 PostgreSQL 中, 要返回满足指定条件的行,请在 SELECT 语句中使用 WHERE 子句。

除了 SELECT 语句之外,您还可以在 UPDATEDELETE 语句中使用 WHERE 子句来指定要更新或删除的行。

PostgreSQL WHERE 子句概述

要返回满足指定条件的行,请按如下语法使用 PostgreSQL 带有 WHERE 子句的 SELECT 语句:

SELECT columns_list
FROM table_name
WHERE query_condition;

要更新满足指定条件的行,请按如下语法使用 PostgreSQL 带有 WHERE 子句的 UPDATA 语句:

UPDATA table_name
SET column_name = value1, ...
WHERE query_condition;

要删除满足指定条件的行,请按如下语法使用 PostgreSQL 带有 WHERE 子句的 DELETE 语句:

DELETE FROM table_name
WHERE query_condition;

在这里:

WHERE 子句中的 query_condition 为布尔表达式。布尔表达式的结果必须为 true, false, 或者 NULL。它可以是一个布尔表达式或使用 ANDOR 运算符的布尔表达式的组合。

WHERE 子句使用 query_condition 来过滤表中的行:

  • 只有导致 query_condition 评估为真的行才会包含在 SELECT 语句返回的结果集中。
  • 只有导致 query_condition 评估为真的行才会被 UPDATE 语句更新。
  • 只有导致 query_condition 评估为真的行才会被 DELETE 语句删除。

PostgreSQL WHERE 子句示例

下面我们提供了一些实用的例子来展示 WHERE 子句的威力。

我们将使用 PostgreSQL Sakila 示例数据库中的 customer进行演示这些实例。

将 WHERE 子句与等号 (=) 运算符一起使用的示例

以下语句使用 WHERE 子句查找名字为 JAMIE 的客户:

SELECT last_name,
  first_name
FROM customer
WHERE first_name = 'JAMIE';
 last_name | first_name
-----------+------------
 RICE      | JAMIE
 WAUGH     | JAMIE

WHERE 子句中使用 AND 运算符

以下示例通过使用逻辑运算符 AND 组合两个布尔表达式来查找名字和姓氏为 JAMIERICE 的客户:

SELECT last_name,
  first_name
FROM customer
WHERE first_name = 'JAMIE'
  AND last_name = 'RICE';
 last_name | first_name
-----------+------------
 RICE      | JAMIE

WHERE 子句中使用 OR 运算符

此示例使用 OR 运算符查找姓氏为 RODRIGUEZ 或名字为 ADAM 的客户:

SELECT first_name,
  last_name
FROM customer
WHERE last_name = 'RODRIGUEZ'
  OR first_name = 'ADAM';
 first_name | last_name
------------+-----------
 LAURA      | RODRIGUEZ
 ADAM       | GOOCH

WHERE 子句中使用 IN 运算符

如果要将字符串与一个列表中的任何字符串匹配,可以使用 IN 运算符。

例如,以下语句返回名字为 ANN, ANNE, 或 ANNIE 的客户:

SELECT first_name,
  last_name
FROM customer
WHERE first_name IN ('ANN', 'ANNE', 'ANNIE');
 first_name | last_name
------------+-----------
 ANN        | EVANS
 ANNE       | POWELL
 ANNIE      | RUSSELL

WHERE 子句中使用 LIKE 运算符

要查找与指定模式匹配的字符串,请使用 LIKE 运算符。以下示例返回名字以字符串 ANN 开头的所有客户:

SELECT first_name,
  last_name
FROM customer
WHERE first_name LIKE 'ANN%';
 first_name | last_name
------------+-----------
 ANNA       | HILL
 ANN        | EVANS
 ANNE       | POWELL
 ANNIE      | RUSSELL
 ANNETTE    | OLSON

这里,通配符 % 可以匹配任意长度的任意字符。 模式 'ANN%' 模式匹配以 'ANN' 开头的任何字符串。

WHERE 子句中使用 BETWEEN 运算符

以下示例使用 BETWEEN 运算符查找名字以字母 A 开头并包含 3 到 5 个字符的客户。

SELECT first_name,
  LENGTH(first_name) name_length
FROM customer
WHERE first_name LIKE 'A%'
  AND LENGTH(first_name) BETWEEN 3 AND 5
ORDER BY name_length;
 first_name | name_length
------------+-------------
 AMY        |           3
 ANN        |           3
 ANA        |           3
 ANDY       |           4
 ANNA       |           4
 ANNE       |           4
 ALMA       |           4
 ADAM       |           4
 ALAN       |           4
 ALEX       |           4
 ANGEL      |           5
 AGNES      |           5
 ANDRE      |           5
 AARON      |           5
 ALLAN      |           5
 ALLEN      |           5
 ALICE      |           5
 ALVIN      |           5
 ANITA      |           5
 AMBER      |           5
 APRIL      |           5
 ANNIE      |           5

在这个例子中,我们使用了获取输入字符串的字符数的 LENGTH() 函数。

WHERE 子句中使用不等运算符 (<>)运算符

此示例查找名字以 BRA 开头而姓氏不以 MOTLEY 开头的客户:

SELECT first_name,
  last_name
FROM customer
WHERE first_name LIKE 'BRA%'
  AND last_name <> 'MOTLEY';
 first_name | last_name
------------+-----------
 BRANDY     | GRAVES
 BRANDON    | HUEY
 BRAD       | MCCURDY

您可以使用 != 运算符代替 <> 运算符,因为它们是等效的。

结论

本文向您介绍了 WHERE 子句的作用,以及如何在 PostgreSQL SELECT 语句中使用 WHERE 子句根据指定条件过滤行。

以下是一些可以在 WHERE 子句中使用的运算符:

  • = : 相等
  • > : 大于
  • < : 小于
  • >= : 大于或等于
  • <= : 小于或等于
  • <> : 不相等
  • != : 不相等,等同于 <>
  • AND : 逻辑与运算符
  • OR : 逻辑或运算符
  • IN : 如果值与列表中的任何值匹配,则返回 true
  • BETWEEN : 如果一个值在一个值范围之间,则返回 true
  • LIKE : 如果值与模式匹配,则返回 true
  • IS NULL : 如果值为 NULL,则返回 true
  • NOT : 否定其他运算符的结果