PostgreSQL 的子查询 相关的知识 ,exists,any,all

Subquery

SELECT
   film_id,
   title,
   rental_rate
FROM
   film
WHERE
   rental_rate > (
      SELECT
         AVG (rental_rate)
      FROM
         film
   );

有了子查询,在设定 需要查询表才能得到 查询条件时,就可以 直接 在一条语句中 写,不用分开多条写了,方便了许多。

子查询返回多条时,可以在 where 子句中 用 IN,来匹配查询条件。

SELECT
   film_id,
   title
FROM
   film
WHERE
   film_id IN (
      SELECT
         inventory.film_id
      FROM
         rental
      INNER JOIN inventory ON inventory.inventory_id = rental.inventory_id
      WHERE
         return_date BETWEEN '2005-05-29'
      AND '2005-05-30'
   );

EXISTS 操作符

在 where 子句的 查询条件中,exists 操作符,会在子查询有返回行时,返回true;不论返回几行。
因此,子查询中的查询字段仅写1就好;标准的写法:EXISTS (SELECT 1 FROM tbl WHERE condition)

SELECT
   first_name,
   last_name
FROM
   customer
WHERE
   EXISTS (
      SELECT
         1
      FROM
         payment
      WHERE
         payment.customer_id = customer.customer_id
   );

NO EXISTS ,与之相反,当子查询返回0行时,返回true

SELECT first_name,
       last_name
FROM customer c
WHERE NOT EXISTS
    (SELECT 1
     FROM payment p
     WHERE p.customer_id = c.customer_id
       AND amount > 11 )
ORDER BY first_name,
         last_name;

当子查询返回 NULL,会返回true, 也就是返回所有行。

SELECT
   first_name,
   last_name
FROM
   customer
WHERE
   EXISTS( SELECT NULL )
ORDER BY
   first_name,
   last_name;

ANY

与任何子查询返回的 值 匹配就 返回 true

expresion operator ANY(subquery)

表达式一般为 字段
操作符为 >,<,=,<>,>=,<=
ANY 可以与 SOME 替换
子查询 返回的 必须是 一列,

SELECT title
FROM film
WHERE length >= ANY(
    SELECT MAX( length )
    FROM film
    INNER JOIN film_category USING(film_id)
    GROUP BY  category_id );

The = ANY is equivalent to IN operator.

Note that the <> ANY operator is different from NOT IN. The following expression:

x <> ANY (a,b,c) 

is equivalent to

x <> a OR x <> b OR x <> c

ALL

所有子查询返回的值 匹配 则 返回 true

也就是 大于最大,小于最小

SELECT
    film_id,
    title,
    length
FROM
    film
WHERE
    length > ALL (
            SELECT
                ROUND(AVG (length),2)
            FROM
                film
            GROUP BY
                rating
    )
ORDER BY
    length;

你可能感兴趣的:(PostgreSQL)