Когда запрос / подзапрос возвращает NULL, а когда вообще никакого значения? - PullRequest
2 голосов
/ 27 апреля 2010
  1. Если в запросе / подзапросе не найдено ни одной подходящей строки, он либо возвращает NULL, либо вообще не имеет значения, то есть даже значения NULL. На основе по каким критериям запрос / подзапрос возвращает значение NULL и когда он не возвращает никаких результатов, даже значения NULL?

  2. Будет ли скалярный подзапрос всегда возвращать NULL, если нет совпадающие строки найдены? Я предполагаю, что самый внешний скалярный запрос также возвращает NULL, если строки не найдены?

  3. SELECT FirstName, LastName, YEAR(BirthDate)
    FROM Persons
    WHERE YEAR(BirthDate) IN (SELECT YearReleased FROM Albums);
    
    • Если подзапрос не находит результатов, является ли предложение WHERE внешнего запрос переведен на WHERE YEAR(BirthDate) IN (null);?

    • Если вместо этого предложение WHERE переведено в WHERE YEAR(BirthDate) IN();, не должно ли это быть ошибкой, поскольку как значение YEAR(BirthDate) можно сравнить с ничем?

Ответы [ 3 ]

4 голосов
/ 27 апреля 2010

Подзапрос вернет NULL, только когда YearReleased будет NULL, в противном случае будет пустой набор записей, что сделает упомянутый вами случай IN ().

Очень важно различать два, поскольку они означают совершенно разные вещи. NULL указывает, что есть что-то, что должно быть SELECT ed, хотя это значение указывает, так сказать, на «отсутствие ценности». Пустой набор записей означает, что не было ничего, что могло бы быть выбрано в соответствии с указанными критериями.

РЕДАКТИРОВАТЬ : обновлено, чтобы показать примеры результатов

alt text

Первые два запроса просто показывают, что находится в двух таблицах. Третий запрос - это ваш запрос, а четвертый запрос просто показывает, что он дает эквивалентный результат (без строк), если вы замените подзапрос на NULL. Последний запрос просто показывает, что сам подзапрос просто возвращает большой список NULL s.

2 голосов
/ 10 ноября 2016
SELECT FirstName, LastName, YEAR(BirthDate)
FROM Persons a
left join (SELECT YearReleased FROM Albums) b on year(b.YearReleased) = year(a.BirthDate)
where year(b.YearReleased) = year(a.BirthDate)
2 голосов
/ 27 апреля 2010

а. Если соответствующих строк нет, результирующий набор всегда будет пустым. Для значения NULL нет специальной обработки.

б. Это не правда. Если соответствующих строк нет, результирующий набор всегда пуст по определению. Результат скалярной функции не является набором результатов, поэтому он будет иметь значение NULL или другое значение.

с.1. Если подзапрос не возвращает строк, выражение «IN» всегда будет возвращать false. Набор не будет NULL.

с.2. Справедливо сравнить YEAR(BirthDate) с пустым набором. Он всегда будет возвращать false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...