Image
7.6.2016 0 Comments

Databázy / 6. časť

Späť na úvod >> Späť na seriál

V tejto časti seriálu budeme pokračovať vo vysvetľovaní príkazu SELECT. Minule sme si hovorili o základných  agregačných funkciách SUM, MIN, MAX, COUNT, AVG a formulovali sme podmienku WHERE v tej najzákladnejšej forme.

Teraz si vysvetlíme a na príkladoch ukážeme ďalšie pokročilejšie parametre a príkazy. Budú to tieto kľúčové slová a  klauzuly: DISTINCT, BETWEEN, LIMIT,  takzvané triedené výpisy a generované výpisy. Aby sme však mali príklady ilustrovanejšie, doplníme si  tabuľku KNIHA o ďalšie záznamy podľa priloženej tabuľky Tab.1:

(Samozrejme, môžete si doplniť vlastné údaje)

id

nazov

autor

Vydavateľ

cis_odd

cena

8

Z poľovníckej kapsy

Moric, Rudo

Mlade letá

4

89

9

Plebejska kosela

Mihálik, Vojtech

Slovenský spisovateľ

1

15

10

Europou bez penazi

Hlubucek, Petr, Ing.

Roman Kasan

5

34

Ak sme tak vykonali (použitím príkazu INSERT INTO), pristúpime teraz k novým parametrom a kľúčovým slovám príkazu SELECT.

DISTINCT. Kľúčové slovo DISTINCT zamedzuje vypísanie viacerých rovnakých hodnôt.

Ak nechceme, aby sa vypísali riadky, ktoré budú mať rovnaké hodnoty podľa stanovenej podmienky, použijeme toto kľúčové slovo. Potom sa takýto riadok vypíše iba raz. Predstavme si, že chceme vedieť, od akých vydavateľov máme v našej knižnici knihy. Môžeme použiť bežný príkaz SELECT s redukovaním stĺpcov na jeden, a to VYDAVATEL, takto:
mysql> select vydavatel from kniha;

Dostaneme výsledok ako na výpise č. 1:

Vidíme, že príkaz SELECT vybral jeden stĺpec, ale z celej tabuľky, čím vypísal aj tie riadky, ktoré sa opakujú. Pri týchto pár riadkoch to neprekáža, ale čo ak budeme mať tabuľku s tisíckou záznamov? Kto by v tom listoval? A práve na toto sa veľmi hodí DISTINCT. Takže použijeme:
mysql> select distinct vydavatel from kniha;

Vidíme, že výpis č. 2 je prehľadnejší, lebo zobrazil len sedem riadkov, čo sú všetci vydavatelia, OD ktorých knihy vlastníme.

BETWEEN. Parameter BETWEEN v podmienke WHERE určuje interval jej platnosti. Všeobecný zápis je:
SELECT meno_stĺpca FROM meno_tabuľky WHERE podmienka

BETWEEN dolná_hranica AND horná_hranica

Ak chceme vyhľadať knihy s minimálnou cenou napr. 200 Sk a maximálnou cenou 1000 Sk, urobíme to takto:
mysql> select id, nazov, autor, cena from kniha where cena BETWEEN 200 AND 1000;

Na výpise č. 3 vidíme, že tejto podmienke vyhoveli tri záznamy.

(Musíme si uvedomiť, že táto podmienka sa porovnáva v stanovenom intervale od 200 do 1000 vrátane obidvoch krajných hodnôt. To len na okraj, lebo v matematike sa v určitých prípadoch krajné hodnoty intervalu neakceptujú.)

LIMIT. Ak sa domnievame, že prípadný výpis príkazu SELECT by bol veľmi dlhý, a chceli by sme ho obmedziť na prvých n riadkov, použijeme kľúčové slovo LIMIT na konci príkazu. Všeobecný zápis je:
SELECT mená_stĺcov FROM meno_tabuľky WHERE podmienka LIMIT n, m

Ukážme si to teraz na našej tabuľke ZANER:
mysql> select * from zaner LIMIT 5;

Vidíme prvých päť riadkov výsledku príkazu SELECT, tak ako je to na výpise č. 4:

Ak chceme vypísať ďalšie riadky z tabuľky, použijeme kľúčové slovo LIMIT s dvoma parametrami n a m. Parameter n je offset a značí, od ktorého nasledujúceho riadka bude výpis pokračovať, a parameter m značí maximum vypísaných riadkov.
Takže príkaz:
mysql> select * from zaner LIMIT 5,10;

vypíše ďalších 10 riadkov od riadka nasledujúceho po 5. riadku, teda riadky 6 až 15. Keďže naša tabuľka nemá toľko riadkov, výpis sa ukončí po poslednom riadku tabuľky, tak ako je to na výpise č. 5:

TRIEDENÉ VÝPISY. Výpisy príkazu SELECT môžeme formovať nielen pomocou kľúčových slov a agregačných funkcií, ale môžeme vytvárať aj tzv. triedené výpisy.
Triedené výpisy tvoríme parametrami:

- ORDER BY                (zoradenie vzostupne)
- ORDER BY DESC      (zoradenie zostupne)
- GROUP BY                (zoskupenie)
- HAVING                     (zoskupenie spĺňajúce podmienku)

ORDER BY
Príkazom ORDER BY zoradíme výpis podľa stanoveného stĺpca vzostupne.
Všeobecný zápis je:
SELECT názvy_stĺpcov FROM meno_tabuľky  ORDER BY názvy_stĺpcov

Ak chceme zoradiť výpis z tabuľky KNIHA podľa abecedy v stĺpci NAZOV, zadáme príkaz:
mysql> select id, nazov, autor from kniha order by nazov;

tak ako je na výpise č. 6:

Vidíme, že stĺpec NAZOV sa zoradil podľa abecedy, takže stĺpec ID už nejde po poradí.

Poznámka:
Musíme spomenúť, že práve tu vznikajú problémy s česko-slovenským triedením. Ak nie je server nastavený na triedenie podľa českej abecedy, znaky s diakritikou nezaradí správne, teda A, Á, B, C, Č, D, Ď... atď., ale na koniec súboru v zmysle ASCII tabuľky.
Ak chceme použiť triedenie podľa viacerých stĺpcov tabuľky, zadáme názvy príslušných stĺpcov  za ORDER BY. Vzorovým príkladom by mohlo byť zoradenie podľa názvu, potom podľa autorov a nakoniec podľa vydavateľstva. Zoradenie sa vykoná v tom poradí, v akom zadáme názvy jednotlivých stĺpcov.
ORDER BY DESC. Tento príkaz je veľmi podobný predchádzajúcemu, len slovko DESC znamená, že určený stĺpec sa zoradí  zostupne. Ak teda chceme zoradiť výpis tabuľky KNIHA zostupne podľa stĺpca AUTOR, zadáme príkaz:
mysql> select id, nazov, autor from kniha order by autor desc;

Výsledok vidíme na výpise č. 7:

GROUP BY. Parametrom GROUP BY zoskupíme výsledok príkazu SELECT k stanovenému stĺpcu.
Všeobecný zápis je:
SELECT názvy_stĺpcov, agregačná_funkcia FROM meno_tabuľky GROUP BY názov_stĺpca_pre zoskupenie

Predstavme si, že chceme spočítať sumu cien kníh po jednotlivých knižných oddelenia, napr. v oddelení č. 1 je suma xy korún, v oddelení č. 2 je suma yz korún a podobne.
Stačí, ak spočítame sumu cien a tú zoskupíme po oddeleniach.
Zadáme:
mysql> select cis_odd, sum(cena) as ‘Celkom’ from kniha group by cis_odd;

Na výpise č. 8 vidíme sumy cien kníh po jednotlivých oddeleniach knižnice. Zároveň sme využili znalosti premenovania stĺpca agregačnej funkcie SUM na stĺpec Celkom pomocou AS.

HAVING. Ak chceme uvedený príklad obmedziť určitou podmienkou, použijeme klauzulu HAVING.
Všeobecný zápis je:
SELECT názvy_stĺpcov, agregačná_funkcia FROM meno_tabuľky GROUP BY názov_stĺpca

HAVING podmienka

HAVING obmedzí rozsah výpisu tabuľky tým, že z agregovaných riadkov vyradí tie, ktoré nevyhovujú uvedenej podmienke.
Ak chceme výpis cien kníh po jednotlivých oddeleniach z predchádzajúceho príkladu obmedziť iba na tie riadky, kde suma je väčšia ako 100 (korún), zadáme príkaz:
mysql> select cis_odd, sum(cena) as ‘Celkom’ from kniha group by cis_odd having sum(cena)>100 ;

