Разница между WITH и SELECT FROM SELECT

Рейтинг: 3Ответов: 3Опубликовано: 04.08.2023

В чём разница между использованием SELECT FROM SELECT и WITH?

Например, есть два запроса:

SELECT * FROM
    (SELECT SUM(D) as sum_d, E, SUM(F) as sum_f FROM second_table GROUP BY E) as second
WHERE second.E == 5

и

WITH second AS
(
    SELECT SUM(D) as sum_d, E, SUM(F) as sum_f FROM second_table GROUP BY E
)
SELECT * FROM second WHERE second.E == 5

Будет ли какая-то разница в работоспособности этих двух запросов?

Ответы

▲ 8

Нет. Ни в скорости работы, ни в результатах запроса никакой разницы не будет. Это один и тот же запрос, с разным синтаксисом

▲ 2

Что вы подразумеваете под работоспособностью? Если синтаксис правильный, то оба запроса вернут вам одинаковую выборку. По сути, в обоих случаях вы оперируете теми же самыми данными, только в первом у вас подзапрос, а во втором - представление (view). Что касается производительности, то нужно смотреть план запроса, скорее всего всё будет 1:1.

WITH-представление чаще всего нужно для переиспользования запроса в нескольких местах.

См. https://stackoverflow.com/a/30078783/12473843

▲ 2

Все приведенные запросы имеют один и тот же план выполнения. По факту введите сюда описание изображения

Еще 1 запрос, аналогичный приведенным

SELECT SUM(D) as sum_d, E, SUM(F) as sum_f 
FROM second_table 
GROUP BY E
having e=5

Еще запрос (по комментарию @teran). Стоимости не меняются.

SELECT SUM(D) as sum_d, E, SUM(F) as sum_f 
FROM second_table 
WHERE E = 5
GROUP BY E

Стоимости указаны для таблицы размером 1200 строк.