转摘PostgreSQL 条件查询

龙又晴阅读量 13

WHERE子句

WHERE子句的语法如下:

复制代码
SELECT column1, column2, ... FROM table WHERE conditions;

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

复制代码
select first_name, last_name, salary
from employees
where salary = 10000;

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319103213417-149652897.png)

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

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319103923010-1240529215.png)

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

复制代码
select first_name, last_name, salary
from employees
where salary between 3000 and 3200;

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319104047747-1854911698.png)

模式匹配

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

复制代码
select first_name, last_name, salary
from employees
where  last_name like 'Kin%'

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319104303080-1329648631.png)

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

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

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

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

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319111710364-103208042.png)

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

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

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319111744473-1246217795.png)

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

复制代码
select first_name, last_name, salary
from employees
where  last_name ilike 'King'

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319111855694-1256479664.png)

空值判断

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

复制代码
select NULL = 0,--结果为空值
       NULL = NULL, --结果为空值
       NULL != NULL; --结果为空值

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112042164-623122502.png)

如果在查询条件中使用这种方式,将不会返回任何结果。因此,对于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(逻辑与)运算符的逻辑真值表如下:

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112310291-1175698302.png)

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

复制代码
select first_name, last_name, salary
from employees
where last_name = 'King'
   and salary = 10000;

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112347265-1820796512.png)

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

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112400861-1546635156.png)

复制代码
select first_name, last_name, salary
from employees
where last_name = 'King'
   or salary = 10000;

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112436433-321704078.png)

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

复制代码
SELECT 1 = 0 AND 1 / 0 = 1 as is_true1,
       1 = 1 OR 1 / 0 = 1  as is_true2;

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112506641-431344569.png)

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

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

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112552298-1161197544.png)

由于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(逻辑非)运算符用于取反操作,它的逻辑真值表如下:

![](https://img2023.cnblogs.com/blog/1534499/202303/1534499-20230319112723604-1771745245.png)

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

  • NOT BETWEEN,位于范围之外

  • NOT IN,不在列表之中

  • NOT LIKE,不匹配模式

  • NOT IS NULL,不为空,等价于IS NOT NULL

    复制代码
      ===========================
      【来源: 博客园】
      【作者: 晓枫的春天】
      【原文链接】 https://www.cnblogs.com/wdh01/p/17232588.html
      声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢。
0/300
全部评论0
0/300