IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

6. diel - Oracle krok za krokom: Výber dát (vyhľadávanie)

V minulej lekcii, Oracle krok za krokom: Import , sme si ukázali ako naimportovať dáta.

Dnes sa zameriame na tú najkrajšiu časť a tou je výber dát. Jedná sa o dotazovanie na dáta, či chcete, tak vyhľadávanie v tabuľke.

Výber dát je kľúčovou funkciou databáz, umožňuje nám totiž pomocou relatívne jednoduchých otázok robiť aj zložité výbery dát. Od prostého výberu užívateľa podľa jeho id (napr. Pre zobrazenie detailov v aplikácii) môžeme vyhľadávať užívateľa spĺňajúce určité vlastnosti, výsledky zoradiť podľa rôznych kritérií alebo dokonca do dotazu zapojiť viac tabuliek, rôzne funkcie a skladať dotazy do seba (o tom až v ďalších dieloch ).

Testovacie dáta

Než do tabuľky vložíme testovacie dáta, najskôr si ju zmažeme a vytvoríme znovu, tentoraz s automaticky sa zvyšujúcimi ID, čo je v praxi samozrejmosťou:

DROP TABLE UZIVATELE;

CREATE TABLE UZIVATELE
(
  UZIVATELE_ID INT GENERATED ALWAYS AS IDENTITY(START with 1 INCREMENT by 1)
, JMENO VARCHAR2(60) NOT NULL
, PRIJMENI VARCHAR2(60) NOT NULL
, DATUM_NAROZENI DATE NOT NULL
, POCET_CLANKU INT NOT NULL
, CONSTRAINT UZIVATELE_PK PRIMARY KEY
  (
    UZIVATELE_ID
  )
  ENABLE
);

Syntaxou START with 1 za klauzulou IDENTITY, že začíname počítať od čísla 1. INCREMENT by 1 nám zase hovorí, že budeme inkrementovať (zvyšovať číslo) číslom 1. Nastavujeme potom tiež tzv. PRIMARY KEY, čo znamená jednoznačný identifikátor riadku. Môžeme potom vďaka jedného čísla v tabuľke odkazovať na konkrétny záznam.

Ak nám tu SQL Developer bude hlásiť, že nemáme dostatočné oprávnenia, prepneme si pripojenie na IT_NETWORK_ORACLE_DB (heslo admin), v ktorom sme si v druhej lekcii tvorili schému, a do Worksheet vložíme a spustíme nasledujúci príkaz:

GRANT ALL PRIVILEGES TO noveSchema;

Týmto sme si zaistili všetky povolenia. Teraz si do novej tabuľky vložíme predpripravená testovacie dáta. Využijeme na to jednu z metód vloženia viacerých záznamov naraz, ktorú som tu zatiaľ neukazoval, pretože je o niečo zložitejšie ako INSERT ALL:

INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni, pocet_clanku)
  WITH zaznamy AS (
    SELECT 'Jan', 'Novák', '3.11.1984', 17        FROM dual UNION ALL
    SELECT 'Tomáš', 'Marný', '17.10.1942', 12     FROM dual UNION ALL
    SELECT 'Josef', 'Nový', '10.7.1958', 5        FROM dual UNION ALL
    SELECT 'Alfons', 'Svoboda', '15.5.1935', 6    FROM dual UNION ALL
    SELECT 'Ludmila', 'Dvořáková', '17.4.1967', 2 FROM dual UNION ALL
    SELECT 'Petr', 'Černý', '20.2.1995', 1        FROM dual UNION ALL
    SELECT 'Vladimír', 'Pokorný', '18.4.1984', 1  FROM dual UNION ALL
    SELECT 'Ondřej', 'Bohatý', '14.5.1973', 3     FROM dual UNION ALL
    SELECT 'Vítězslav', 'Churý', '2.6.1969', 7    FROM dual UNION ALL
    SELECT 'Pavel', 'Procházka', '3.7.1962', 8    FROM dual UNION ALL
    SELECT 'Matěj', 'Horák', '10.9.1974', 0       FROM dual UNION ALL
    SELECT 'Jana', 'Veselá', '2.10.1976', 1       FROM dual UNION ALL
    SELECT 'Miroslav', 'Kučera', '3.11.1948', 1   FROM dual UNION ALL
    SELECT 'František', 'Veselý', '9.5.1947', 1   FROM dual UNION ALL
    SELECT 'Michal', 'Krejčí', '7.3.1956', 0      FROM dual UNION ALL
    SELECT 'Lenka', 'Němcová', '11.2.1954', 5     FROM dual UNION ALL
    SELECT 'Věra', 'Marková', '21.1.1978', 3      FROM dual UNION ALL
    SELECT 'Eva', 'Kučerová', '26.7.1949', 12     FROM dual UNION ALL
    SELECT 'Lucie', 'Novotná', '28.7.1973', 4     FROM dual UNION ALL
    SELECT 'Jaroslav', 'Novotný', '11.8.1980', 8  FROM dual UNION ALL
    SELECT 'Petr', 'Dvořák', '30.9.1982', 18      FROM dual UNION ALL
    SELECT 'Jiří', 'Veselý', '15.1.1961', 2       FROM dual UNION ALL
    SELECT 'Martina', 'Krejčí', '29.8.1950', 4    FROM dual UNION ALL
    SELECT 'Marie', 'Černá', '26.2.1974', 5       FROM dual UNION ALL
    SELECT 'Věra', 'Svobodová', '2.3.1983', 2     FROM dual UNION ALL
    SELECT 'Pavel', 'Dušín', '1.5.1991', 9        FROM dual UNION ALL
    SELECT 'Otakar', 'Kovář', '17.12.1992', 9     FROM dual UNION ALL
    SELECT 'Kateřina', 'Koubová', '15.11.1956', 4 FROM dual UNION ALL
    SELECT 'Václav', 'Blažek', '20.10.1953', 6    FROM dual UNION ALL
    SELECT 'Jan', 'Spáčil', '6.5.1967', 3         FROM dual UNION ALL
    SELECT 'Zdeněk', 'Malačka', '10.3.1946', 6    FROM dual
  )
  SELECT * FROM zaznamy;

