#sql
#sql
Вопрос:
Сейчас я практикую sql на sqlzoo. Мне приходит в голову, зачем нам нужны ВСЕ функции, когда внутри у нас есть функция MAX, поскольку функция MAX выводит только одно значение?
Какая разница, если мы исключим функцию ALL?
SELECT name FROM bbc
WHERE population > ALL
(SELECT MAX(population)
FROM bbc
WHERE region = 'Europe')
AND region = 'South Asia'
Ответ №1:
Эти выражения:
WHERE population > ALL (SELECT population
FROM bbc
WHERE bbc.region = 'Europe'
)
и:
WHERE population > (SELECT MAX(population)
FROM bbc
WHERE bbc.region = 'Europe'
)
почти точно такие же. Разница возникает, когда WHERE
предложение отфильтровывает все строки. В этом случае population > ALL (. . .)
вычисляется как true. Однако population > (SELECT MAX() . . .)
этого не делает.
Причиной является NULL
значение. Без совпадений MAX()
вычисляется как NULL
.
В вашем случае должна применяться та же логика. Если WHERE
отфильтровываются все строки, то MAX()
возвращается NULL
. ALL
Не будет вычисляться true
из-за NULL
. Однако, если вы не учитываете ALL
, он должен возвращать все строки.
Ответ №2:
Во-первых, ALL
это не функция, это оператор.
Во-вторых, ваш запрос должен измениться в зависимости от того, каков ваш ожидаемый результат (это связано с NULL
проблемой в SQL)
Если вам нужно вернуть некоторые строки, даже если подзапрос не возвращает ни одной строки (в данном случае, т. Е. нет области 'Europe'
), тогда вам следует использовать ALL
или NOT EXISTS
:
SELECT name FROM bbc
WHERE population > ALL (
SELECT population
FROM bbc
WHERE region = 'Europe')
AND region = 'South Asia;
(предположим, что в region = 'South Asia'
есть какое-то имя)
Если вы хотите не возвращать строку, если подзапрос не возвращает строку, тогда вам следует использовать
SELECT name FROM bbc
WHERE population > (
SELECT MAX(population)
FROM bbc
WHERE region = 'Europe'
)
AND region = 'South Asia;
Ответ №3:
Оператор All требуется только для того, когда ваши результаты представлены в нескольких строках. Когда ваши результаты отображаются в одной строке с использованием ключевого слова max или top 1 в то время, оператор «ALL» не является обязательным.
Ответ №4:
Я думаю, вам следует переписать свой запрос, это не генерирует строк:
select * from generate_series(1,10) x
where x > all(select max(t) from generate_series(1,5) t where t = 100);
И так ли это:
select * from generate_series(1,10) y
where y > (select max(t) from generate_series(1,5) t where t = 100);
Следующий может быть вашим желаемым запросом. То есть, это покажет страны, население которых превышает население ВСЕХ стран Европы; и если в Европе больше нет стран (ГДЕ region = ‘europe’ не выдает строк, поэтому это можно считать нулевым населением), и вам нужно показать те страны, население которых превышает нулевое население Европы, используйте это вместо: field > all (select another_field
:
select * from generate_series(1,10) z
where z > all(select t from generate_series(1,5) t where t = 100)
ВСЕ не является избыточным. field > (SELECT MAX(
может не дать желаемых результатов. Кроме того, у ALL лучшая семантика.
Однако в запросе вашего вопроса ALL является избыточным, поскольку вы используете MAX . В большинстве случаев ALL не предназначен для использования в сочетании с MAX . field > ALL (SELECT another_field
было бы достаточно.