Autor: 05.12.2023
SQL - podzapytania
Podzapytania (znane też jako zapytania zagnieżdżone) często sprawiaja problemy początkującym użytkownikom języka SQL. Dlatego postaramy się opisać ten ważny temat z użyciem prostych i przyjaznych przykładów. Zakładamy, że masz podstawową wiedzę na temat SQL i posiadasz umiejętność pisania zapytań typu SELECT.
Czym są podzapytania
Podzapytanie to nic innego jak zapytanie zagnieżdżone w zapytaniu. Spójrz na poniższy przykład:
SELECT 1 + 1 + 1;
Wynik to oczywiście 3 - tego typu zapytanie arytmetyczne to standardowa funkcjonalność języka SQL. To samo możemy osiągnąć za pomocą podzapytań:
SELECT 1 + (SELECT 1 + (SELECT 1));
Rezultaty zwracane są od podzapytań najbardziej zagnieżdżonych, do najbardziej zewnętrznych.
- Zapytanie najbardziej zagnieżdżone zwraca 1.
- Ten wynik jest dodawany do kolejnego podzapytania i mamy na tym etapie 2.
- To z kolei jest dodawane do najbardziej zewnętrznego zapytania (tego poza nawiasami) i mamy w rezultacie wynik 3.
Praktyczny przykład podzapytania
Teraz zajmiemy się bardziej praktycznym przykładem. Mamy tabelę employees:
Wyobraź sobie, że twoim zadaniem jest wyszukanie pracownika, który zarabia najwięcej.
Wersja bez podzapytania
Bez znajomości podzapytań, do rozwiązania problemu doprowadzą dwa osobne zapytania. W pierwszej kolejności wyszukamy najwyższą pensję:
SELECT MAX(salary) FROM employees;
Wynik:
A teraz wyszukamy konkretnego użytkownika:
SELECT name, surname FROM employees WHERE salary = 1000000;
Wynik wygląda tak:
Udało nam się osiągnąć pożądany wynik - mamy pracownika, który zarabia najwięcej. Ale wymagało to użycia dwóch osobnych zapytań.
Wersja z użyciem podzapytania
Tak wygląda kod SQL:
SELECT name, surname FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
Wynik jest taki sam:
Udało nam się osiągnać to samo, w bardziej elegancki sposób. Do warunku WHERE dodaliśmy kolejne zapytanie czyli SELECT MAX(salary) FROM employees. Możemy więc powiedzieć, że warunkiem są rekordy spełniające wynik podzapytania. Te rekordy, które mają najwyższą wartośc w kolumnie salary.
Kolejny przykład
Aby przećwiczyć koncepcję podzapytań, pokażemy jeszcze jeden przykład. Tabela jest ta sama. Tym razem jednak, chcemy wyszukać pracowników z najwyższą pensją w danym dziale (kolumna department). Użyjemy następującego zapytania:
SELECT name, surname, department
FROM employees WHERE id IN(SELECT id FROM employees
GROUP BY department
HAVING MAX(salary));
Nasze podzapytanie wyszukuje identyfikatory pracowników, którzy mają najwyższe pensje w danym dziale. Dlatego użyliśmy grupowania oraz funkcji MAX(), aby dla danego działu znaleźć najwyższe wynagrodzenie. Wynik posłużył nam jako kryterium dla głównego zapytania SELECT. Warto zwrócić uwagę na użycie IN - dzięki tej klauzuli wyszukujemy identyfikatory pracowników, zawarte w przedziale zwróconym przez podzapytanie.
A tak wygląda wynik:
name | surname | MAX(salary) |
John | Doe | 1000000 |
Mark | Rooney | 15000 |
Mell | Gray | 3000 |
Podsumowanie
Mamy nadzieję, że po lekturze tego artykułu wiesz już jak używać podzapytań. To bardzo ważna technika, niezwykle pomocna w sytuacji gdy mamy złożone warunki w naszym zapytaniu.