Geodatabáze.jecool.net

Lecture 4

Z3104 GEODATABÁZE

Obsah

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

Opakování

Přejmenování tabulky


ALTER TABLE jmeno_tabulky
    RENAME TO nove_jmeno_tabulky;
            

Pojmenování Primárního klíče


CREATE TABLE lide (
    jmeno TEXT CONSTRAINT jedinecne_jmeno PRIMARY KEY,
    vek INT
);
            

Pojmenování integritního omezení CHECK


CREATE TABLE lide (
    jmeno TEXT,
    vek INT CONSTRAINT uz_asi_po_smrti
      CHECK( VEK < 150)
);
            

Pojmenování integritního omezení UNIQUE


CREATE TABLE lide (
    jmeno TEXT CONSTRAINT jedinecne_jmeno UNIQUE,
    vek INT
);
            

Přidání pojmenovaného PK


ALTER TABLE jmeno_tabulky
    ADD CONSTRAINT jmeno_PK PRIMARY KEY (jmeno_sloupce);
            

Přidání pojmenovaného omezení UNIQUE


ALTER TABLE jmeno_tabulky
    ADD CONSTRAINT jmeno_omezeni UNIQUE (jmeno_sloupce);
            

Přidání pojmenovaného omezení CHECK


ALTER TABLE jmeno_tabulky
    ADD CONSTRAINT jmeno_omezeni CHECK (podmínka);
            

Odstranění pojmenovaného omezení


ALTER TABLE jmeno_tabulky
    DROP CONSTRAINT jmeno_omezeni;
            

Přidání omezení NOT NULL


ALTER TABLE jmeno_tabulky
    ALTER COLUMN jmeno_sloupce SET NOT NULL;
            

Odstranění omezení NOT NULL


ALTER TABLE jmeno_tabulky
    ALTER COLUMN jmeno_sloupce DROP NOT NULL;
            

Změna datového typu sloupce


ALTER TABLE nazev_tabulky
    ALTER COLUMN nazev_sloupce TYPE novy_datovy_typ;
            

Přejmenování sloupce


ALTER TABLE nazev_tabulky
    RENAME COLUMN nazev_sloupce TO novy_nazev_sloupce;
            

Odstranění sloupce


ALTER TABLE nazev_tabulky
    DROP COLUMN nazev_sloupce;
            

Trocha nové teorie

Řazení výsledků - ORDER BY

můžeme řadit podle 1 nebo více sloupců


SELECT hodnoceni_csfd, nazev_filmu FROM filmy
    ORDER BY hodnoceni_csfd DESC;
            

vzestupně i sestupně

ASC (Ascending) × DESC (Descending)

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

Za klíčovým slovem WHERE musí být výraz, který lze vyhodnotit na bool.

tj. ANO / NE

WHERE - provnávací operátory

Operator Description
< menší než
> větší než
<= menší nebo rovno
>= větší nebo rovno
= rovno
<> or != nerovno (různé)

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

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

AND, OR, NOT

a b a AND b a OR b
TRUE TRUE TRUE TRUE
TRUE FALSE FALSE TRUE
TRUE NULL NULL TRUE
FALSE FALSE FALSE FALSE
FALSE NULL FALSE NULL
NULL NULL NULL NULL


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;
            
https://www.postgresql.org/docs/current/static/functions-logical.html

IS [NOT] NULL

expression IS NULL

expression 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;
            
https://www.postgresql.org/docs/current/static/functions-comparison.html

Z dokumentace:

Do not write expression = NULL because NULL is not "equal to" NULL. (The null value represents an unknown value, and it is not known whether two unknown values are equal.) This behavior conforms to the SQL standard.

BETWEEN


a BETWEEN x AND y
            

je stejné jako


a >= x AND a <= y
            


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

LIKE

_ (podtržítko) symbolizuje právě jeden libovolný znak
% (procento) symbolizuje libovolný počet znaků

LIKE / NOT LIKE

'abc' LIKE 'abc' => true
'abc' LIKE 'a%' => true
'abc' LIKE '_b_' => true
'abc' LIKE 'c' => false


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

IN

Výčet prvků pro porovnávání


SELECT nazev_filmu, reziser_prij
FROM filmy
    WHERE reziser_prij IN ('Sverak', 'Menzel');
            

lze nahradit pomocí OR (zdlouhavěji)


SELECT nazev_filmu, reziser_prij
FROM filmy
    WHERE reziser_prij = 'Sverak'
      OR reziser_prij = 'Menzel';
            
https://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-WHERE

+, -, *, /

...a spousta dalších včetně matematických funkcí (sin(x)) viz odkaz.



SELECT (vynosy – naklady)*0.85 AS zisk FROM filmy
    WHERE reziser_prij = 'Sverak'
      AND nazev_filmu = 'Vratne lahve';
            
https://www.postgresql.org/docs/current/static/functions-math.html

DIY - Do It Yourself

ÚKOL 1

Vytvořte tabulku Vašich TOP 5 nejoblíbenějších filmů

  • název filmu
  • příjmení režiséra
  • rok produkce
  • země
  • hodnocení ČSFD
  • pořadi v ČSFD (kategorie Žebříčky → Nejlepší filmy)
  • délka filmu

Pro jednoduchost nevytvářejte další tabulku Režisér (tj. stačí splnit 1. NF).

ÚKOL 1 - pokračování

Vypište z tabulky všechny filmy, které mají podle ČSFD hodnocení vyšší než 80 %. Výstupy seřaďte sestupně podle roku, ve kterém byly produkovány. Sada výsledků nechť obsahuje i příjmení režiséra.

Vypište jména všech režisérů, jejichž filmy se nachází v hodnocení žebříčku „Nejlepší filmy“, nebyly natočeny v Česku a netrvají déle než 2 hodiny. V sadě výsledků uveďte i jméno filmu. Názvy sloupců nechť se zobrazí jako „Reziser“ a „Film“.

ÚKOL 2 - dobrovolný

Upravte tabulku z úkolu 1.

  • Upravte tabulku tak aby splňovala i 3. NF
  • Mimo příjmení režiséra zadejte i jeho jméno

Pro zvídavé připomínka spojování tabulek:
SELECT * FROM film INNER JOIN autor ON (film.autor_id = autor.id)


Vyberte jméno a příjmení všech autorů, kteří vytvořili nějaký film mezi roky 1990 a 2010 (Použijte BETWEEN)

Vyberte všechny filmy, které začínají na písmeno "T". (případně si zvolte takové, aby se vybral alespoň jeden film) (Použijte LIKE)

Vyberte filmy, které vyprodukovali režiséři s jejich ID 1, 2 a 3. (Použijte IN)

Děkuji za pozornost