SQL Dotazy

Data na hraní

Aby bylo na čem SQL dotazy zkoušet, je vhodné databázi naplnit daty. Pokud nemáte data skutečná, je potřeba si nějaká vygenerovat. Mnoho SQL klientů umí importovat CSV soubory do databáze. Je mnohem hezčí, když výsledky vašich SQL dotazů produkují alespoň trochu smysluplná data, a proto vám zde nabízíme něco dat na hraní.

Generování náhodných dat

Vygenerování 50 náhodných čísel od 10 do 20:

SELECT x.*, ROUND(10 + 20 * RANDOM()) AS y
FROM generate_series(1, 50) AS x

Vygenerování 50 náhodných jmen z tabulky svátků (jména se mohou opakovat):

SELECT r.*, svatek.*
FROM
  (
    SELECT x, FLOOR(1 + 365 * RANDOM()) AS y
    FROM generate_series(1, 50) AS x
  ) AS r
LEFT JOIN svatky.svatek ON svatek.doy = r.y

Příprava databáze

  • prorekvizitou pro další práci je odevzdaný ER-diagram
  • při odevzdání - zadání SQL dotazů

Úpravy nutné pro úspěšné vytvoření databáze - DB Designer

  • Abychom nemuseli ručně generovat pro každý záznam hodnotu primárního klíče, je užitečné založit sekvenci - prostředek, jak získat unikátní identifikátory 1,2,3,….
  CREATE SEQUENCE seq_tabulka;
  • abychom nemuseli pokaždé explicitně nastavovat hodnotu primárního klíče v INSERTu, necháme jí defaultně nastavit. Aktuální hodnotu sekvence dostaneme pomocí funkce nextval().
 CREATE TABLE tabulka (
     id_tabulka int NOT NULL UNIQUE DEFAULT nextval('seq_tabulka'),
     ...,
   PRIMARY KEY (id_tabulka));

* v SQL kódu vygenerovaném DB Designerem (v módu MySQL) je nutné výče uvedené dopsat pro každou tabulku.

* dále, DB Designer ignoruje v módu MySQL referenční integrity, opět je nutné je dopsat přímo do vygenerované SQL kódu pomocí REFERENCES

 CREATE TABLE tabulka (
     id_tabulka int NOT NULL UNIQUE DEFAULT nextval('seq_tabulka'),
     ...,
     id_referencovana tabulka int REFERENCES referencovanatabulka
     ...,
   PRIMARY KEY (id_tabulka));

Úpravy nutné pro úspěšné vytvoření databáze - MicroOLAP Designer

* pro primární klíče nepoužívejte volbu autoincrement, ale sekvence

  • sekvence je možné buďto zadat klikacím způsobem nebo je v SQL klientu předpřipravit pomocí

CREATE SEQUENCE seq_tabulka;

  • defaultní hodnotu primátního klíče nastavte na nextval('seq_tabulka')

Ruční vytvoření databáze

* Pro úplnost - databázi lze vytvořit ručně, např. pomocí následujících dotazů

  • (ruční způsob má tu výhodu, že je vše vidět na jednom místě a nic není skryto za klikání myši)
 CREATE SEQUENCE seq_mistnost;
 CREATE TABLE mistnost (
      id_mistnost     int             NOT NULL DEFAULT nextval('seq_mistnost'),
      nazev           varchar(32)     NOT NULL UNIQUE,
      PRIMARY KEY (id_mistnost));
 CREATE SEQUENCE seq_senzor;
 CREATE TABLE senzor (
      id_senzor       int             NOT NULL UNIQUE DEFAULT nextval('seq_senzor'),
      nazev           varchar(64)     NOT NULL UNIQUE,
      popis           text,
      id_mistnost     int             REFERENCES mistnost ON UPDATE CASCADE ON DELETE SET NULL,
      PRIMARY KEY (id_senzor));
 CREATE SEQUENCE seq_velicina;
 CREATE TABLE velicina (
      id_velicina     int             NOT NULL UNIQUE DEFAULT nextval('seq_velicina'),
      nazev           varchar(64)     NOT NULL UNIQUE,
      znacka          varchar(10)     NOT NULL,
      jednotka        varchar(10),
      PRIMARY KEY (id_velicina));
 CREATE TABLE velicinasenzor (
      id_velicina     int             NOT NULL REFERENCES velicina ON UPDATE CASCADE ON DELETE CASCADE,
      id_senzor       int             NOT NULL REFERENCES senzor   ON UPDATE CASCADE ON DELETE CASCADE,
      PRIMARY KEY (id_velicina,id_senzor));
 CREATE TABLE mereni (
      id_velicina     int             NOT NULL REFERENCES velicina ON UPDATE CASCADE ON DELETE CASCADE,
      id_senzor       int             NOT NULL REFERENCES senzor  ON UPDATE CASCADE ON DELETE CASCADE,
      cas             timestamp       NOT NULL DEFAULT now(),
      hodnota         float           NOT NULL,
      PRIMARY KEY (id_velicina,id_senzor,cas));
 CREATE SEQUENCE seq_podminka;
 CREATE TABLE podminka (
      id_podminka     int             NOT NULL UNIQUE DEFAULT nextval('seq_podminka'),
      id_velicina     int             NOT NULL REFERENCES velicina ON UPDATE CASCADE ON DELETE CASCADE,
      id_senzor       int             NOT NULL REFERENCES senzor   ON UPDATE CASCADE ON DELETE CASCADE,
      nazev           varchar(64)     NOT NULL UNIQUE,
      poznamka        text,
      prahovahodnota  float           NOT NULL,
      typ             char            CHECK (typ IN ('>','<')),
      PRIMARY KEY (id_podminka));
 CREATE SEQUENCE seq_akce;
 CREATE TABLE akce (
      id_akce         int             NOT NULL UNIQUE DEFAULT nextval('seq_akce'),
      nazev           varchar(64)     NOT NULL UNIQUE,
      PRIMARY KEY (id_akce));
 CREATE SEQUENCE seq_pravidlo;
 CREATE TABLE pravidlo (
      id_pravidlo     int             NOT NULL UNIQUE DEFAULT nextval('seq_pravidlo'),
      nazev           varchar(64)     NOT NULL UNIQUE,
      poznamka        text,
      id_akce         int             NOT NULL REFERENCES akce ON DELETE CASCADE ON UPDATE CASCADE,
      PRIMARY KEY (id_pravidlo));      
 CREATE TABLE pravidlopodminka (
      id_pravidlo     int             NOT NULL REFERENCES pravidlo ON DELETE CASCADE ON UPDATE CASCADE,
      id_podminka     int             NOT NULL REFERENCES podminka ON DELETE CASCADE ON UPDATE CASCADE,
      PRIMARY KEY (id_pravidlo, id_podminka));
 INSERT INTO senzor (nazev,popis) VALUES ('S1','Meterologický senzor na střeše');
 INSERT INTO senzor (nazev,popis) VALUES ('M1T','Teploměr v místnosti M1');
 INSERT INTO velicina (nazev,znacka,jednotka) VALUES ('teplota','t','C');
 INSERT INTO velicina (nazev,znacka,jednotka) VALUES ('vítr','v','m/s');
 INSERT INTO mistnost(nazev) VALUES ('M1');
 
Groups:
courses/a5m33izs/cviceni/07.txt · Last modified: 2017/03/21 08:53 by rimnacm