Na výpise č. 9 vidíme, že je to redukovaný výpis č. 8 a riadky 1, 3, 4 a 5 so sumou menšou ako 100 boli ignorované.

GENEROVANÉ VÝPISY. Niekedy je veľmi potrebné uložiť obsah niektorej tabuľky (alebo aj celej databázy) do súboru, prípadne opätovne načítať uložené dáta do servera. Môžeme tak konať z rôznych dôvodov. Pravidelná archivácia dát je veľmi dôležitá. Takisto môžeme preniesť tieto dáta na iný počítač. (Veď kto by znova zadával údaje z klávesnice!) V takom prípade využijeme tzv. generované výpisy. Sú to také výpisy, kde príslušné príkazy SQL servera vygenerujú obsah stanovených databáz a ich tabuliek do súboru, ktoré je možné v prípade potreby spätne zo súboru načítať do servera.

Pomocných programov alebo príkazov je niekoľko, my sa naučíme používať štyri, rozdelené do týchto dvoch skupín:
a) príkazy generujúce len obsah (dáta) tabuliek:

-     select .... into outfile         – vygeneruje dáta z tabuľky do súboru
-     load data infile                  – načíta dáta zo súboru do tabuľky

b) príkazy generujúce obsah aj formu (dáta aj štruktúru) tabuliek (alebo databáz):

-     mysqldump                       – vygeneruje štruktúru aj dáta z tabuľky do súboru
-     source (\.) programu mysql            – vykoná SQL skript = načíta štruktúru aj dáta do SQL servera

SELECT ... INTO OUTFILE. Ak chceme uložiť iba dáta z ľubovoľnej tabuľky do súboru, použijeme tento príkaz v monitore MySQL. Všeobecný tvar je:
SELECT * FROM meno_tabuľky INTO OUTFILE ‘meno_súboru’ FIELDS TERMINATED BY ‘znak’

FIELDS TERMINATED BY znamená polia ukončené (znakom), tzv. oddeľovačom.
Parameter znak je typ oddeľovača jednotlivých stĺpcov. Spravidla to býva čiarka (,) alebo pipe = rúra (|).
Predstavme si, že chceme uložiť dáta z tabuľky KNIHA do súboru kniha.dat , kde oddeľovačom stĺpcov bude pipe. Názov súboru nie je záväzný, prípona je ľubovoľná, ale .dat symbolizuje, že bude obsahovať dáta.
Vtedy zadáme:
mysql> select * from kniha into outfile ‘kniha.dat’ fields terminated by ‘|’;

Keďže v našich dátach (v stĺpci AUTOR) už používame čiarku na oddelenie mena od priezviska, ako oddeľovač použijeme iný znak, najvhodnejšie pipe, aby nedošlo k chybe.
Výpis č. 10 potvrdzuje, že všetko prebehlo v poriadku a bolo uložených 10 riadkov:

Vzhľadom na relatívnu cestu sa súbor kniha.dat nachádza v adresári MYSQL\DATA\KNIZNICA. Teraz sa môžeme pozrieť, aký je obsah súboru (výpis č. 11):

1|Angelika a kral|Golon, Anne a Serge|Slovensky spisovatel|2|56.00|
2|KGB|Gordijevsky, Oleg|EAAP|6|239.00|
3|Bratia Ricovci|Simenon, Georges|Smena|3|18.00|
4|Vtaky v trni|McCulloughova, Collen|Slovensky spisovatel|2|66.00|
5|Linux - prakticky pruvodce|Sobell, Mark G.|Computer Press|7|1073.00|
6|Naucte se programovat v Delphi|Binzinger, Thomas|Grada|7|439.00|
7|Pouzivame linux|Welsh, M., Kaufman, L.|Computer Press|7|494.00|
8|Z polovnickej kapsy|Moric, Rudo|Mlade leta|4|89.00|
9|Plebejska kosela|Mihalik, Vojtech|Slovensky spisovatel|1|15.00|
10|Europou bez penazi|Hlubucek, Petr, Ing.|Roman Kasan|5|34.00|

