Следующее утверждение найдет всех клиентов, у которых нет заказа или у кого есть заказ? - PullRequest
1 голос
/ 10 марта 2020
SELECT
    name
FROM
    customers
WHERE
    NOT EXISTS (
        SELECT
            NULL
        FROM
            orders
        WHERE
            orders.customer_id = customers.customer_id
    )
ORDER BY
    name;

и если вы можете сказать мне, как использовать не существует и выберите ноль?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Ваш запрос выглядит хорошо. Я бы написал это как:

SELECT c.name
FROM customers c
WHERE NOT EXISTS (SELECT 1
                  FROM orders o
                  WHERE o.customer_id = c.customer_id
                 )
ORDER BY c.name;

Примечания:

  • Это эквивалентно вашему запросу.
  • Здесь используются псевдонимы таблиц, которые я рекомендую.
  • Я просто не фанат SELECT NULL. NULL обычно означает «отсутствует» или «неизвестен». Плюс SELECT 1 легче набирать. Однако EXISTS проверяет наличие строк , поэтому значение не имеет значения.
0 голосов
/ 10 марта 2020

Условие not exists обеспечивает отсутствие записи в таблице orders для соответствующего customer_id.

. В этом запросе отображаются все клиенты, у которых нет заказа.

В действительности не имеет значения, что возвращает подзапрос в условии not exists: смысл not exists состоит в том, чтобы проверить, возвращает ли подзапрос что-то . Часто встречаемое соглашение - использовать select 1, но на самом деле это может быть что угодно.

...