|
![]() | Strana 6 (IS NULL, SELECT výraz) | ![]() | Sbírka příkladů SQL dotazů | Strana 8 (IN, BETWEEN, subdotaz) | ![]() |
Příklad 13
Zadání: Zjistěte obraty a počty faktur firem po měsících.
SQL:
SELECT Firmy.nazev, Month(dat1) AS Měsíc,
COUNT(Faktury.cislo) AS Počet,
SUM(Faktury.castka) AS Suma_Kč
FROM Faktury, Firmy
WHERE Faktury.firma= Firmy.cislo
GROUP BY Firmy.nazev,Month(dat1)
Poznámka:
Pro skupinu je použita hodnota výrazu, místo funkce jazyka Month
by šlo použít i SQL funkci EXTRACT
ve tvaru
EXTRACT (MONTH FROM dat1).
Příklad 14
Zadání: Vypište seznam všech firem a počet jejich faktur, včetně těch firem, které nemají ještě ani jednu fakturu.
SQL:
SELECT Firmy.nazev, COUNT(Faktury.cislo)
FROM Firmy LEFT OUTER JOIN Faktury
ON (Firmy.cislo=Faktury.firma)
GROUP BY Firmy.nazev
Poznámky:
a) Zajímavější by to bylo v případě, kdyby nás zajímaly pouze faktury jednoho druhu. Kam umístit podmínku Faktury.druh=2?
Správná odpověď je do podmínky JOINu za ON:
SELECT Firmy.nazev, COUNT(Faktury.cislo)
FROM Firmy LEFT OUTER JOIN Faktury
ON (Firmy.cislo=Faktury.firma AND Faktury.druh=2)
GROUP BY Firmy.nazev
Kdyby se podmínka umístila (chybně) do části WHERE
SELECT Firmy.nazev, COUNT(Faktury.cislo)
FROM Firmy LEFT OUTER JOIN Faktury
ON (Firmy.cislo=Faktury.firma)
WHERE Faktury.druh=2
GROUP BY Firmy.nazev
výslekem by byl nesprávný výsledek, protože podmínka WHERE se vyhodnocuje až po provedení JOINu, a toto vyhodnocení JOINu neobsahuje sloupec druh.
b) Je použito jedno vnější propojení. Pokud by existovala další tabulka relačně svázaná s tabulkou Faktury (nazvaná Polozky) přes dvojici sloupců id_fakt
, je možné vytvořit dotaz se dvěma vnějšími propojeními:
SELECT *
FROM Firmy LEFT OUTER JOIN Faktury
LEFT OUTER JOIN Polozky ON (Faktury.id_fakt=Polozky.id_fakt)
ON (Firmy.cislo=Faktury.firma)
nebo je možné uzávorkovat
SELECT *
FROM (Firmy LEFT OUTER JOIN Faktury ON (Firmy.cislo=Faktury.firma))
LEFT OUTER JOIN Polozky ON (Faktury.id_fakt=Polozky.id_fakt)
![]() | Strana 6 (IS NULL, SELECT výraz) | ![]() | Sbírka příkladů SQL dotazů | Strana 8 (IN, BETWEEN, subdotaz) | ![]() |