Важно понимать, в какой момент выполнения запроса вычисляются значения агрегатных функций. А вычисляются они по набору данных, полученному после выполнения соединений из FROM
и применения ограничений из WHERE
.
Проведем ряд экспериментов (мы любим проводить эксперименты, если сомневаешься в чем-то - поэкспериментируй). Получим информацию о заказах и товарах в них:
SELECT p.store_id,
pi.product_id,
pi.price
FROM purchase p
JOIN purchase_item pi
ON pi.purchase_id = p.purchase_id
ORDER BY p.store_id
store_id | product_id | price |
---|---|---|
100 | 3 | 26100.00 |
100 | 3 | 26100.00 |
201 | 4 | 21500.00 |
201 | 12 | 100000.00 |
301 | 7 | 4900.00 |
302 | 9 | 44500.00 |
302 | 8 | 38300.00 |
302 | 8 | 38300.00 |
... | ... | ... |
Теперь найдем минимальную стоимость товара в заказах в пределах магазина:
SELECT p.store_id,
min(pi.price) as price_min
FROM purchase p
JOIN purchase_item pi
ON pi.purchase_id = p.purchase_id
GROUP BY p.store_id
ORDER BY p.store_id
store_id | price_min |
---|---|
100 | 26100.00 |
201 | 21500.00 |
301 | 4900.00 |
302 | 38300.00 |
... | ... |
А теперь оставим только товары, проданные дороже 25000:
SELECT p.store_id,
min(pi.price) as price_min
FROM purchase p
JOIN purchase_item pi
ON pi.purchase_id = p.purchase_id
WHERE pi.price > 25000
GROUP BY p.store_id
ORDER BY p.store_id
store_id | price_min |
---|---|
100 | 26100.00 |
201 | 100000.00 |
302 | 38300.00 |
Для 201 магазина price_min
сменилась с 21500.00 на 100000.00, а строка с 301-м магазином вообще пропала. Чтобы посмотреть, по какому набору данных вычислялась агрегатная функция min
, достаточно в первый запрос добавить условие на стоимость:
SELECT p.store_id,
pi.product_id,
pi.price
FROM purchase p
JOIN purchase_item pi
ON pi.purchase_id = p.purchase_id
WHERE pi.price > 25000
ORDER BY p.store_id
store_id | product_id | price |
---|---|---|
100 | 3 | 26100.00 |
100 | 3 | 26100.00 |
201 | 12 | 100000.00 |
302 | 8 | 38300.00 |
302 | 8 | 38300.00 |
302 | 9 | 44500.00 |
... | ... | ... |