ALL, SOME, ANY

ALL, SOME, ANY

Бывают случаи, когда мы хотим сделать условие со сравнением с несколькими значениями из подзапроса. Это тот случай, когда, условие гласит: column1 должна быть больше, чем значения из подзапроса. Так, мы используем операторы ALLSOME или ANY перед открывающей скобкой подзапроса:

select
    column1,
    column2
from
    table1
where column1 > any(select column3 from table2 )
  1. All - условие должно быть верно для всех значений.
  2. ANY и SOME - условие должно быть верно хотя бы для одного значения из подзапроса.

Также из примера мы увидели, что подзапрос в условии никогда не возвращает несколько колонок, потому что мы сравниваем одно значение с результатом из подзапроса. Если вы хотите сравнить два значения, тогда нужно писать JOIN.

После подзапроса в условии не ставится алиас.

Даже если мы создали CTE и хотим использовать его в условии, нет возможности просто написать CTE в условии, как в FROM. Нужно всегда писать подзапрос:

with cte as
(select column1 from table1)
select
    *
from table2
where column2 > cte;

Так нельзя! Нужно вот так:

with cte as
(select column1 from table1)
select
    *
from table2
where column2 > (select column1 from cte)

Рассмотрим пример, где мы можем использовать подзапрос в условии.

Вернемся к нашей задаче с 5 лучшими футболистами из команды, которая имеет наиболее высокий средний рейтинг:

with cte as (
select
    club,
    avg(overall) as avg_overall
from
    fifa_players_2018
group by
    club
order by
    avg_overall desc
limit 1
    )
select
    club,
    short_name,
    overall
from
    fifa_players_2018 as players
where  club = (select club from cte)
order by
    overall desc
limit 5

Мы просто вывели 5 лучших футболистов клуба, что мы отфильтровали с помощью подзапроса CTE

Это решение изящнее и проще, чем решение с использованием JOIN, однако у него есть недостаток. Мы не смогли вывести рейтинг клуб в конечный SELECT.

И это подводит нас к следующей теме.