W dzisiejszym artykule na blogu przyjrzymy się bliżej funkcjonalności znanym jako SUBQUERY w SQL (po polsku: zapytania zagnieżdżone). Podzapytania są jednym z kluczowych elementów SQL, które pozwalają na tworzenie bardziej złożonych i dynamicznych zapytań do baz danych. Pozwala to na ekstrakcję informacji, które nie są bezpośrednio dostępne w pojedynczym zapytaniu.
Czym jest SUBQUERY (zapytania zagnieżdżone)
SUBQUERY, czyli podzapytanie, to zapytanie SQL umieszczone wewnątrz innego zapytania SQL. Podzapytania są zagnieżdżone wewnątrz zapytań zewnętrznych i wykonywane są przed zapytaniem zewnętrznym. Wynik podzapytania może być użyty jako wartość, kolumna lub tabela w zapytaniu zewnętrznym.
Podzapytania można wykorzystać w różnych częściach zapytań SQL, takich jak:
- W klauzuli SELECT,
- W klauzuli FROM,
- W klauzuli WHERE,
- W klauzuli HAVING,
- W klauzuli JOIN.
Rodzaje SUBQUERY w SQL
Istnieją trzy główne rodzaje podzapytań zagnieżdżonych:
Skalarne podzapytania (Scalar SUBQUERY)
Zwracają jedną wartość (jedną kolumnę i jeden wiersz). Stosowane są przede wszystkim w klauzuli SELECT oraz w warunkach porównania.
SELECT product_name, price, (SELECT AVG(price) FROM products) as average_price FROM products;Podzapytania zwracające listę (List SUBQUERY)
Zwracają jedną kolumnę z wieloma wierszami. Najczęściej stosowane są w klauzuli WHERE oraz HAVING.
SELECT * FROM orders WHERE order_id IN (SELECT order_id FROM order_items WHERE product_id = 101);Podzapytania zwracające tabelę (Table SUBQUERY)
Zwracają tablicę wartości, czyli wiele wierszy i kolumn. Stosowane są przede wszystkim w klauzuli FROM.
SELECT p.name, o.total_amount FROM products p JOIN (SELECT product_id, SUM(quantity*price) as total_amount FROM order_items GROUP BY product_id) o ON p.product_id = o.product_id;Zasady korzystania z zapytań zagnieżdżonych w SQL
- Kolejność wykonywania – Zawsze najpierw wykonywane są podzapytania, a następnie zapytanie zewnętrzne.
- Zagnieżdżanie – Podzapytania mogą być zagnieżdżone na wielu poziomach.
- Zakres – Kolumny używane w podzapytaniu muszą być dostępne w jego zakresie. Oznacza to, iż nie można bezpośrednio odwoływać się do kolumn z zapytania zewnętrznego, chyba iż są one częścią klauzuli korzystającej z podzapytania (np. w warunkach łączenia w klauzuli JOIN).
- Używanie aliasów – W przypadku podzapytań zagnieżdżonych w klauzuli FROM, zalecane jest stosowanie aliasów dla zwracanych tabel, aby uprościć zapytanie zewnętrzne i uniknąć niejednoznaczności.
- Optymalizacja – Choć podzapytania są potężnym narzędziem, warto pamiętać o optymalizacji zapytań. W niektórych przypadkach zamiast podzapytań lepiej użyć technik takich jak JOIN, gdyż mogą one przyspieszyć wykonanie zapytania.
Przykłady użycia SUBQUERY w SQL
Wyszukiwanie rekordów spełniających warunek oparty na wyniku podzapytania:
SELECT first_name, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);W powyższym przykładzie zapytanie zewnętrzne zwraca pracowników, których pensja przekracza średnią pensję wszystkich pracowników (wynik podzapytania).
Filtrowanie rekordów dzięki podzapytania zwracającego listę:
SELECT * FROM customers WHERE country NOT IN (SELECT DISTINCT country FROM suppliers);W powyższym przykładzie zapytanie zewnętrzne zwraca klientów, którzy nie znajdują się w krajach, w których są dostawcy.
Użycie podzapytania w klauzuli FROM:
SELECT customer_id, AVG(total_price) FROM (SELECT customer_id, SUM(price*quantity) as total_price FROM orders JOIN order_items ON orders.order_id = order_items.order_id GROUP BY orders.customer_id, orders.order_id) as subquery GROUP BY customer_id;W powyższym przykładzie zapytanie zewnętrzne oblicza średnią wartość zamówienia dla wszystkich klienta, na podstawie wyników podzapytania zagnieżdżonego w klauzuli FROM.
Podsumowanie
SUBQUERY w SQL (zapytania zagnieżdżone) to potężne narzędzie, które pozwala na tworzenie bardziej złożonych kwerend. Pozwala na zagnieżdżanie zapytań, filtrowanie danych na podstawie wyników innych zapytań, a także tworzenie bardziej dynamicznych zestawień. Pamiętając o zasadach korzystania z podzapytań i dbając o optymalizację zapytań, możemy wykorzystać ich pełen potencjał w pracy z bazami danych.