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