Język SQL jest dosyć prosty, lecz mało kto umie zagnieżdżać zapytania w jednym poleceniu. Przeważnie każdy stosuje podstawowe zagnieżdżanie zapytań, żeby wyciągnąć dane id, które jest szukane lub niepożądane.
Najczęściej stosowana składnia to
SELECT
idProduktu,
nazwa,
przyjaznyLink
FROM
produkty
WHERE
idProduktu NOT IN (
SELECT
idProduktu
FROM
produktyKategorie
WHERE
wylaczone=1
)
ORDER BY
2;
Standardowe zapytanie
Jest to najprostszy przykład zagnieżdżonych zapytań. Teraz przyszedł czas na wyciągnięcie listy produktów oraz kategorii do których są przypisane. Możemy użyć do tego zapytania:
SELECT
p.idProduktu,
nazwa,
przyjaznyLink,
COUNT(idKategorii) AS iloscKategorii
FROM
produkty AS p,
produktyKategorie AS k
WHERE
p.idProduktu=k.idProduktu AND
wylaczone=0
GROUP BY
1
ORDER BY
2;
Pierwszy poziom wtajemniczenia
Problem polega na tym, że dostaniemy to co chcieliśmy, ale ograniczone tylko do produktów, które są przypisane do co najmniej jednej kategorii. Na tej liście nie będzie produktów, które nie są przypisane do żadnej kategorii. Aby zobaczyć wszystkie produkty, będziemy musieli zmodyfikować zapytanie i połączyć tabele produkty i produktyKategorie za pomocą polecenia LEFT JOIN:
SELECT
p.idProduktu,
nazwa,
przyjaznyLink,
COUNT(idKategorii) AS iloscKategorii
FROM
produkty AS p
LEFT JOIN
produktyKategorie AS k ON (
p.idProduktu=k.idProduktu AND
wylaczone=0
)
GROUP BY
1
ORDER BY
2;
Zagnieżdzone zapytania
Są to podstawowe metody zagnieżdżania zapytań i wyciągania danych. Jednak kiedy musimy wyciągnąć np listę produktów wraz z ilością przypisanych kategorii włączonych i wyłączonych, sprawa się komplikuje. Wtedy z pomocą przychodzi łączenie tabel JOIN oraz bardziej skomplikowane zagnieżdżenie zapytań.
SELECT
p.idProduktu,
nazwa,
przyjaznyLink,
k1.iloscKategoriiWlaczonych,
k2.iloscKategoriiWylaczonych
FROM
produkty AS p
JOIN (
SELECT
idProduktu,
COUNT(idKategorii) AS iloscKategoriiWlaczonych
FROM
produktyKategorie
WHERE
aktywne=1
GROUP BY
1
) AS k1
USING (idProduktu)
JOIN (
SELECT
idProduktu,
COUNT(idKategorii) AS iloscKategoriiWylaczonych
FROM
produktyKategorie
WHERE
aktywne=0
GROUP BY
1
) AS k1
USING (idProduktu)
ORDER BY
2;
Taki sam rodzaj zagnieżdżonych zapytań możemy również używać w poleceniach INSERT SELECT, UPDATE itd:
UPDATE
produkty AS p
JOIN (
SELECT
idProduktu,
COUNT(idKategorii) AS iloscKategoriiWlaczonych
FROM
sklep_pk
WHERE
aktywne=1
GROUP BY
1
) AS k1
USING (idProduktu)
JOIN (
SELECT
idProduktu,
COUNT(idKategorii) AS iloscKategoriiWylaczonych
FROM
sklep_pk
WHERE
aktywne=0
GROUP BY
1
) AS k2
USING (idProduktu)
SET
p.iloscKategoriiWlaczonych=k1.iloscKategoriiWlaczonych,
p.iloscKategoriiWylaczonych=k2.iloscKategoriiWylaczonych
WHERE
idProduktu IN (
SELECT
DISTINCT
idProduktu
FROM
kategorie AS k,
produktyKategorie AS p
WHERE
p.idKategorii=k.idKategorii AND
przyjaznyLink IN ("ala_ma_kota", "kot_ma_ale")
);
Taki sposób tworzenia zagnieżdżonych zapytań sprawia, że nagle w jednym zapytaniu możemy wyciągać ogromne ilości danych z dziesiątek tabel, które są ze sobą połączone w dowolny sposób.
16 lipca 2014 o 12:24
Bardzo trafny artykuł, będę czekał z niecierpliwością na nowe opisy 🙂