Dotazy

  • Ukazkovy projekt Knihkupectvi
      - tabulky Authors; Books; Works; (propojeni mezi knihami a autory)
      - tabulka Inventory (pocet knih na sklade, cena, minimalni mnozstvi pred znovuobjednanim)
      - tabulka Orders (knihy, ktere je podreba doobjednat z velkoobchodu)
      - tabulka Best (automaticky udrzovana tabulka obsahujici aktualni zebrizek nejlepsich prodeju knih)

      SQL dotazy:
      - Knihy, ktere napsali autori do 50 let a ktere vydelaly vic jak 3000
      - Autor, jehoz kniha vydelala nejvic
      - Autor, jehoz knihy vydelaly celkove nejvic
      - Autori a jejich celkove vydelky
      - Kniha, ktera vydelala druha nejvic
      - Knihy, ktere napsalo 0 nebo vic jak 1 autor

      Kursory:
      - kontrola objednavek v tabulce Orders, pokud je objednavka starsi jak 1 mesic, preobjedna se
      - z tabulky Books vybere prvni tri knihy, ktere vydelaly v dosavadni historii knihkupectvi nejvic

      Triggery:
      - Kontrola, zda se neprodava vic knih, nez je na sklade
      - Smazani objednavky z Orders, pokud jiz pocet knih na skllade v Inventory dosahl pozadavaneho mnozstvi
      - Vytvoreni nove objednavky v Orders, pokud je v Inventory mene knih, nez stanoveny limit.

  • Mozna temata projektu
      - Knihovna + vedeni vypujcek.
      - Armadni sklad + kontrola stavu zbrani.
      - Kartoteka vezenskeho zarizeni + kontrola pristupu.
      - Kartoteka katastralniho uradu
      - Databaze Jihomoravskych plynarem + odebery plynu jednotlivych koncovek + vyuctovani
      - Databaze transfuziologicke stanice + obednavky na odber, evidence odebrane plasmy a krve
      - ...

  • Lze vlozit do tabulky naraz vice radku pomoci prikazu INSERT?
      Lze, ale pouze pokud je mozne formulovat vkladana radky pomoci prikazu SELECT, ktery vrati vice zaznamu.
      Prikaz INSERT INTO ucitele (SELECT id, jmeno FROM lide); vlozi do tabulky 'ucitele' vsechny osoby, kteri jsou ulozeni v tabulce 'lide'.
      Pro opakovane volani prikazu INSERT lze take pouzit cyklus LOOP jazyka PL/SQL. Pro interaktivni dotaz uzivatele na hodnotu lze pouzit prikaz INSERT INTO ucitele(id, jmeno) VALUES (&identifikace, '&jmeno_ucitele');

  • Lze ukoncit predcasne provadeni triggeru?
      Trigger lze ukoncit predcasne pomoci podminky a poziti prikazu RETURN;
      Napriklad ... IF nesplnena_podminka THEN RETURN; END IF;

  • Jak nastavit sloupec tabulky tak, aby se automaticky vzestupne cisloval (auto increment)?
      Databáze Oracle oproti jiným databázovým strojum neumožnuje prímo definovat sloupec jako automaticky generovanou vzestupnou sekvenci. Je nutno využít rucne vytvárených sekvencí [CREATE SEQUENCE jmeno_sekvence START WITH 1 INCREMENT BY 1] a tuto sekvenci využít pro naplnení príslušného pole. Popis dvou možných prístupu (s využitím triggeru a bez nej) naleznete na http://jen.fluxcapacitor.net/geek/autoincr.html

  • Lze se pripojit k databázi Oracle "zvencí"?

  • Jak vypíšu seznam svých vytvorených tabulek?

  • Jak vyvolám historii príkazu v SQLPLUS?
    • SQLPLUS pod unixovými stroji bohužel neumožnuje pracovat s historii prikazu. Proto je vhodnejší použivat skriptový soubor a spouštet jej pomocí @jmeno_skriptu (viz cvicení 1). Existuje alternativní nastroj se stejným vzhledem a pridanou podporou historie GQLPLUS, který je dostupny na pocitacich nymfeXX a aise.
      Prihlaseni pro pocitace nymfe:
      nymfe17: module add gqlplus
      nymfe17: gqlplus login@db10
      
      Prihlaseni pro aisu:
      aisa: module add gqlplus-1.8
      aisa: gqlplus login@db10
      

  • Jak kaskádně odstranit z databáze záznamy svázáné integritním omezením?
    • Provede se pomocí přidání klauzule ON DELETE CASCADE u definice integritního omezení. Následující příklad zajistí, že kdykoli je provedeno odstranění řádku z tabulky a, provede se zároveň odstranění všech řádku z tabulky b, které obsahují danou referencovanou hodnotu (sloupec apk) z tabulky a.
      	CREATE TABLE a (pk NUMBER PRIMARY KEY);
      	CREATE TABLE b (jmeno VARCHAR2(10), apk CONSTRAINT fk_apk REFERENCES a(pk) ON DELETE CASCADE);
      
      	INSERT INTO a VALUES (1);
      	INSERT INTO a VALUES (2);
      	INSERT INTO b VALUES ('tom', 1);
      	INSERT INTO b VALUES ('pepa', 2);
      
      	SELECT * FROM b;
      	DELETE FROM a WHERE pk = 1;
      	SELECT * from b;
      	
      Je však nutné dobře zvážit zamýšlené chování, aby nedošlo k nechtěnému smazání dat. Někteří databázový programátoři tuto konstrukci z tohoto důvodu nepoužívají.

  • Jak zobrazit na výstup pouze řádky od X-tého výše?
    • Každý řádek tabulky nebo výsledku příkazu select má přiřazenu hodnotu pseudo-sloupce rownum počínaje číslem 1. Prvních deset záznamů tabulky tak zobrazíme pomocí příkazu:
      SELECT * FROM tabulka WHERE rownum < 11;
      Číslo řádku však není fixní hodnota a průběžně se mění v závislosti na průběhu vyhodnocení dotazu, tak aby první řádek na výstupu měl vždy číslo 1. Pro zobrazení řádků tabulky od desátého výše (dle pozice v původní tabulce) musíme použít odlišnou konstrukci využívající vnořený dotaz, během kterého si do proměnné prom_r uložíme původní očíslování řádků:
      SELECT column_name FROM (SELECT column_name, rownum prom_r FROM tabulka) WHERE prom_r > 10;
      Bližší informace lze nalézt na http://www.adp-gmbh.ch/ora/sql/rownum.html

  • Lze přímo v definici tabulky zajistit převedení vkládaného řetězce na velké znaky?

  • Chování dvou a více seq.NEXTVAL v rámci jednoho příkazu INSERT.
    • Pokud v rámci jednoho příkazu INSERT INTO použijeme dvě a více volání metody NEXTVAL pro zisk následující hodnoty sekvence, všechna tato volání vrátí stejnou hodnotu bez ohledu na pořadí.
      Tedy pokud máme sekvenci seq s aktuální hodnotou 5 a inkrementem o 1, příkaz INSERT INTO tabulka VALUES (seq.NEXTVAL, 'pokus', seq.NEXTVAL); vloží hodnoty (6, 'pokus', 6).

  • Definice vyhledavaneho vzoru pro prikaz LIKE obsahujici '_' nebo '%'.
    • Pokud chci definovat vyhledavaci vzor pro prikaz LIKE, ktery ma obsahovat zastupny znak '_' resp. '%' a zaroven i tento znak v jeho puvodnim vyznamu, je nutne pouzit dodatecneho prikazu ESCAPE. Pro vyber vsech radku, jejichz sloupec stroj je ve tvaru 'stroj_nymfedvojcifernecislo' (napr. stroj_nymfe17) pouzijeme nasledujici syntaxi:
      SELECT * FROM tab WHERE stroj LIKE 'stroj\_nymfe__' ESCAPE '\';
      Znak '\' funguje jako specialni priznak, ze bezprostredne nasledujici znak nema byt interpretovan v jeho specialnim vyznamu, ale jako bezny znak.

  • Razeni vysledku podle vice sloupcu
    • Pro serazeni radku dle zadaneho sloupce lze vyuzit klausuli ORDER BY jmeno_sloupce. Pokud chceme radit podle vice sloupcu zadame jejich jmena a oddelime carkami, tedy: SELECT * FROM tabulka ORDER BY sloupec_1 ASC, sloupec_2 DESC, ... U kazdeho sloupce lze zadat, jakym zpusobem se ma radit. Nejprve se vysledek radi podle prvniho parametru, vysledek dle druhe atd.


    contact
    OpenPGP klíc : 0x89CEB31C