TOP

Lekcja SQL 9. Podzapytania

Do tej pory dane z bazy danych pobieraliśmy za pomocą prostych zapytań i pojedynczej instrukcji SELECT. Jednak coraz częściej będziemy musieli wybrać dane spełniające wiele warunków, a tutaj nie możemy obejść się bez zaawansowanych zapytań. W tym celu w SQL istnieją podzapytania lub zapytania zagnieżdżone, w których jedna instrukcja SELECT jest zagnieżdżona w innej.

Podzapytanie to instrukcja SELECT zagnieżdżona w innym SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE lub w innym podzapytaniu.

Tekst podzapytania musi być ujęty w nawiasy. Zamiast łączenia tabel często używane są podzapytania (JOIN).


1. Filtrowanie za pomocą podzapytań

Tabele bazy danych używane w DBMS Access są tabelami relacyjnymi, co oznacza, że wszystkie tabele mogą być ze sobą powiązane za pomocą wspólnych pól. Załóżmy, że przechowujemy dane w dwóch różnych tabelach i musimy wybrać dane w jednej z nich, w zależności od tego, jakie dane znajdują się w drugiej. W tym celu utworzymy kolejną tabelę w naszej bazie danych. Będzie to np. tabela Sellers z informacjami o dostawcach:

Teraz mamy dwie tabele - Sumproduct i Sellers, które mają to samo pole City. Załóżmy, że musimy policzyć, ile produktów sprzedano w samej Kanadzie. Podzapytania nam w tym pomogą. Zatem najpierw napiszmy zapytanie dla próbki miast znajdujących się w Kanadzie:

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

Teraz przekażmy te dane do poniższego zapytania, które wybierze dane z tabeli Sumproduct:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

Możemy także połączyć te dwa żądania w jedno. Zatem jedno żądanie wyprowadzające dane będzie żądaniem głównym, a drugie żądanie przekazujące dane wejściowe będzie zapytaniem pomocniczym (podrzędnym). Aby wstawić podzapytanie skorzystamy z konstrukcji WHERE ... IN (...), która została omówiona w sekcji Filtrowanie zaawansowane:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

Widzimy, że otrzymaliśmy te same dane, co w przypadku dwóch oddzielnych zapytań. W ten sam sposób możemy zwiększyć głębokość zagnieżdżenia zapytań, zagnieżdżając podzapytania tyle razy, ile chcemy.

2. Wykorzystanie podzapytań jako pól rozliczeniowych

Podzapytania możemy także wykorzystać jako pola obliczeniowe. Wyświetlmy np. liczbę sprzedanych produktów dla każdego sprzedawcy za pomocą następującego zapytania:

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

Pierwsza instrukcja SELECT wyświetla dwie kolumny - Seller_name i Qty. Obliczane jest pole Qty, które powstaje w wyniku wykonania podzapytania ujętego w nawiasy okrągłe. To podzapytanie jest wykonywane raz dla każdego rekordu w polu Seller_name i zostanie wykonane w sumie cztery razy, ponieważ wybrano cztery nazwy sprzedawców.

Również w podzapytaniu klauzula WHERE pełni funkcję łączenia, ponieważ za pomocą WHERE połączyliśmy obie tabele polem City, używając pełnych nazw kolumn (Table.Field).