PostgreSQL IN 运算符用法与实例
本文介绍了在 PostgreSQL 中如何使用 IN
运算符检查一个值列表是否包含一个指定的值。
在 PostgreSQL 中,IN
运算符是一个布尔运算符,用来检查一个值列表是否包含一个指定的值。如果值列表包含了指定的值,则 IN
运算符返回真,否则它返回假。
PostgreSQL IN 运算符语法
要检查一个值是否位于一个值列表之内,请按照以下语法使用 IN
运算符:
expr IN (value1, value2, ...)
或者
expr IN (subquery)
这里:
expr
可以是一个字段名、值或其他的表达式(比如函数调用、运算等)。(value1, value2, ...)
是一个值列表,多个值之间使用,
分隔,并使用小括号()
将它们包围起来。value1
是具体的值,ke 比如:1
,2
,'A'
,'B'
等。subquery
是一个只返回一个列的子查询。
如果值列表或者子查询返回的值中包含了 expr
,IN
运算符返回真,否则它返回假。
IN
运算符的否定操作是 NOT IN
。
IN
vs OR
IN
表达式都可以使用 OR
运算符改写。
比如:
val IN (1, 2, 3)
等同于如下使用 OR
的表达式:
val = 1 OR val = 2 OR val = 3
同理,NOT IN
表达式都可以使用 AND
运算符改写。
val NOT IN (1, 2, 3)
等同于如下使用 AND
的表达式:
val <> 1 AND val <> 2 OR val <> 3
PostgreSQL IN 运算符实例
我们将使用 Sakila 示例数据库 中的表进行演示,请您先在 PostgreSQL 中安装 Sakila 示例数据库。
在 Sakila 示例数据库中, actor
表存储了所有的演员的信息。
要从 actor
表中查询姓氏为 ALLEN
或 DAVIS
的所有演员,请使用以下带有 IN
运算符的语句:
SELECT *
FROM actor
WHERE last_name IN ('ALLEN', 'DAVIS');
actor_id | first_name | last_name | last_update
----------+------------+-----------+---------------------
4 | JENNIFER | DAVIS | 2006-02-15 04:34:33
101 | SUSAN | DAVIS | 2006-02-15 04:34:33
110 | SUSAN | DAVIS | 2006-02-15 04:34:33
118 | CUBA | ALLEN | 2006-02-15 04:34:33
145 | KIM | ALLEN | 2006-02-15 04:34:33
194 | MERYL | ALLEN | 2006-02-15 04:34:33
(6 rows)
您可以使用 OR
运算符改写上面的语句:
SELECT *
FROM actor
WHERE last_name = 'ALLEN'
OR last_name = 'DAVIS';
在 PostgreSQL IN
中使用子查询
要从 film 表中检索拥有库存的影片的数量,您可以使用带有子查询的 PostgreSQL IN
的表达式:
SELECT COUNT(*)
FROM film
WHERE film_id IN (
SELECT film_id
FROM inventory
);
count
-------
958
通常,带有子查询的 PostgreSQL IN
的表达式都可以使用 EXISTS
运算符 改写,并且 EXISTS
表达式具有更好的效率。上面的语句等同于以下使用 EXISTS
的语句:
SELECT COUNT(*)
FROM film f
WHERE EXISTS (
SELECT 1
FROM inventory i
WHERE i.film_id = f.film_id
);
count
-------
958
结论
PostgreSQL IN
运算符是一个布尔运算符,用来检查一个值列表是否包含一个指定的值。如果值列表包含了指定的值,则 IN
运算符返回真,否则它返回假。