Připojení k databázi:
např podle podle zadání nulté úlohy.
Další příklady: https://cw.fel.cvut.cz/wiki/courses/a4b33ds/cviceni-4-5
Cílem cvičení je ukázka použití SQL dotazu SELECT
Studnicí testovacích dat nám bude databáze navržená v minulém cvičení. Testovací databáze je přístupná přes konto 0. skupiny.
Vypište v lidské podobě seznam senzorů a veličin, které tyto senzory měří.==
SELECT
*
FROM "senzor";
SELECT
*
FROM "senzor"
JOIN "velicinasenzor" USING (id_senzor);
SELECT
*
FROM "senzor"
JOIN "velicinasenzor" USING (id_senzor)
JOIN "velicina" USING (id_velicina);
SELECT
"senzor".nazev,popis,
"velicina".nazev,
znacka || ' [' || CASE WHEN jednotka IS NULL THEN '-' ELSE jednotka END || ']'
FROM "senzor"
JOIN "velicinasenzor" USING (id_senzor)
JOIN "velicina" USING (id_velicina);
Vypište průměrné denní hodnoty naměřené senzorem s id_senzor = 3 a veličinu id_veličina = 2.
* 1) Začneme tabulkou měření
SELECT
*
FROM "mereni";
* 2) Pomocí WHEREové podmínky specifikujeme záznamy, které nás zajímají
SELECT
*
FROM "mereni"
WHERE id_senzor = 3 AND id_velicina = 2;
* 2b) (Volitelně, pokud bychom chtěli zobrazit průběh, můžeme záznamy seřadit sestupně podle času)
SELECT
*
FROM "mereni"
WHERE id_senzor = 3 AND id_velicina = 2
ORDER BY cas ASC;
* 3) Nyní přistoupíme k agregaci záznamů. Chceme denní průměry, tedy musíme získat z času pouze datum - funkce date(). Připravíme si záznamy pomocí
SELECT
date(cas), hodnota
FROM "mereni"
WHERE id_senzor = 3 AND id_velicina = 2;
SELECT
date(cas), avg(hodnota)
FROM "mereni"
WHERE id_senzor = 3 AND id_velicina = 2
GROUP BY date(cas);
SELECT
date(cas), avg(hodnota)
FROM "mereni"
WHERE id_senzor = 3 AND id_velicina = 2
GROUP BY date(cas)
ORDER BY date(cas) ASC;
SELECT
date(cas), id_senzor, avg(hodnota)
FROM "mereni"
WHERE id_velicina = 2
GROUP BY date(cas), id_senzor
ORDER BY date(cas) ASC, id_senzor;
SELECT
date(cas), id_senzor, avg(hodnota)
FROM "mereni"
WHERE id_velicina = 2
GROUP BY date(cas), id_senzor
HAVING avg(hodnota)>2.1
ORDER BY date(cas) ASC, id_senzor;
Pozor, nezaměňujte WHERE podmínky na atributy před agregací s HAVING podmínkami na hodnoty výsledků agregačních funkcí!!!
SELECT
avg(hodnota)
FROM "mereni"
WHERE id_velicina = 2;
SELECT
date(cas), id_senzor, avg(hodnota)
FROM "mereni"
WHERE id_velicina = 2
GROUP BY date(cas), id_senzor
HAVING avg(hodnota)> ( SELECT avg(hodnota) FROM "mereni" WHERE id_velicina = 2 )
ORDER BY date(cas) ASC, id_senzor;
SELECT
date(cas), id_senzor, avg(hodnota) || (SELECT CASE
WHEN jednotka IS NULL THEN ''
ELSE jednotka END
FROM "velicina" WHERE "velicina".id_velicina = "mereni".id_velicina)
FROM "mereni"
WHERE id_velicina = 2
GROUP BY date(cas), id_senzor, id_velicina
HAVING avg(hodnota)> ( SELECT avg(hodnota) FROM "mereni" WHERE id_velicina = 2 )
ORDER BY date(cas) ASC, id_senzor;