Syntax dotazu teraz viac rozoberať nebudeme, skrátka vloží hromadne záznamy do tabuľky uzivatele. Na rozdiel napríklad od MySQL sa syntaxe veľa líšia a nemusia dávať poriadne zmysel (voláme INSERT a v ňom potom príkaz SELECT na výber tabuľky a tým vložíme používateľa). Do databázy sa nám týmto vložilo 31 užívateľov. To by malo stačiť na to, aby sme si na nich vyskúšali základy dopytovania.

Dopytovania

Dotaz na dáta, teda ich vyhľadanie / výber, nájdete v prostredí SQL Developer pri rozkliknutí danej tabuľky pod položkou Data. Skúsme si to, stačí zadať název_sloupce = 'hodnota'. Ak chceme filtrovať skrze viac stĺpcov, môžeme použiť klauzulu AND:

Oracle

SQL dotaz bude potom vyzerať takto:

SELECT * FROM uzivatele WHERE jmeno='Jan' AND prijmeni='Novák';

Príkaz je asi zrozumiteľný. Hviezdička po príkaze SELECT označuje, že chceme vybrať všetky stĺpce. Otázka teda slovensky znie: "Vyber všetky stĺpce z tabuľky uzivatele, kde je meno Jan a priezvisko Novák ". Keďže sa jedná o tzv. Textové reťazce, musíme dávať hodnoty do úvodzoviek ' alebo ". Čísla teda dávať do úvodzoviek nedávame (pokiaľ nejde napríklad o dátum).

Tabuľky majú väčšinou veľa stĺpcov a väčšinou nás zaujímajú len niektoré. Aby sme databázu nezaťažovali prenášaním zbytočných dát späť do našu aplikácie, budeme sa snažiť vždy špecifikovať tie stĺpce, ktoré chceme. Dajme tomu, že budeme chcieť priezvisko a počet napísaných článkov ľudí, ktorí sa volajú Jan. Otázka bude vyzerať nasledovne:

SELECT prijmeni, pocet_clanku FROM uzivatele WHERE jmeno='Jan';

výsledok:

MENO POCET_CLANKU
Novák 17
Spáčil 3
Naozaj nebuďte leniví a ak nepotrebujete takmer všetky stĺpce, vymenujte v SELECT tie, ktorých hodnoty vás v tú chvíľu zaujímajú. Vždy sa snažte podmienku obmedziť čo najviac už na úrovni databázy, nie že si vyťaháme celú tabuľku do aplikácie a tam si ju vyfiltrujete. Povedzme, že by vaša aplikácia potom nebola úplne rýchla a databáza samotná vás nebude mať rada:) Výpočet stĺpcov, ktoré má dotaz vrátiť, nemá nič spoločné s ďalšími stĺpci, ktoré v dotaze používame. Môžeme teda vyhľadávať podľa desiatich stĺpcov, ale vrátiť len jeden.

Rovnako ako tomu bolo pri príkaze DELETE, aj tu bude fungovať iba otázka:

