Geodatabáze.jecool.net

Lecture 5

Z3104 GEODATABÁZE

Obsah

  • Opakování
  • Trocha nové teorie
  • DIY - Do It Yourself

Opakování

Řazení výsledků - ORDER BY


SELECT rok_produkce, hodnoceni_csfd, nazev_filmu FROM filmy
    ORDER BY rok_produkce ASC, hodnoceni_csfd DESC;
            

WHERE - provnávací operátory


SELECT hodnoceni_csfd, nazev_filmu FROM filmy
    WHERE reziser_prij = 'Hrebejk';
            

SELECT hodnoceni_csfd, nazev_filmu FROM filmy
    WHERE hodnoceni_csfd >= 90;
            
http://www.postgresql.org/docs/9.3/static/functions-comparison.html

AND, OR, NOT


SELECT rok_produkce, hodnoceni_csfd, nazev_filmu FROM filmy
    WHERE rok_produkce = '2012' AND hodnoceni_csfd > 90;
            

SELECT naklady, reziser_prij, nazev_filmu FROM filmy
    WHERE
      (reziser_prij = 'Sverak' OR reziser_prij = 'Menzel')
      AND naklady < 1 000 000
    ORDER BY naklady;
            
http://www.postgresql.org/docs/9.3/static/functions-logical.html

IS [NOT] NULL


SELECT nazev_filmu FROM filmy
    WHERE naklady IS NULL;
            

SELECT premiera, nazev_filmu FROM filmy
    WHERE rok_produkce = '2013' AND premiera IS NOT NULL;
            
http://www.postgresql.org/docs/9.3/static/functions-comparison.html

expression = NULL × expression IS NULL

BETWEEN


SELECT naklady, nazev_filmu FROM filmy
    WHERE naklady BETWEEN 1000000 AND 2000000;
            
http://www.postgresql.org/docs/9.3/static/functions-comparison.html

LIKE


SELECT nazev_filmu FROM filmy
    WHERE nazev_filmu LIKE 'Tři%';
            
http://www.postgresql.org/docs/9.3/static/functions-matching.html#FUNCTIONS-LIKE

IN


SELECT nazev_filmu, reziser_prij
FROM filmy
    WHERE reziser_prij IN ('Sverak', 'Menzel');
            
http://www.postgresql.org/docs/9.3/static/queries-table-expressions.html#QUERIES-WHERE

Trocha nové teorie

M:N tabulky - kontrola cizího klíče

Autoři (authors)
id Jmeno Prijmeni
234 Terry Pratchett
543 Stephen Baxter
Knihy (books)
id Název
1 Dlouhá země
2 Barva Kouzel
3 Otec Prasátek

Kontrola cizího klíče - omezení


CREATE TABLE book_author (
    book_id INT NOT NULL,
    author_id INT NOT NULL,

    FOREIGN KEY (book_id) REFERENCES books(id),
    FOREIGN KEY (author_id) REFERENCES authors(id)
);
            

Kombinování dat z více tabulek

  • CROSS JOIN (Kartézský součin)
  • INNER JOIN
  • OUTER JOIN

CROSS JOIN

Spojení dvou tabulek "každý s každým" a.k.a. Beverly Hills


Př: V tabulce studenti je 25 záznamů, v tabulce předměty je 40 záznamů.
Kolik záznamů bude ve sloučené tabulce a proč?

1000

CROSS JOIN - příklad

Studenti
UČO Jmeno Prijmeni
234 Jan Novák
543 Tomáš Holý
Barvy
Barva Cena
červená 400
zelená 200
modrá 500

CROSS JOIN - příklad


SELECT * FROM studenti, barvy;
            

SELECT * FROM studenti CROSS JOIN barvy;
            
UČO Jmeno Prijmeni Barva Cena
234 Jan Novák červená 400
543 Tomáš Holý červená 400
234 Jan Novák zelená 200
543 Tomáš Holý zelená 200
234 Jan Novák modrá 500
543 Tomáš Holý modrá 500

CROSS JOIN - příklad

Následně je možné z tabulky klasicky vybírat pomocí WHERE.


SELECT * FROM studenti, barvy WHERE barvy.barva ='modrá';
            
UČO Jmeno Prijmeni Barva Cena
234 Jan Novák modrá 500
543 Tomáš Holý modrá 500

CROSS JOIN - použití

NEPOUŽÍVAT ! bez dobrých důvodů !

  • Velmi náročný pro výpočet při větším množství záznamů
  • Velká výstupní sada informací (tabulka)
  • Pomalý
  • Omezit podmínkou!

[INNER] JOIN

Nejpoužívanější

  • INNER JOIN ON (TRUE) je shodný s CROSS JOIN
  • INNER JOIN navíc určuje podmínku výběru (které řádky zůstanou)
  • Vybere a spojí pouze ty řádky, které je schopen spárovat (viz příklad dále).

[INNER] JOIN - příklad