Je zrejmé, že oddeľovač pipe (|) oddeľuje jednotlivé stĺpce tabuľky.
Teraz si môžeme tento súbor odložiť na bezpečné miesto, aby sme ho použili, keď to bude potrebné.

LOAD DATA INFILE. Predstavme si situáciu, že z určitého dôvodu je zrazu tabuľka KNIHA prázdna, to sa môže stať pri nechcenom výmaze (vyprázdnení) celej tabuľky (delete from kniha – spomínate si?), alebo je nekorektná, chýbajú jej niektoré záznamy, a tak sme ju vyprázdnili. Ak máme odložený aktuálny(!) súbor kniha.dat, nemusíme byť mrzutí. Stačí, ak použijeme príkaz LOAD DATA INFILE.

Jeho všeobecný tvar je:
LOAD DATA INFILE meno_súboru INTO TABLE meno_tabuľky FIELDS TERMINATED BY ‘znak’

Takže v našom prípade skopírujeme súbor do príslušného adresára (s názvom databázy) a zadáme príkaz:
mysql> load data infile ‘kniha.dat’ into table kniha fields terminated by ‘|’;

Znak, ktorým sú oddelené jednotlivé stĺpce, zistíme nahliadnutím do súboru.
Výpis č. 12 potvrdzuje, že bolo nahraných desať riadkov do tabuľky:

Obsah súboru kniha.dat môžeme nahrať aj do prázdnej tabuľky s iným názvom, ako je KNIHA. Podmienkou je, že táto prázdna tabuľka musí existovať a musí mať presne tú istú štruktúru ako tabuľka KNIHA!
MYSQLDUMP.
Ak chceme uložiť do súboru nielen dáta, ale aj štruktúru určitej tabuľky alebo aj celej databázy, je lepšie použiť program MySQLDump. Pozor! Nie je to príkaz monitoru MySQL, ale je to samostatný pomocný program MySQL servera. Preto sa spustí v príkazovom riadku príslušného operačného systému.
Všeobecný zápis je:
mysqldump meno_databáze meno_tabuľky > meno_súboru

Zobáčik „>” znamená, že výstup programu mysqldump sa presmeruje do súboru meno_súboru. Keby sme ho nezadali, výstup programu by sa smeroval štandardne na obrazovku. Keby sme zadali za zobáčikom namiesto mena súboru slovko prn, výstup by sa presmeroval na pripojenú tlačiareň.
Pozrime sa bližšie na obsah súboru zaner.sql  (výpis č. 13):

# MySQL dump 8.2
#
# Host: localhost    Database: kniznica
#--------------------------------------------------------
# Server version  3.22.34-shareware-debug

#
# Table structure for table 'zaner'
#

CREATE TABLE zaner (
  cis_odd int(11) DEFAULT '0' NOT NULL auto_increment,
  tematika varchar(20),
  PRIMARY KEY (cis_odd)
);

#
# Dumping data for table 'zaner'
#

INSERT INTO zaner VALUES (1,'poezia');
INSERT INTO zaner VALUES (2,'roman');
INSERT INTO zaner VALUES (3,'krimi');
INSERT INTO zaner VALUES (4,'detska lit.');
INSERT INTO zaner VALUES (5,'cestopis');
INSERT INTO zaner VALUES (6,'lit. faktu');
INSERT INTO zaner VALUES (7,'odborna lit.');

Z výpisu vidíme, že súbor zaner.sql obsahuje SQL príkazy pre server. Na začiatku sú SQL príkazy na vytvorenie tabuľky ZANER (create table), nasledujú SQL príkazy na naplnenie tabuľky príslušnými dátami (insert into).
Takto vygenerovaný výpis je veľmi užitočný. Je zrejmé, že ho prípadne môžeme upraviť, doplniť dáta alebo prepracovať štruktúru tabuľky. A hlavne ho môžeme použiť aj tam, kde nie je nadefinovaná príslušná tabuľka. Takto generovaný výpis je veľmi vhodný na prenášanie celých databáz na iný počítač so serverom MySQL. A teraz už chápete, prečo som mu dal príponu .sql, aj keď som ho mohol pomenovať ľubovoľne.

Nabudúce si vysvetlíme vzájomné spojovanie tabuliek a manipuláciu s časovými údajmi SQL servera.

           

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá