Являются ли ВСЕ функции избыточными, когда внутри них есть функция MAX в sql?

#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 было бы достаточно.

введите описание изображения здесь