Autor
ID Jmeno Prijmeni
888 Karel Čapek
555 Terry Pratchett
444 Josef Lada
Kniha
ID Nazev Id_autora
1 RUR 888
2 Věc makropulos 888
3 Barva kouzel 555
4 Lehké fantastično 555
5 Dobrý voják švejk 111

[INNER] JOIN - příklad


SELECT * FROM autor
INNER JOIN kniha ON (autor.id = kniha.id_autora);
            

SELECT * FROM autor
CROSS JOIN kniha WHERE autor.id = kniha.id_autora;
            
ID(autor) Jmeno Prijmeni ID(kniha) Název
888 Karel Čapek 1 RUR
888 Karel Čapek 2 Věc makropulos
555 Terry Pratchett 3 Barva kouzel
555 Terry Pratchett 4 Lehké fantastično

[OUTER] JOIN

  • LEFT [OUTER] JOIN
  • RIGHT [OUTER] JOIN
  • FULL [OUTER] JOIN

LEFT [OUTER] JOIN

Vybere všechny záznamy z "LEVÉ" tabulky a přiřadí záznamy, které může. Ke zbylým záznamům přiřadí NULL.


SELECT * FROM autor
LEFT OUTER JOIN kniha ON (autor.id = kniha.id_autora);
            
ID(autor) Jmeno Prijmeni ID(kniha) Název
888 Karel Čapek 1 RUR
888 Karel Čapek 2 Věc makropulos
555 Terry Pratchett 3 Barva kouzel
555 Terry Pratchett 4 Lehké fantastično
444 Josef Lada NULL NULL

RIGHT [OUTER] JOIN

Vybere všechny záznamy z "PRAVÉ" tabulky a přiřadí záznamy, které může. Ke zbylým záznamům přiřadí NULL.


SELECT * FROM autor
RIGHT OUTER JOIN kniha ON (autor.id = kniha.id_autora);
            
ID(autor) Jmeno Prijmeni ID(kniha) Název
888 Karel Čapek 1 RUR
888 Karel Čapek 2 Věc makropulos
555 Terry Pratchett 3 Barva kouzel
555 Terry Pratchett 4 Lehké fantastično
NULL NULL NULL 5 Dobrý voják Švejk

FULL [OUTER] JOIN

Vybere všechny záznamy z "PRAVÉ" i "LEVÉ" tabulky a přiřadí záznamy, které může. Ke zbylým záznamům přiřadí NULL.


SELECT * FROM autor
FULL OUTER JOIN kniha ON (autor.id = kniha.id_autora);
            
ID(autor) Jmeno Prijmeni ID(kniha) Název
888 Karel Čapek 1 RUR
888 Karel Čapek 2 Věc makropulos
555 Terry Pratchett 3 Barva kouzel
555 Terry Pratchett 4 Lehké fantastično
444 Josef Lada NULL NULL
NULL NULL NULL 5 Dobrý voják Švejk

Vkládání cizích klíčů

Vložit cizí klíč (neboli referenci na jinou tabulku) je možné dvěma způsoby

Vkládání cizích klíčů - postupně


SELECT id FROM autor WHERE prijmeni = 'Pratchett';

INSERT INTO kniha (id, nazev, id_autora) VALUES
  (7, 'Čaroprávnost', ###),
  (8, 'Soudné sestry', ###);
  -- místo ### je nalezené ID z předchozího dotazu
            

Tímto způsobem je možné zkontrolovat, že nám záznam skutečně vrací ID (resp. záznam), který opravdu chceme.

Vkládání cizích klíčů - najednou


INSERT INTO kniha (id, nazev, id_autora) VALUES
  (7, 'Čaroprávnost',  (SELECT id FROM autor WHERE prijmeni = 'Pratchett') ),
  (8, 'Soudné sestry',  (SELECT id FROM autor WHERE prijmeni = 'Pratchett') );
            

Pokud jsme si jisti, že nám záznam vybere správného autora, můžeme použít vnořený SELECT.

DIY - Do It Yourself

Konečně dodržujeme 3. NF protože umíme JOIN ☺ jupí!

ÚKOL 1

Navrhněte databázi oblíbených filmů obsahující popisné informace o daných filmech (český název, anglický název, rok vydání, žánr, hodnocení CSFD a další) + jejich herecké obsazení (jméno, příjmení, datum narození a další).

Kdo se nerad dívá na filmy, nebo má raději jiné téma (např. hry či knihy) můžete navrhnout databázi o těchto tématech.
Podmínkou je, že databáze obsahuje alespoň 4 rozdílné tabulky, jednu relaci 1:M a jednu relaci M:N

Dbejte na správnou volbu datových typů, omezení sloupců a definování odpovídající referenční integrity!

ÚKOL 1 - pokračování

Vypište z tabulek všechny komedie i s hereckým obsazením a proveďte jejich seřazení sestupně podle hodnocení ČSFD?


V jakých filmech (dle žánru) hraje Váš oblíbený herec (herečka)? Uveďte český i anglický název filmu a proveďte jejich seřazení vzestupně podle roku produkce.


Ti kteří si zvolili jiné téma, provedou výběry analogicky dle tématu.

Děkuji za pozornost