SQL - select: Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
Riadok 1: Riadok 1:
{{Skripta_dbs}}
+
{{Skripta_dbs}} {{Draft}} Príkaz SELECT sa používa pre výber dát z databázy. Výsledok je uložený v tabuľke výsledkov.  
{{Draft}}
+
 
Príkaz SELECT sa používa pre výber dát z databázy. Výsledok je uložený v tabuľke výsledkov.
+
== Syntax príkazu SELECT ==
==Syntax príkazu SELECT==
+
 
Základná syntax (zjednodušená) je
+
Základná syntax (zjednodušená) je <source lang="sql">
<source lang="sql">
 
 
   SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky
 
   SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky
</source>
+
</source> Kompletná syntax je nasledujúca<ref>SQL syntax - http://dev.mysql.com/doc/refman/5.5/en/select.html</ref>: <source lang="sql">
Kompletná syntax je nasledujúca<ref>SQL syntax - http://dev.mysql.com/doc/refman/5.5/en/select.html</ref>:
 
<source lang="sql">
 
 
SELECT  
 
SELECT  
 
[ALL | DISTINCT | DISTINCTROW ]
 
[ALL | DISTINCT | DISTINCTROW ]
Riadok 21: Riadok 18:
 
[INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]]  
 
[INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]]  
 
[FOR UPDATE | LOCK IN SHARE MODE]]
 
[FOR UPDATE | LOCK IN SHARE MODE]]
</source>
+
</source> Poznámka: Výrazy v hranatých zátvorkách sú nepovinné, hodnoty oddelené čiarou (|) v zložených zátvorkách znamenajú výberj jednoej hodnoty z viacerých.  
Poznámka: Výrazy v hranatých zátvorkách sú nepovinné, hodnoty oddelené čiarou (|) v zložených zátvorkách znamenajú výberj jednoej hodnoty z viacerých.
 
===SELECT výber všetkých údajov===
 
'''Úloha:''' vyberte všetky záznamy z tabuľky city.
 
  
Riešenie:
+
=== SELECT výber všetkých údajov ===
 +
 
 +
'''Úloha:''' vyberte všetky záznamy z tabuľky city.
 +
 
 +
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * from city
 
   SELECT * from city
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select1.png|center]]  
[[Súbor:SQL - select1.png|center]]
 
  
'''Úloha:''' vyberte všetky záznamy z tabuľkt city. Vo výbere bude len názov mesta a populácia.
+
'''Úloha:''' vyberte všetky záznamy z tabuľkt city. Vo výbere bude len názov mesta a populácia.  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT Name, Population from city
 
   SELECT Name, Population from city
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select2.png|center]]  
[[Súbor:SQL - select2.png|center]]
 
===SELECT eliminácia duplicitných záznamov===
 
Pre elimináciu duplicitných záznamov vo výsledku dotazu slúži kľúčové slovo DISTINCT.
 
  
'''Úloha:''' Vyber všetky kódy krajín z tabuľky city.
+
=== SELECT eliminácia duplicitných záznamov ===
 +
 
 +
Pre elimináciu duplicitných záznamov vo výsledku dotazu slúži kľúčové slovo DISTINCT.
 +
 
 +
'''Úloha:''' Vyber všetky kódy krajín z tabuľky city.  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT DISTINCT CountryCode FROM city
 
   SELECT DISTINCT CountryCode FROM city
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select11.png|center]]  
[[Súbor:SQL - select11.png|center]]
 
  
 +
<br> '''Úloha:''' Aké formy vlády sú na jednotlivých kontinentoch?
  
'''Úloha:''' Aké formy vlády sú na jednotlivých kontinentoch?
+
Vysvetlenie: Údaje o krajinách sú v tabuľke country. Pri každej krajine sú okrem iných aj informácie o forme vlády (GovernmentForm), kontinente, na ktorom sa nachádza (Continent). Keďže nás nezaujímajú samotné krajiny ale len kontinenty na ktorých ležia, dotazom ''SELECT Continent, GovernmentForm FROM country'' by sme dostali duplicitné záznamy, pretože na danom kontinente sú krajiny, ktoré majú rovnaké formy vlády.  
 
 
Vysvetlenie: Údaje o krajinách sú v tabuľke country. Pri každej krajine sú okrem iných aj informácie o forme vlády (GovernmentForm), kontinente, na ktorom sa nachádza (Continent). Keďže nás nezaujímajú samotné krajiny ale len kontinenty na ktorých ležia, dotazom ''SELECT Continent, GovernmentForm FROM country'' by sme dostali duplicitné záznamy, pretože na danom kontinente sú krajiny, ktoré majú rovnaké formy vlády.
 
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT DISTINCT Continent, GovernmentForm FROM country
 
   SELECT DISTINCT Continent, GovernmentForm FROM country
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select12.png|center]]  
[[Súbor:SQL - select12.png|center]]
 
  
===SELECT obmedzenie výberu===
+
=== SELECT obmedzenie výberu ===
Pre obmedzenie počtu výsledkov sa v príkaze SQL používa kľúčové slovo ''WHERE''. Za kľúčové slovo sa píše logická podmienka. Výsledkom dotazu sú záznamy, ktoré vyhovujú danej logickej podmienke. Syntax je nasledovná:  
+
 
