Table of Contents

SQL

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

Dotazování na data v SQL - SELECT

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.

Model senzorové sítě

SQL - SELECT

Seznam senzorů a veličin

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);

Průměrné denní hodnoty měření

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;

Průměrné hodnoty veličiny větší než limit

 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;

Další datové operace v SQL - SELECT