Выбор ответа Middle Подзапросы и CTE обновлено

Что писать в SELECT внутри EXISTS

Вопрос

Чем отличаются EXISTS (SELECT 1 FROM ...), EXISTS (SELECT * FROM ...) и EXISTS (SELECT NULL FROM ...)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ничем: EXISTS проверяет лишь наличие строк. EXISTS истинен, если подзапрос вернул хотя бы одну строку; какие значения в этой строке, неважно, даже NULL.

Варианты ответа

  1. SELECT NULL всегда даёт false, потому что значение NULL
  2. SELECT * медленнее, потому что читает все колонки строки
  3. SELECT 1 работает в PostgreSQL, а в других СУБД нет
  4. Ничем: EXISTS проверяет лишь наличие строкправильный ответ

Разбор

EXISTS истинен, если подзапрос вернул хотя бы одну строку; какие значения в этой строке, неважно, даже NULL. Колонки из SELECT * внутри EXISTS не вычисляются, поэтому разницы в скорости нет. SELECT 1 это просто договорённость о читаемости, она работает в любой СУБД.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.