<source lang="sql">
+
Pre obmedzenie počtu výsledkov sa v príkaze SQL používa kľúčové slovo ''WHERE''. Za kľúčové slovo sa píše logická podmienka. Výsledkom dotazu sú záznamy, ktoré vyhovujú danej logickej podmienke. Syntax je nasledovná: <source lang="sql">
 
   SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky WHERE logicka_podmienka
 
   SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky WHERE logicka_podmienka
</source>
+
</source> '''Logická podmienka''' je výraz, ktorého výsledok môže byť pravda (true) alebo nepravda (false). V logickej podmienke sa používajú relačné operátory:  
'''Logická podmienka''' je výraz, ktorého výsledok môže byť pravda (true) alebo nepravda (false). V logickej podmienke sa používajú relačné operátory:
+
 
{|class="wikitable"
+
{| class="wikitable"
 
|-
 
|-
!=
+
! =  
|porovnanie  
+
| porovnanie
 
|-
 
|-
!<nowiki>>=</nowiki>
+
! <nowiki>>=</nowiki>  
|väčší rovný
+
| väčší rovný
 
|-
 
|-
!<nowiki>></nowiki>
+
! <nowiki>></nowiki>  
|väčší
+
| väčší
 
|-
 
|-
!<nowiki><=</nowiki>
+
! <nowiki><=</nowiki>  
|menší rovný
+
| menší rovný
 
|-
 
|-
!<nowiki><</nowiki>
+
! <nowiki><</nowiki>  
|menší
+
| menší
 
|-
 
|-
!IS NULL
+
! IS NULL  
|Test na hodnotu NULL
+
| Test na hodnotu NULL
 
|-
 
|-
!IS
+
! IS  
|Test na logickú hodnotu true/false
+
| Test na logickú hodnotu true/false
 
|-
 
|-
!LIKE
+
! LIKE  
|Porovnávanie reťazcov
+
| Porovnávanie reťazcov
 
|-
 
|-
!<nowiki>!=, <></nowiki>
+
! <nowiki>!=, <></nowiki>  
|Operátor nerovnsti
+
| Operátor nerovnsti
 
|-
 
|-
!NOT LIKE
+
! NOT LIKE  
|Negácia pri porovnávaní reťazcov
+
| Negácia pri porovnávaní reťazcov
 
|-
 
|-
!BETWEEN
+
! BETWEEN  
|Výber hodnoty z daného intervalu
+
| Výber hodnoty z daného intervalu
 
|}
 
|}
'''Úloha''': Vyberte všetky mestá, v ktorých je populácia väčšia ako 5 000 000.
 
  
Riešenie:
+
'''Úloha''': Vyberte všetky mestá, v ktorých je populácia väčšia ako 5 000 000.
 +
 
 +
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE Population>5000000
 
   SELECT * FROM city WHERE Population>5000000
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select3.png|center]]  
[[Súbor:SQL - select3.png|center]]
 
  
'''Úloha:''' Vyber všetky mestá, ktoré majú kód krajiny "SVK"
+
'''Úloha:''' Vyber všetky mestá, ktoré majú kód krajiny "SVK"  
  
Riešenie:
+
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE CountryCode like "SVK"
 
   SELECT * FROM city WHERE CountryCode like "SVK"
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select4.png|center]]  
[[Súbor:SQL - select4.png|center]]
 
  
 +
<br> '''Úloha:''' Vyber všetky mestá v ktorých je populácia medzi 1 a 2 miliónmi obyvateľov
  
'''Úloha:''' Vyber všetky mestá v ktorých je populácia medzi 1 a 2 miliónmi obyvateľov
+
Riešenie:  
 
 
Riešenie:
 
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE Population between 1000000 and 2000000
 
   SELECT * FROM city WHERE Population between 1000000 and 2000000
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select5.png|center]]  
[[Súbor:SQL - select5.png|center]]
 
  
 +
<br> '''Úloha:''' Vyber všetky mestá, ktorých názov začína na "Bra"
  
'''Úloha:''' Vyber všetky mestá, ktorých názov začína na "Bra"
+
Riešenie:  
 
 
Riešenie:
 
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE Name LIKE 'Bra%'  
 
   SELECT * FROM city WHERE Name LIKE 'Bra%'  
</source>
+
</source>  
 
 
Výsledok:
 
[[Súbor:SQL - select6.png|center]]
 
  
Poznámka: Znak % (percento) zastupuje ľubovoľný počet znakov.
+
Výsledok: [[Image:SQL - select6.png|center]]
  
 +
Poznámka: Znak&nbsp;% (percento) zastupuje ľubovoľný počet znakov.
  
'''Úloha:''' Vyber všetky mestá, ktorých kód krajiny začína na "N" a končí na "L"
+
<br> '''Úloha:''' Vyber všetky mestá, ktorých kód krajiny začína na "N" a končí na "L"  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE CountryCode LIKE "N_L"
 
   SELECT * FROM city WHERE CountryCode LIKE "N_L"
</source>
+
</source>  
 +
 
 +
Výsledok: [[Image:SQL - select7.png|center]]
  
Výsledok:
+
Poznámka: Znak _ (podčiarkovník) zastupuje jeden znak.  
[[Súbor:SQL - select7.png|center]]
 
  
Poznámka: Znak _ (podčiarkovník) zastupuje jeden znak.
+
==== Spájanie viacerých podmienok ====
 +
 
 +
Pre vytváranie komplikovanejších logických podmienok v príkaze SELECT slúžia logické spojky. Existujú dve logické spojky:  
  
====Spájanie viacerých podmienok====
 
Pre vytváranie komplikovanejších logických podmienok v príkaze SELECT slúžia logické spojky. Existujú dve logické spojky:
 
 
*AND  
 
*AND  
**Výraz x AND y je pravdivý vtedy a len vtedy ak je pravdivý výrok x A ZÁROVEŇ je pravdivý výrok y
+
**Výraz x AND y je pravdivý vtedy a len vtedy ak je pravdivý výrok x A ZÁROVEŇ je pravdivý výrok y  
 
*OR  
 
*OR  
 
**Výraz x OR y je pravdivý vtedy ak je pravdivý výrok x ALEBO je pravdivý výrok y
 
**Výraz x OR y je pravdivý vtedy ak je pravdivý výrok x ALEBO je pravdivý výrok y
  
'''Úloha:''' Vyber všetky mestá vo Veľkej britácii, v ktorých je populácia menšia ako 100tisíc obyvateľov.
+
'''Úloha:''' Vyber všetky mestá vo Veľkej británii, v ktorých je populácia menšia ako 100tisíc obyvateľov.  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE CountryCode like "GBR" and Population<100000
 
   SELECT * FROM city WHERE CountryCode like "GBR" and Population<100000
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select8.png|center]]  
[[Súbor:SQL - select8.png|center]]
 
  
 +
<br> '''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech
  
'''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech
+
Riešenie:  
 
 
Riešenie:
 
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE CountryCode like "SVK" or CountryCode like "CZE"  
 
   SELECT * FROM city WHERE CountryCode like "SVK" or CountryCode like "CZE"  
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select9.png|center]]  
[[Súbor:SQL - select9.png|center]]
 
  
 +
<br> '''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov
  
'''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov
+
Riešenie:  
 
 
Riešenie:
 
 
<source lang="sql">
 
<source lang="sql">
 
     SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000
 
     SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select10.png|center]]  
[[Súbor:SQL - select10.png|center]]
 
  
===SELECT - usporiadanie výsledku===
+
=== SELECT - usporiadanie výsledku ===
Výsledok SQL dotazu môžeme usporiadať podľa ľubovoľného stĺpca a to zostupne alebo vzostupne. Kľúčové slovo pre takého usporiadanie je ORDER BY. Poradie je určené slovom ASC (vzostupne) alebo DESC (zostupne)
 
  
 +
Výsledok SQL dotazu môžeme usporiadať podľa ľubovoľného stĺpca a to zostupne alebo vzostupne. Kľúčové slovo pre takého usporiadanie je ORDER BY. Poradie je určené slovom ASC (vzostupne) alebo DESC (zostupne)
  
'''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa počtu obyvateľov vzostupne.
+
<br> '''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa počtu obyvateľov vzostupne.  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Population ASC
 
   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Population ASC
</source>
+
</source> Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.  
Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.
 
  
Výsledok:
+
Výsledok: [[Image:SQL - select13.png|center]]  
[[Súbor:SQL - select13.png|center]]
 
  
'''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa názvu mesta zostupne.
+
'''Úloha:''' Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa názvu mesta zostupne.  
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Name DESC
 
   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Name DESC
</source>
+
</source> Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.  
Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.
 
  
Výsledok:
+
Výsledok: [[Image:SQL - select14.png|center]]  
[[Súbor:SQL - select14.png|center]]
 
  
 +
<br>
  
===SELECT - zoskupovanie===
+
=== SELECT - zoskupovanie ===
Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie výsledok existuje kľúčové slovo GROUP BY.
+
 
Syntax príkazu SELECT pri zoskupovaní
+
Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie výsledok existuje kľúčové slovo GROUP BY. Syntax príkazu SELECT pri zoskupovaní <source lang="sql">
<source lang="sql">
 
 
SELECT zoznam_stĺpcov
 
SELECT zoznam_stĺpcov
 
   FROM zoznam_tabuliek
 
   FROM zoznam_tabuliek
 
         WHERE podmienky
 
         WHERE podmienky
 
         GROUP BY výraz_pre_zoskupenie
 
         GROUP BY výraz_pre_zoskupenie
</source>
+
</source> Zoskupenie spočíva v tom, že keď sa objavia dva riadky, ktorých hodnoty sa vo vybraných stĺpcoch (v tých, podľa ktorých zoskupujeme) zhodujú. Databázový systém sa na ne bude pozerať ako na jeden riadok (na ostatné stĺpce musíme aplikovať agregačné funkcie, ktoré vrátia jednu hodnotu pre daný všeobecný riadok). Poznámky k použitiu príkazu GROUP BY:  
Zoskupenie spočíva v tom, že keď sa objavia dva riadky, ktorých hodnoty sa vo vybraných stĺpcoch (v tých, podľa ktorých zoskupujeme) zhodujú. Databázový systém sa na ne bude pozerať ako na jeden riadok (na ostatné stĺpce musíme aplikovať agregačné funkcie, ktoré vrátia jednu hodnotu pre daný všeobecný riadok).  
+
 
Poznámky k použitiu príkazu GROUP BY:
+
*Vo výbere nebudú duplicitné záznamy (DISTINCT)  
*Vo výbere nebudú duplicitné záznamy (DISTINCT)
+
*Nepoužívajte GROUP BY, kde sa dá použiť WHERE  
*Nepoužívajte GROUP BY, kde sa dá použiť WHERE
 
 
*GROUP BY sa používa spoločne s agregačnými funkciami
 
*GROUP BY sa používa spoločne s agregačnými funkciami
  
 
+
<br> '''Úloha:''' Koľko je v danej krajine miest?  
'''Úloha:''' Koľko je v danej krajine miest?
 
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT CountryCode, COUNT(name) FROM city GROUP BY CountryCode
 
   SELECT CountryCode, COUNT(name) FROM city GROUP BY CountryCode
</source>
+
</source> Poznámka: Výsledok SQL dotazu zoskupíme podľa kódu krajiny. V tabuľke city sú mestá, ktoré majú rovnaký kód krajiny. Pomocou zápisu COUNT(name) vypočítame počet tých miest, ktoré majú rovnaký kód krajiny.  
Poznámka: Výsledok SQL dotazu zoskupíme podľa kódu krajiny. V tabuľke city sú mestá, ktoré majú rovnaký kód krajiny. Pomocou zápisu COUNT(name) vypočítame počet tých miest, ktoré majú rovnaký kód krajiny.
 
  
Výsledok:
+
Výsledok: [[Image:SQL - select15.png|center]]  
[[Súbor:SQL - select15.png|center]]
 
  
 
+
<br> '''Úloha:''' Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov.  
'''Úloha:''' Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov.
 
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
 
   SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent
 
   SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select16.png|center]]  
[[Súbor:SQL - select16.png|center]]
 
  
====SELECT - obmedzenie zoskupovania====
+
==== SELECT - obmedzenie zoskupovania ====
Zoskupené výsledky pomocou klauzuly GROUP BY môžeme obmedziť voči určitému kritériu. Na toto nám slúži kľúčové slovo HAVING. Klauzula HAVING musí odkazovať len na stĺpce v časti GROUP BY, alebo na stĺpce používajúce agregačné funkcie. HAVING obmedzuje výber v danej skupine.
+
 
Syntax je nasledovná:
+
Zoskupené výsledky pomocou klauzuly GROUP BY môžeme obmedziť voči určitému kritériu. Na toto nám slúži kľúčové slovo HAVING. Klauzula HAVING musí odkazovať len na stĺpce v časti GROUP BY, alebo na stĺpce používajúce agregačné funkcie. HAVING obmedzuje výber v danej skupine. Syntax je nasledovná: <source lang="sql">
<source lang="sql">
 
 
SELECT zoznam_stĺpcov
 
SELECT zoznam_stĺpcov
 
   FROM zoznam_tabuliek
 
   FROM zoznam_tabuliek
Riadok 280: Riadok 254:
 
         GROUP BY výraz_pre_zoskupenie
 
         GROUP BY výraz_pre_zoskupenie
 
         HAVING obmedzujúce_kritériá
 
         HAVING obmedzujúce_kritériá
</source>
+
</source>  
  
'''Úloha:''' Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov. Zaujímajú nás len štáty s 10 a viac mestami
+
'''Úloha:''' Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov. Zaujímajú nás len štáty s 10 a viac mestami  
 +
 
 +
Riešenie:
 +
<source lang="sql">
 +
  SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent HAVING COUNT(name)>=10
 +
</source>
 +
 
 +
Výsledok: [[Image:SQL - select16.png|center]]
 +
 
 +
<br> '''Úloha:''' Vyber všetky okresy spolu s ich počtom obyvateľov v danom okrese, kde je ale priemerný počet obyvateľov menší ako 100000
 +
 
 +
Riešenie:
 +
<source lang="sql">
 +
  SELECT District, avg(population) FROM city GROUP BY District HAVING avg(population) <100000
 +
</source>
 +
 
 +
Výsledok: [[Image:SQL - select18.png|center]]
 +
 
 +
<br> '''Úloha:''' Vyber tie krajiny, ktoré majú aspoň 4 okresy
 +
 
 +
Riešenie:
 +
<source lang="sql">
 +
  SELECT CountryCode, count( district ) FROM city GROUP BY CountryCode HAVING count(district) >3
 +
</source>
 +
 
 +
Výsledok: [[Image:SQL - select19.png|center]]
 +
 
 +
<br> '''Úloha:''' Vyber všetky krajiny, ktorých kód krajiny končí na "A" spolu s počtami jej okresov
 +
 
 +
Riešenie:
 +
<source lang="sql">
 +
  SELECT CountryCode, count(district) FROM city GROUP BY CountryCode HAVING CountryCode like "%A"
 +
</source>
 +
 
 +
Výsledok: [[Image:SQL - select20.png|center]]
 +
 
 +
==SELECT - výber z viacerých tabuliek==
 +
V prípade, že potrebujeme vybrať údaje z viacerých tabuliek, musíme tieto tabuľky uviesť do príkazu SELECT, a to za kľúčové slovo FROM. Zánvy tabuliek oddeľujeme čiarkou. Pravidlom je, že tieto tabuľky sú prepojené pomocou primárneho a cudzieho kľúča. Toto prepojenie musíme tiež uviesť do SQL výrazu.
 +
Zoberme si [[Jazyk_SQL#Vzorový príklad - databáza WORLD|tabuľky countrylanguage a city]]. Tieto dve tabuľky sú prepojené cez atribút ''CountryCode''. SQL príkaz, ktorý vyberie všetky údaje z týchto dvoch tabuliek bude nasledujúci:
 +
 
 +
<source lang="sql">
 +
  SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode
 +
</source>
 +
 
 +
 
 +
Výsledok tohto dotazu je nasledujúci:
 +
 
 +
[[Image:SQL - select21.png|center]]
 +
 
 +
Ako vidieť, výsledok dotazu je zoznam jazykov ktorými sa hovorí v jednotlivých mestách sveta.
 +
 
 +
 
 +
'''Úloha:''' Akými jazykmi sa hovorí v Bratislave?
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent HAVING COUNT(name)>=10
+
   SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode AND name LIKE 'Bratislava'
</source>
+
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select22.png|center]]  
[[Súbor:SQL - select16.png|center]]
 
  
  
'''Úloha:''' Vyber všetky okresy spolu s ich počtom obyvateľov v danom okrese, kde je ale priemerný počet obyvateľov menší ako 100000
+
'''Úloha:''' V ktorých mestách sa hovorí po slovensky?
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT District, avg(population) FROM city GROUP BY District HAVING avg(population) <100000
+
   SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode AND Language LIKE 'Slovak'
</source>
+
</source>  
 +
 
 +
Výsledok: [[Image:SQL - select23.png|center]]
 +
 
  
Výsledok:
+
'''Úloha:''' Akými jazykmi sa hovorí v hlavných mestách európy?
[[Súbor:SQL - select18.png|center]]
 
  
 +
Rozbor: V tomto dotaze musíme prepojiť všetky 3 tabuľky pretože potrebujeme informácie o jazykoch ktorými sa hovorí v mestách, o mestách (resp, potrebujeme ich názov) a ešte potrebujeme informáciu, ktoré mestá sú v Európe. Posledná požadovaná informácia je v tabuľke ''country'', kde atribút ''Continent'' je vymenovaný typ kontinentov.
  
'''Úloha:''' Vyber tie krajiny, ktoré majú aspoň 4 okresy
+
Prepojenie medzi tabuľkami:
 +
*countrylanguage.CountryCode - city.CountryCode (N:1)
 +
*country.code - city.CountryCode (1:N)
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT CountryCode, count( district ) FROM city GROUP BY CountryCode HAVING count(district) >3
+
   SELECT country.name as Krajina,city.Name AS Mesto,Language, continent
</source>
+
  FROM countrylanguage, city, country
 +
  WHERE Continent = 'Europe'
 +
        AND Capital = ID
 +
        AND countrylanguage.CountryCode = city.CountryCode
 +
        AND country.code=city.CountryCode
 +
        AND isOfficial = true
 +
</source>  
  
Výsledok:
+
Výsledok: [[Image:SQL - select24.png|center]]  
[[Súbor:SQL - select19.png|center]]
 
  
  
'''Úloha:''' Vyber všetky krajiny, ktorých kód krajiny končí na "A" spolu s počtami jej okresov
+
'''Úloha:''' Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín európy?
 +
Podúloha: Vyber len tie mestám kde je viac oficiálnych jazykov.
  
 +
Rozbor: Postupujeme rovnakým spôsobom ako v predchádzajúcom príklade. Vo výsledku predchádzajúceho dotazu sa niektoré mestá opakujú podľa toho, koľkými jazykmi sa v nich hovorí. Z výsledku predchádzajúceho dotazu nás bude zaujímať názov mesta a počet jazykov, ktorými sa v ňom hovorí. Použijeme teda zoskupovanie do skupín podľa názvu mesta.
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT CountryCode, count(district) FROM city GROUP BY CountryCode HAVING CountryCode like "%A"
+
   SELECT city.name, count(language)
</source>
+
  FROM countrylanguage, city, country
 +
  WHERE Continent = 'Europe'
 +
      AND Capital = ID
 +
      AND countrylanguage.CountryCode = city.CountryCode
 +
      AND country.code=city.CountryCode
 +
      AND isOfficial = true
 +
  GROUP BY city.name
 +
</source>  
 +
 
 +
Výsledok: [[Image:SQL - select25.png|center]]
  
Výsledok:
+
Riešenie podúlohy:
[[Súbor:SQL - select20.png|center]]
+
Výsledok dotazu stačí obmedziť pomocou klauzuly HAVING:
 +
<source lang="sql">
 +
  SELECT city.name, count(language)
 +
  FROM countrylanguage, city, country
 +
  WHERE Continent = 'Europe'
 +
      AND Capital = ID
 +
      AND countrylanguage.CountryCode = city.CountryCode
 +
      AND country.code=city.CountryCode
 +
      AND isOfficial = true
 +
  GROUP BY city.name
 +
  HAVING count(language)>1
 +
</source>
 +
== Literatúra a odkazy ==
  
==Literatúra a odkazy==
+
<references />
<references/>
 

Verzia zo dňa a času 13:51, 19. október 2010

Imbox draft.png
Toto je projekt, na ktorom sa ešte stále pracuje!!

Aj keď sú v tomto dokumente použiteľné informácie, ešte nie je dokončený. Svoje návrhy môžete vyjadriť v diskusii o tejto stránke.

Príkaz SELECT sa používa pre výber dát z databázy. Výsledok je uložený v tabuľke výsledkov.

Syntax príkazu SELECT

Základná syntax (zjednodušená) je

  SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky

Kompletná syntax je nasledujúca[1]:

SELECT 
[ALL | DISTINCT | DISTINCTROW ]
select_expr, ... 
	[FROM table_references 
	[WHERE where_condition] 
	[GROUP BY {col_name | expr | position} 
		[ASC | DESC], ... [WITH ROLLUP]] 
	[HAVING where_condition] 
	[ORDER BY {col_name | expr | position} [ASC | DESC], ...] 
	[LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] 
	[INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] 
	[FOR UPDATE | LOCK IN SHARE MODE]]

Poznámka: Výrazy v hranatých zátvorkách sú nepovinné, hodnoty oddelené čiarou (|) v zložených zátvorkách znamenajú výberj jednoej hodnoty z viacerých.

SELECT výber všetkých údajov

Úloha: vyberte všetky záznamy z tabuľky city.

Riešenie:

  SELECT * from city

Výsledok:

Úloha: vyberte všetky záznamy z tabuľkt city. Vo výbere bude len názov mesta a populácia.

Riešenie:

  SELECT Name, Population from city

Výsledok:

SELECT eliminácia duplicitných záznamov

Pre elimináciu duplicitných záznamov vo výsledku dotazu slúži kľúčové slovo DISTINCT.

Úloha: Vyber všetky kódy krajín z tabuľky city.

Riešenie:

   SELECT DISTINCT CountryCode FROM city

Výsledok:


Úloha: Aké formy vlády sú na jednotlivých kontinentoch?

Vysvetlenie: Údaje o krajinách sú v tabuľke country. Pri každej krajine sú okrem iných aj informácie o forme vlády (GovernmentForm), kontinente, na ktorom sa nachádza (Continent). Keďže nás nezaujímajú samotné krajiny ale len kontinenty na ktorých ležia, dotazom SELECT Continent, GovernmentForm FROM country by sme dostali duplicitné záznamy, pretože na danom kontinente sú krajiny, ktoré majú rovnaké formy vlády.

Riešenie:

   SELECT DISTINCT Continent, GovernmentForm FROM country

Výsledok:

SELECT obmedzenie výberu

Pre obmedzenie počtu výsledkov sa v príkaze SQL používa kľúčové slovo WHERE. Za kľúčové slovo sa píše logická podmienka. Výsledkom dotazu sú záznamy, ktoré vyhovujú danej logickej podmienke. Syntax je nasledovná:

  SELECT názvy_stĺpcov_tabuľky FROM názov_tabuľky WHERE logicka_podmienka

Logická podmienka je výraz, ktorého výsledok môže byť pravda (true) alebo nepravda (false). V logickej podmienke sa používajú relačné operátory:

= porovnanie
>= väčší rovný
> väčší
<= menší rovný
< menší
IS NULL Test na hodnotu NULL
IS Test na logickú hodnotu true/false
LIKE Porovnávanie reťazcov
!=, <> Operátor nerovnsti
NOT LIKE Negácia pri porovnávaní reťazcov
BETWEEN Výber hodnoty z daného intervalu

Úloha: Vyberte všetky mestá, v ktorých je populácia väčšia ako 5 000 000.

Riešenie:

  SELECT * FROM city WHERE Population>5000000

Výsledok:

Úloha: Vyber všetky mestá, ktoré majú kód krajiny "SVK"

Riešenie:

  SELECT * FROM city WHERE CountryCode like "SVK"

Výsledok:


Úloha: Vyber všetky mestá v ktorých je populácia medzi 1 a 2 miliónmi obyvateľov

Riešenie:

  SELECT * FROM city WHERE Population between 1000000 and 2000000

Výsledok:


Úloha: Vyber všetky mestá, ktorých názov začína na "Bra"

Riešenie:

  SELECT * FROM city WHERE Name LIKE 'Bra%'

Výsledok:

Poznámka: Znak % (percento) zastupuje ľubovoľný počet znakov.


Úloha: Vyber všetky mestá, ktorých kód krajiny začína na "N" a končí na "L"

Riešenie:

  SELECT * FROM city WHERE CountryCode LIKE "N_L"

Výsledok:

Poznámka: Znak _ (podčiarkovník) zastupuje jeden znak.

Spájanie viacerých podmienok

Pre vytváranie komplikovanejších logických podmienok v príkaze SELECT slúžia logické spojky. Existujú dve logické spojky:

  • AND
    • Výraz x AND y je pravdivý vtedy a len vtedy ak je pravdivý výrok x A ZÁROVEŇ je pravdivý výrok y
  • OR
    • Výraz x OR y je pravdivý vtedy ak je pravdivý výrok x ALEBO je pravdivý výrok y

Úloha: Vyber všetky mestá vo Veľkej británii, v ktorých je populácia menšia ako 100tisíc obyvateľov.

Riešenie:

  SELECT * FROM city WHERE CountryCode like "GBR" and Population<100000

Výsledok:


Úloha: Vyber všetky mestá zo Slovenska a z Čiech

Riešenie:

  SELECT * FROM city WHERE CountryCode like "SVK" or CountryCode like "CZE"

Výsledok:


Úloha: Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov

Riešenie:

    SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000

Výsledok:

SELECT - usporiadanie výsledku

Výsledok SQL dotazu môžeme usporiadať podľa ľubovoľného stĺpca a to zostupne alebo vzostupne. Kľúčové slovo pre takého usporiadanie je ORDER BY. Poradie je určené slovom ASC (vzostupne) alebo DESC (zostupne)


Úloha: Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa počtu obyvateľov vzostupne.

Riešenie:

   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Population ASC

Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné. Výsledok:

Úloha: Vyber všetky mestá zo Slovenska a z Čiech, ktoré majú menej ako 100 tisíc obyvateľov. Výsledok usporiadaj podľa názvu mesta zostupne.

Riešenie:

   SELECT * FROM city WHERE (CountryCode like "SVK" or CountryCode like "CZE") and population<100000 ORDER BY Name DESC

Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné. Výsledok:


SELECT - zoskupovanie

Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie výsledok existuje kľúčové slovo GROUP BY. Syntax príkazu SELECT pri zoskupovaní

SELECT zoznam_stĺpcov
   FROM zoznam_tabuliek
        WHERE podmienky
        GROUP BY výraz_pre_zoskupenie

Zoskupenie spočíva v tom, že keď sa objavia dva riadky, ktorých hodnoty sa vo vybraných stĺpcoch (v tých, podľa ktorých zoskupujeme) zhodujú. Databázový systém sa na ne bude pozerať ako na jeden riadok (na ostatné stĺpce musíme aplikovať agregačné funkcie, ktoré vrátia jednu hodnotu pre daný všeobecný riadok). Poznámky k použitiu príkazu GROUP BY:

  • Vo výbere nebudú duplicitné záznamy (DISTINCT)
  • Nepoužívajte GROUP BY, kde sa dá použiť WHERE
  • GROUP BY sa používa spoločne s agregačnými funkciami


Úloha: Koľko je v danej krajine miest?

Riešenie:

   SELECT CountryCode, COUNT(name) FROM city GROUP BY CountryCode

Poznámka: Výsledok SQL dotazu zoskupíme podľa kódu krajiny. V tabuľke city sú mestá, ktoré majú rovnaký kód krajiny. Pomocou zápisu COUNT(name) vypočítame počet tých miest, ktoré majú rovnaký kód krajiny. Výsledok:


Úloha: Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov.

Riešenie:

   SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent

Výsledok:

SELECT - obmedzenie zoskupovania

Zoskupené výsledky pomocou klauzuly GROUP BY môžeme obmedziť voči určitému kritériu. Na toto nám slúži kľúčové slovo HAVING. Klauzula HAVING musí odkazovať len na stĺpce v časti GROUP BY, alebo na stĺpce používajúce agregačné funkcie. HAVING obmedzuje výber v danej skupine. Syntax je nasledovná:

SELECT zoznam_stĺpcov
   FROM zoznam_tabuliek
        WHERE podmienky
        GROUP BY výraz_pre_zoskupenie
        HAVING obmedzujúce_kritériá

Úloha: Koľko štátov je v jednotlivých kontinentoch, takých, ktorých populácia je väčšia ako 5 miliónov. Zaujímajú nás len štáty s 10 a viac mestami

Riešenie:

   SELECT Continent, count(name) FROM country WHERE population>5000000  GROUP BY Continent HAVING COUNT(name)>=10

Výsledok:


Úloha: Vyber všetky okresy spolu s ich počtom obyvateľov v danom okrese, kde je ale priemerný počet obyvateľov menší ako 100000

Riešenie:

   SELECT District, avg(population) FROM city GROUP BY District HAVING avg(population) <100000

Výsledok:


Úloha: Vyber tie krajiny, ktoré majú aspoň 4 okresy

Riešenie:

   SELECT CountryCode, count( district ) FROM city GROUP BY CountryCode HAVING count(district) >3

Výsledok:


Úloha: Vyber všetky krajiny, ktorých kód krajiny končí na "A" spolu s počtami jej okresov

Riešenie:

   SELECT CountryCode, count(district) FROM city GROUP BY CountryCode HAVING CountryCode like "%A"

Výsledok:

SELECT - výber z viacerých tabuliek

V prípade, že potrebujeme vybrať údaje z viacerých tabuliek, musíme tieto tabuľky uviesť do príkazu SELECT, a to za kľúčové slovo FROM. Zánvy tabuliek oddeľujeme čiarkou. Pravidlom je, že tieto tabuľky sú prepojené pomocou primárneho a cudzieho kľúča. Toto prepojenie musíme tiež uviesť do SQL výrazu. Zoberme si tabuľky countrylanguage a city. Tieto dve tabuľky sú prepojené cez atribút CountryCode. SQL príkaz, ktorý vyberie všetky údaje z týchto dvoch tabuliek bude nasledujúci:

   SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode


Výsledok tohto dotazu je nasledujúci:

Ako vidieť, výsledok dotazu je zoznam jazykov ktorými sa hovorí v jednotlivých mestách sveta.


Úloha: Akými jazykmi sa hovorí v Bratislave?

Riešenie:

   SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode AND name LIKE 'Bratislava'

Výsledok:


Úloha: V ktorých mestách sa hovorí po slovensky?

Riešenie:

   SELECT * FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode AND Language LIKE 'Slovak'

Výsledok:


Úloha: Akými jazykmi sa hovorí v hlavných mestách európy?

Rozbor: V tomto dotaze musíme prepojiť všetky 3 tabuľky pretože potrebujeme informácie o jazykoch ktorými sa hovorí v mestách, o mestách (resp, potrebujeme ich názov) a ešte potrebujeme informáciu, ktoré mestá sú v Európe. Posledná požadovaná informácia je v tabuľke country, kde atribút Continent je vymenovaný typ kontinentov.

Prepojenie medzi tabuľkami:

  • countrylanguage.CountryCode - city.CountryCode (N:1)
  • country.code - city.CountryCode (1:N)

Riešenie:

   SELECT country.name as Krajina,city.Name AS Mesto,Language, continent 
   FROM countrylanguage, city, country
   WHERE Continent = 'Europe'
         AND Capital = ID
         AND countrylanguage.CountryCode = city.CountryCode
         AND country.code=city.CountryCode
         AND isOfficial = true

Výsledok:


Úloha: Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín európy? Podúloha: Vyber len tie mestám kde je viac oficiálnych jazykov.

Rozbor: Postupujeme rovnakým spôsobom ako v predchádzajúcom príklade. Vo výsledku predchádzajúceho dotazu sa niektoré mestá opakujú podľa toho, koľkými jazykmi sa v nich hovorí. Z výsledku predchádzajúceho dotazu nás bude zaujímať názov mesta a počet jazykov, ktorými sa v ňom hovorí. Použijeme teda zoskupovanie do skupín podľa názvu mesta. Riešenie:

   SELECT city.name, count(language)
   FROM countrylanguage, city, country
   WHERE Continent = 'Europe'
      AND Capital = ID
      AND countrylanguage.CountryCode = city.CountryCode
      AND country.code=city.CountryCode
      AND isOfficial = true
   GROUP BY city.name

Výsledok:

Riešenie podúlohy: Výsledok dotazu stačí obmedziť pomocou klauzuly HAVING:

   SELECT city.name, count(language)
   FROM countrylanguage, city, country
   WHERE Continent = 'Europe'
      AND Capital = ID
      AND countrylanguage.CountryCode = city.CountryCode
      AND country.code=city.CountryCode
      AND isOfficial = true
   GROUP BY city.name
   HAVING count(language)>1

Literatúra a odkazy