PostgreSQL 条件查询

WHERE子句

WHERE子句的语法如下:

SELECT column1, column2, ... FROM table WHERE conditions;

WHERE子句位于FROM之后,用于指定一个或者多个逻辑条件,用于过滤返回的结果。满足条件的行将会返回,否则将被忽略。PostgreSQL提供了各种运算符和函数,用于构造逻辑条件。先看一个简单的示例,以下语句返回了薪水为10000的员工。

select first_name, last_name, salary
from employees
where salary = 10000;

此处的等于号(=)是一个比较运算符,因此只有薪水等于10000的数据应用该运算符之后的结果为真值(True),返回结果中只包含这些数据。PostgreSQL提供了以下各种比较运算符。

 以上这些运算符的作用都比较明显,不做详细介绍。需要注意的是BETWEEN包含了两端的值,等价于>=加上<=。

select first_name, last_name, salary
from employees
where salary between 3000 and 3200;

模式匹配

PostgreSQL支持各种字符串模式匹配的功能。最简单的方式就是使用LIKE运算符,以下查询返回了姓氏(last_name)以“Kin”开头的员工。

select first_name, last_name, salary
from employees
where  last_name like 'Kin%'

其中的百分号(%)可以匹配零个或者多个任意字符;另外,下划线(_)可以匹配一个任意字符。例如:

  • “%en”匹配以“en”结束的字符串;
  • “%en%”匹配包含“en”的字符串;
  • “B_g”匹配“Big”、“Bug”等。

如果字符串中存在这两个通配符(%或_),可以在它们前面加上一个反斜杠(\)进行转义。

SELECT '这是模糊匹配转义%' LIKE '%转义%'  is_true1,
       '这是模糊匹配转义%' LIKE '%转义\%' is_true2;

也可以通过ESCAPE子句指定其他的转义字符。

SELECT '这是模糊匹配转义%' LIKE '%转义^%' escape  '^' is_true1,
       '这是模糊匹配转义%' LIKE '%转义%' escape '%' is_true2;

 另外,NOT LIKE运算符匹配与LIKE相反的结果。LIKE运算符区分大小写,PostgreSQL同时还提供了不区分大小写的ILIKE运算符。

select first_name, last_name, salary
from employees
where  last_name ilike 'King'

空值判断

根据SQL标准,空值使用NULL表示。空值是一个特殊值,代表了未知数据。如果使用常规的比较运算符与NULL进行比较,总是返回空值。 

select NULL = 0,--结果为空值
       NULL = NULL, --结果为空值
       NULL != NULL; --结果为空值

如果在查询条件中使用这种方式,将不会返回任何结果。因此,对于NULL值的比较,需要使用特殊的运算符:IS NULL。

SELECT first_name,last_name,department_id FROM employees WHERE department_id IS NULL;
SELECT first_name,last_name,department_id FROM employees WHERE department_id ISNULL;

is null 等价于 isnull ,另外 is not null 等价于 notnull

SELECT first_name,last_name,department_id FROM employees WHERE department_id IS not NULL;
SELECT first_name,last_name,department_id FROM employees WHERE department_id notNULL;

复杂条件

WHERE子句可以包含多个条件,使用逻辑运算符(AND、OR、NOT)将它们进行组合,并根据最终的逻辑值进行过滤。AND(逻辑与)运算符的逻辑真值表如下:

对于AND运算符,只有当它两边的结果都为真时,最终结果才为真;否则最终结果为假,不返回结果。以下查询返回薪水为10000,并且姓氏为“King”的员工:

select first_name, last_name, salary
from employees
where last_name = 'King'
   and salary = 10000;

OR(逻辑或)运算符的逻辑真值表如下:

select first_name, last_name, salary
from employees
where last_name = 'King'
   or salary = 10000;

对于逻辑运算符AND和OR,需要注意的是,它们使用短路运算。也就是说,只要前面的表达式能够决定最终的结果,不进行后面的计算。这样能够提高运算效率。因此,以下语句不会产生除零错误

SELECT 1 = 0 AND 1 / 0 = 1 as is_true1,
       1 = 1 OR 1 / 0 = 1  as is_true2;

还需要注意的一个问题是,当我们组合AND和OR运算符时,AND运算符优先级更高,总是先执行。

SELECT first_name,last_name,salary FROM employees WHERE salary = 10000 OR salary = 24000 AND last_name = 'King';

由于AND优先级高,查询返回的是薪水为24000并且姓氏为“King”的员工,或者薪水为10000的员工。如果相要返回姓氏为“King”,并且薪水为10000或24000的员工,可以使用括号修改优先级:

SELECT first_name,last_name,salary FROM employees WHERE (salary = 10000 OR salary = 24000)AND last_name = 'King'

NOT(逻辑非)运算符用于取反操作,它的逻辑真值表如下:

注意,对于未知的NULL值,经过NOT处理之后仍然是未知值。除此之外,NOT还可以结合前面介绍的运算符一起使用:

  • NOT BETWEEN,位于范围之外
  • NOT IN,不在列表之中
  • NOT LIKE,不匹配模式
  • NOT IS NULL,不为空,等价于IS NOT NULL
posted @ 2023-07-10 09:49  晓枫的春天  阅读(338)  评论(0编辑  收藏  举报