SELECT * FROM uzivatele;

Vtedy budú vybraní úplne všetci užívatelia (záznamy) z tabuľky.

U podmínkování platí to isté ako u DELETE, klauzula WHERE funguje úplne rovnako. Skúsme si to. Vyberme všetkých užívateľov, narodené po roku 1960 a s počtom článkov vyšším ako 5:

SELECT * FROM uzivatele WHERE datum_narozeni >= '1.1.1960' AND pocet_clanku > 5;

výsledok:

UZIVATELE_ID MENO PRIEZVISKO DATUM_NAROZENI POCET_CLANKU
1 Jan Novák 03.11.84 17
9 Vítězslav Churý 02.06.69 7
10 pavel Procházka 03.07.62 8
20 jaroslav Novotný 11.08.80 8
21 Petr Dvořák 30.09.82 18
26 pavel Dušín 01.05.91 9
27 Otakar Kovář 17.12.92 9
Operátormi

Základný operátormi =, >, <, >=, <=, != Určite viete použiť. V SQL máme ale ďalšie, povedzme si o LIKE, IN a BETWEEN.

LIKE

LIKE umožňuje vyhľadávať textové hodnoty len podľa časti textu. Funguje podobne, ako operátor "=" (rovná sa), len môžeme používať 2 zástupné znaky:

  • % (Percento) označuje ľubovoľný počet ľubovoľných znakov.
  • _ (Podčiarkovník) označuje jeden ľubovoľný znak.

Poďme si vyskúšať niekoľko otázok s operátorom LIKE. Nájdime priezvisko ľudí začínajúce na písmeno S:

SELECT prijmeni FROM uzivatele WHERE prijmeni LIKE 'S%';

Zadáme normálne text apostrofmi, iba na niektoré miesta môžeme vložiť špeciálne znaky. Na veľkosti písmen záleží (hľadanie je teda case-sensitive). Výsledok dotazu bude nasledujúci:

Svoboda
Svobodová
Spáčil

Teraz skúsme nájsť pětipísmenná priezvisko, ktoré majú ako 2. znak O:

SELECT prijmeni FROM uzivatele WHERE prijmeni LIKE '_o___';

výsledok:

MENO
Novák
Horák
Kovář
Asi už tušíte, ako LIKE funguje. Použitie možno vymyslieť veľa, väčšinou sa používa s percentami na oboch stranách pre tzv. Fulltextové vyhľadávanie (napr. Slová v texte článku).

IN ==

IN umožňuje vyhľadávať pomocou zoznamu prvkov. Urobme si teda výpočet mien a vyhľadajme užívatelia s týmito menami:

SELECT jmeno, prijmeni FROM uzivatele WHERE jmeno IN ('Petr', 'Jan', 'Kateřina');

výsledok:

MENO PRIEZVISKO
Jan Novák
Petr Čierny
Petr Dvořák
Kateřina Koubová
Jan Spáčil
Operátor IN sa používa ešte u tzv. Poddotazov, ale na tie máme ešte dosť času:)

Between

Posledný operátor, ktorý si dnes vysvetlíme, je BETWEEN (teda medzi). Nie je ničím iným, než skráteným zápisom podmienky >= AND <=. Už vieme, že aj dátumy môžeme normálne porovnávať, nájdime si užívateľov, ktorí sa narodili medzi rokmi 1980 a 1990:

SELECT jmeno, prijmeni, datum_narozeni FROM uzivatele WHERE datum_narozeni BETWEEN '1.1.1980' AND '1.1.1990';

výsledok:

MENO PRIEZVISKO DATUM_NAROZENI
Jan Novák 03.11.84
Vladimír pokorný 18.04.84
jaroslav Novotný 11.08.80
Petr Dvořák 30.09.82
Věra Svobodová 02.03.83
To je pre dnešok všetko. U výberu dát zostaneme ešte niekoľko dielov, vlastne väčšinu tohto seriálu.

V ďalšej lekcii, Oracle krok za krokom: Radenie, Fetch a agregačné funkcie , si povieme niečo o radení ao agregačných funkciách.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 259x (3.94 kB)

 

Predchádzajúci článok
Oracle krok za krokom: Import
Všetky články v sekcii
Oracle
Preskočiť článok
(neodporúčame)
Oracle krok za krokom: Radenie, Fetch a agregačné funkcie
Článok pre vás napísal Matěj Kadlec
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se programování věnuje od střední školy, nyní studuje informatiku na VŠB-TUO a pracuje jako ETL developer pro společnost IDC. Mezi jeho oblíbené jazyky patří Python a SQL.
Aktivity