SQL: Zapytania zagnieżdżone

Baza danych do pobrania: sklep
Podzapytanie WHERE
SELECT nazwa_kolumny
FROM nazwa_tabeli WHERE nazwa_kolumny
IN (
SELECT nazwa_kolumny2
FROM nazwa_tabeli2
WHERE warunki
);
Niech zapytanie zwróci nam daty, w których dokonano transakcji na produkcie o nazwie Produkt 1.
SELECT data FROM transakcja WHERE produkt_id IN (SELECT id FROM produkt WHERE nazwa = "Produkt 1");
+---------------------+ | data | +---------------------+ | 2014-03-07 03:30:14 | | 2014-02-24 05:54:52 | +---------------------+
W naszym zapytaniu szukaliśmy takich dat, dla których produkt_id z tabeli transakcja znajdował się w zbiorze wyników podzapytania, w którym szukaliśmy id produktu o nazwie Produkt 1.
Podzapytanie FROM
Stwórzmy zapytanie, w którym wypiszemy jednocześnie datę transakcji, nazwę produktu, jego cenę oraz nazwę producenta. Ograniczmy wynik do transakcji z 2015 roku, dla produktów droższych niż 1900.
SELECT
podz.tradata AS "Data transakcji",
podz.produktnazwa AS "Nazwa produktu",
podz.prodcen AS "Cena", podz.proname AS "Producent"
FROM (
SELECT
transakcja.data as tradata,
transakcja.produkt_id,
produkt.nazwa as produktnazwa,
produkt.cena as prodcen, producent.nazwa as proname
FROM transakcja
LEFT JOIN produkt
ON transakcja.produkt_id = produkt.id
LEFT JOIN producent
ON produkt.producent_id = producent.id
) as podz
WHERE year(podz.tradata) = 2015 AND podz.prodcen > 1900;
+---------------------+----------------+---------+--------------+ | Data transakcji | Nazwa produktu | Cena | Producent | +---------------------+----------------+---------+--------------+ | 2015-07-20 21:02:47 | Produkt 987 | 1919.42 | producent 5 | | 2015-07-05 06:25:05 | Produkt 154 | 1932.6 | producent 20 | | 2015-10-14 13:19:50 | Produkt 961 | 1924.76 | producent 6 | | 2015-01-04 12:57:53 | Produkt 941 | 1951.7 | producent 11 | | 2015-12-16 04:47:45 | Produkt 401 | 1907.1 | producent 2 | | 2015-10-16 04:41:00 | Produkt 509 | 1911.76 | producent 3 | | 2015-09-28 10:43:26 | Produkt 590 | 1994.75 | producent 7 | | 2015-07-06 14:27:18 | Produkt 970 | 1961.89 | producent 6 | | 2015-02-04 13:47:35 | Produkt 284 | 1963.17 | producent 3 | +---------------------+----------------+---------+--------------+
Dla porównania, ten sam efekt otrzymamy stosując poniższe rozwiązanie – odwołując się jednocześnie do wielu tabel. Do Waszej oceny pozostawiam, która wersja jest dla Was prostsza czy czytelniejsza.
SELECT transakcja.data AS "Data transakcji", produkt.nazwa AS "Nazwa produktu", produkt.cena AS "Cena", producent.nazwa AS "Producent" FROM transakcja, produkt, producent WHERE transakcja.produkt_id = produkt.id AND produkt.producent_id = producent.id AND year(transakcja.data) = 2015 AND produkt.cena > 1900;