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
:
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 |
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 |
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ář |
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 |
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 |
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 podmienkamiStiahnuté 259x (3.94 kB)