SQL - select: Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
d
 
(3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 3: Riadok 3:
 
== Syntax príkazu SELECT ==
 
== Syntax príkazu SELECT ==
  
Základná syntax (zjednodušená) je <source lang="sql">
+
Základná syntax (zjednodušená) je:
 +
<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>
Riadok 19: Riadok 20:
 
</source>  
 
</source>  
 
kde:
 
kde:
* select_expr - definícia samotného výberu,
+
* ''select_expr'' - definícia samotného výberu,
* FROM tabulky - určuje z ktorých databázových tabuliek sa budú vyberať údaje,
+
* FROM ''tabulky'' - určuje z ktorých databázových tabuliek sa budú vyberať údaje,
 
* WHERE - definuje obmedzujúce kritériá pre výber údajov,
 
* WHERE - definuje obmedzujúce kritériá pre výber údajov,
* GROUP BY - výsledok dotazu zlúži do skupín podľa definovanej spoločnej vlastnosti,
+
* GROUP BY - výsledok dotazu zlúči do skupín podľa definovanej spoločnej vlastnosti,
 
* HAVING - obmedzuje výber v skupinách,
 
* HAVING - obmedzuje výber v skupinách,
 
* ORDER BY - usporiadanie výsledku,
 
* ORDER BY - usporiadanie výsledku,
Riadok 67: Riadok 68:
 
|}
 
|}
  
'''Ú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ľky ''city''. Vo výbere bude len názov mesta a populácia.  
  
 
Riešenie:  
 
Riešenie:  
Riadok 78: Riadok 79:
 
{| class="datatable"
 
{| class="datatable"
 
|-
 
|-
!name            
+
!Name            
!population
+
!Population
 
|-
 
|-
 
| Košice        ||    242874  
 
| Košice        ||    242874  
Riadok 118: Riadok 119:
 
   FROM table_name
 
   FROM table_name
 
</source>
 
</source>
SQL Alias Syntax pre stĺpce
 
  
'''Príklad:''' Z tabuľky ''city'' vypíšte slovenské mestá. V záhlaví tabuľky s výsledkami dotazu uveďte slovenské ekvivalenty.
+
 
 +
'''Príklad:'''  
 +
 
 +
Z tabuľky ''city'' vypíšte slovenské mestá. V záhlaví tabuľky s výsledkami dotazu uveďte slovenské ekvivalenty.
 +
 
 
<source lang="SQL">
 
<source lang="SQL">
   SELECT Name AS mesto, CountryCode AS KodKrajiny
+
   SELECT Name AS Mesto, CountryCode AS KodKrajiny
 
   FROM  `city`  
 
   FROM  `city`  
 
   WHERE CountryCode =  'SVK'
 
   WHERE CountryCode =  'SVK'
Riadok 128: Riadok 132:
  
 
Výsledok:
 
Výsledok:
{| class=wikitable
+
{| class=datatable
 
|-
 
|-
!mesto
+
!Mesto
 
!KodKrajiny
 
!KodKrajiny
 
|-
 
|-
Riadok 152: Riadok 156:
 
|}
 
|}
 
=== SELECT - obmedzenie počtu záznamov vo výsledku===
 
=== SELECT - obmedzenie počtu záznamov vo výsledku===
 +
LIMIT sa používa na obmedzenie počtu vrátených výsledkov. Používa sa napríklad pre zobrazenie len N výsledkov, alebo pre zobrazenie výsledkov rozmedzí od X do Y.
 +
 +
Syntax:
 +
<source lang="sql">
 +
  SELECT * FROM tabulka LIMIT X,Y
 +
</source>
  
LIMIT sa používa na obmedzenie MySQL výsledkov dotazu na tie, ktoré spadajú do určenom rozsahu. You can use it to show the first X number of results, or to show a range from X - Y results. Môžete ju použiť pre zobrazenie na prvej X počet výsledkov, alebo ukázať rozmedzí od X - Y výsledky. It is phrased as Limit X, Y and included at the end of your query . Je formulovaný ako Limit X, Y a zaradené na konci vášho dotazu . X is the starting point (remember the first record is 0) and Y is the duration (how many records to display). X je východiskový bod (spomeňte si na prvý záznam je 0) a Y je doba trvania (koľko záznamov na zobrazenie).
+
kde
 +
* X - číslo záznamu, ktoré bude vo výsledku prvé
 +
* Y - počet záznamov vo výsledku.
  
 
Príklady:
 
Príklady:
  
SELECT * FROM `your_table` LIMIT 0, 10  
+
Zobrazí sa prvých 10 výsledkov z tabuľky ''city''.
 +
<source lang="sql">
 +
    SELECT * FROM city LIMIT 0, 10  
 +
</source>
  
Tým sa zobrazí prvých 10 výsledkov z databázy.
 
  
SELECT * FROM `your_table` LIMIT 5, 5
+
Zobrazí 8 záznamov z tabuľky city, pričom prvý vrátený záznam bude 5-ty z celkového poradia. Teda vráti záznamy 4, 5, 6, 7, 8, 9, 10 a 11. Prvý záznam má vždy poradové číslo 0.
 +
<source lang="sql">
 +
    SELECT * FROM city LIMIT 5, 8
 +
</source>
  
To sa prejaví záznamov 6, 7, 8, 9 a 10
+
''Poznámka'': Vo všetkých nasledujúcich príkladoch je na koniec SQL príkazu doplnený výraz 'LIMIT 0,8'. Teda výsledkom dotazu je vždy prvých 8 záznamov.
  
Vo všetkých nasledujúcich príkladoch je na koniec SQL príkazu doplnený výraz 'LIMIT 0,8'. Teda výsledkom dotazu je vždy maximálne 8 záznamov.
+
=== SELECT - eliminácia duplicitných záznamov ===
=== SELECT eliminácia duplicitných záznamov ===
 
  
 
Pre elimináciu duplicitných záznamov vo výsledku dotazu slúži kľúčové slovo DISTINCT.  
 
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.  
+
'''Úloha:'''
 +
Vyber všetky kódy krajín z tabuľky city.  
  
 
Riešenie:  
 
Riešenie:  
Riadok 176: Riadok 193:
 
   SELECT DISTINCT CountryCode FROM city
 
   SELECT DISTINCT CountryCode FROM city
 
</source>  
 
</source>  
 +
  
 
Výsledok:
 
Výsledok:
Riadok 205: Riadok 223:
  
  
'''Ú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'') v danej krajine, ďalej informácie o 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:  
Riadok 213: Riadok 233:
 
   SELECT DISTINCT Continent, GovernmentForm FROM country
 
   SELECT DISTINCT Continent, GovernmentForm FROM country
 
</source>  
 
</source>  
 +
  
 
Výsledok:  
 
Výsledok:  
 
 
{| class="datatable"
 
{| class="datatable"
 
|-
 
|-
Riadok 242: Riadok 262:
 
|}
 
|}
  
=== 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> '''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:  
+
</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:  
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
|+ Relačné operátory v MySQL
 
|-
 
|-
 
! =  
 
! =  
Riadok 254: Riadok 277:
 
|-
 
|-
 
! <nowiki>>=</nowiki>  
 
! <nowiki>>=</nowiki>  
| väčší rovný
+
| väčší alebo rovný
 
|-
 
|-
 
! <nowiki>></nowiki>  
 
! <nowiki>></nowiki>  
Riadok 260: Riadok 283:
 
|-
 
|-
 
! <nowiki><=</nowiki>  
 
! <nowiki><=</nowiki>  
| menší rovný
+
| menší alebo rovný
 
|-
 
|-
 
! <nowiki><</nowiki>  
 
! <nowiki><</nowiki>  
Riadok 269: Riadok 292:
 
|-
 
|-
 
! IS  
 
! IS  
| Test na logickú hodnotu true/false
+
| Test na logickú hodnotu true/false alebo na hodnotu NULL
 
|-
 
|-
 
! LIKE  
 
! LIKE  
Riadok 275: Riadok 298:
 
|-
 
|-
 
! <nowiki>!=, <></nowiki>  
 
! <nowiki>!=, <></nowiki>  
| Operátor nerovnsti
+
| Operátor nerovnosti
 
|-
 
|-
 
! NOT LIKE  
 
! NOT LIKE  
Riadok 284: Riadok 307:
 
|}
 
|}
  
'''Úloha''': Vyberte všetky mestá, v ktorých je populácia väčšia ako 5 000 000.  
+
'''Úloha''':
 +
Vyberte všetky mestá, v ktorých je populácia väčšia ako 5 000 000.  
  
 
Riešenie:  
 
Riešenie:  
Riadok 318: Riadok 342:
  
  
'''Ú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>  
  
Riadok 344: Riadok 370:
  
  
'''Ú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:  
Riadok 381: Riadok 408:
  
 
'''Ú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:  
Riadok 386: Riadok 414:
 
   SELECT * FROM city WHERE Name LIKE 'Bra%'  
 
   SELECT * FROM city WHERE Name LIKE 'Bra%'  
 
</source>  
 
</source>  
 +
  
 
Výsledok:  
 
Výsledok:  
Riadok 420: Riadok 449:
 
   SELECT * FROM city WHERE CountryCode LIKE "N_L"
 
   SELECT * FROM city WHERE CountryCode LIKE "N_L"
 
</source>  
 
</source>  
 +
  
 
Výsledok:  
 
Výsledok:  
 
 
{| class="datatable"
 
{| class="datatable"
 
|-
 
|-
Riadok 457: Riadok 486:
  
 
==== Spájanie viacerých podmienok ====
 
==== 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:  
 
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:Výraz ''x OR y'' je pravdivý vtedy ak je pravdivý výrok ''x'' alebo 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.  
+
'''Úloha:''' Vyber všetky mestá vo Veľkej Británii, v ktorých je populácia menšia ako 100 tisí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>  
  
Riadok 499: Riadok 525:
  
  
'''Ú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>  
  
Riadok 533: Riadok 559:
  
  
'''Ú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>  
  
Riadok 561: Riadok 587:
 
| 3348 || Pardubice        || CZE        || Vřchodná Cechy    ||      91309  
 
| 3348 || Pardubice        || CZE        || Vřchodná Cechy    ||      91309  
 
|}
 
|}
 +
 +
'''Poznámka:''' pri použití komplikovanejších dotazov potrebujeme použiť viac logických operátorov. Spôsob ako jednoducho určiť prioritu týchto operátorov je použiť zátvorky. Ak by sme v predchádzajúcom SQL dotaze vynechali zátvorky význam by bol tento: vyber slovenské mestá alebo české mestá s populáciou menšou ako 100000.
  
 
=== 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). Kľúčové slovo ORDER BY sa vždy uvádza na konci SQL dotazu.
  
  
Riadok 571: Riadok 599:
 
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> Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.  
+
</source>  
 +
 
 +
Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.  
  
 
Výsledok:  
 
Výsledok:  
Riadok 600: Riadok 630:
 
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> Poznámka: V prípade, ak usporiadavame údaje vzostupne kľúčové slovo ASC je nepovinné.
+
</source>  
  
 
Výsledok:  
 
Výsledok:  
Riadok 634: Riadok 664:
 
</source>
 
</source>
  
Dotaz vráti výsledky pre omedzujúcu podmienku: ''atribut_n'' má hodnotu z uvedených za operátorom IN
+
Dotaz vráti výsledky pre omedzujúcu podmienku: ''atribut_n'' má hodnotu z uvedených za operátorom IN.
  
 
'''Príklad''': Z tabuľky city vyberte mestá, s počtom obyvateľov nad 350000. Výber obmedzte len na krajiny Slovensko, Česká republika, Poľsko.
 
'''Príklad''': Z tabuľky city vyberte mestá, s počtom obyvateľov nad 350000. Výber obmedzte len na krajiny Slovensko, Česká republika, Poľsko.
Riadok 648: Riadok 678:
  
 
Výsledok:
 
Výsledok:
{| class=wikitable
+
{| class=datatable
 
|-
 
|-
 
!ID
 
!ID
Riadok 677: Riadok 707:
 
=== 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í <source lang="sql">
+
Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie existuje kľúčové slovo GROUP BY. Syntax príkazu SELECT pri zoskupovaní:
 +
<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 sa zlúčia (zoskupia) riadky v ktorých sa hodnoty 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ý, resp. zlúčený 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.
  
  
'''Úloha:''' Koľko je v danej krajine miest?  
+
'''Úloha:''' Koľko je v danej krajine miest? Zaujíma nás počet miest v každej krajine.
  
 
Riešenie:  
 
Riešenie:  
Riadok 698: Riadok 729:
 
</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 zlúčené do jedného riadku. Pomocou zápisu COUNT(''name'') vypočítame počet tých miest, ktoré majú rovnaký kód krajiny.  
  
 
Výsledok:  
 
Výsledok:  
Riadok 724: Riadok 755:
  
  
'''Ú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>  
  
Riadok 755: Riadok 786:
 
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
 
         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 kontinenty s 10 a viac krajinami.
  
 
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 Continent, COUNT(name) FROM country WHERE population>5000000  GROUP BY Continent HAVING COUNT(name)>=10
 
</source>  
 
</source>  
  
Riadok 783: Riadok 814:
  
  
'''Ú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:''' 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:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT District, avg(population) FROM city GROUP BY District HAVING avg(population) <100000
+
   SELECT District, AVG(population) FROM city GROUP BY District HAVING AVG(population) < 100000
 
</source>  
 
</source>  
  
Riadok 814: Riadok 845:
  
  
'''Úloha:''' Vyber tie krajiny, ktoré majú aspoň 4 okresy  
+
'''Úloha:''' Vyber tie krajiny, ktoré majú aspoň 4 okresy.
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT CountryCode, count( district ) FROM city GROUP BY CountryCode HAVING count(district) >3
+
   SELECT CountryCode, COUNT(district) FROM city GROUP BY CountryCode HAVING COUNT(district)>3
 
</source>  
 
</source>  
  
Riadok 844: Riadok 875:
 
|}
 
|}
  
 +
Poznámka: Na riešenie tohto dotazu sa nedá použiť časť WHERE, pretože dané obmedzenie výsledku je potrebné robiť po zoskupení. Pomocou časti WHERE dokážeme výsledok obmedziť, ale to je ešte pred zlúčením do skupín.
  
'''Úloha:''' Vyber všetky krajiny, ktorých kód krajiny končí na 'A' spolu s počtami jej okresov
+
'''Úloha:''' Vyber všetky krajiny, ktorých kód krajiny končí na 'A' spolu s počtom ľudí v danej krajine. Vo výsledku nech sú len tie krajiny, ktorých priemerný počet obyvateľov je väčší ako 300 000.
 +
 
 +
Analýza: Krajiny, ktorých kód sa končí na písmeno 'A' môžeme obmedziť pomocou výrazu za časťou WHERE. Súčet obyvateľov miest v danej krajine docielime pomocou funkcie SUM. Obmedzenie na tie krajiny, ktoré majú priemerný počet obyvateľov viac ako 300 000 musíme urobiť až po zoskupení výsledkov, teda pomocou kľúčového slova HAVING. Výpočet priemerného počtu docielime použitím funkcie AVG.
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT CountryCode, count(district) FROM city GROUP BY CountryCode HAVING CountryCode like "%A"
+
   SELECT CountryCode, SUM(Population) FROM city WHERE CountryCode LIKE "%A" GROUP BY CountryCode HAVING AVG(Population)>300000
 
</source>  
 
</source>  
  
Riadok 856: Riadok 890:
 
|-
 
|-
 
! CountryCode  
 
! CountryCode  
! count(district)  
+
! SUM(Population)  
|-
 
| AIA        ||              2
 
|-
 
| BFA        ||              3
 
 
|-
 
|-
| BRA        ||             250
+
|BFA ||1229000
 
|-
 
|-
| BWA        ||               2
+
|BRA ||85876862
 
|-
 
|-
| DMA        ||               1
+
|GHA ||1819889
 
|-
 
|-
| DZA        ||             18
+
|LVA ||968596
 
|-
 
|-
| FRA        ||             40
+
|THA ||7953161
 
|-
 
|-
| GHA        ||               5
+
|UGA ||890800
 
|}
 
|}
  
 
==SELECT - výber z viacerých tabuliek==
 
==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.
+
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. Názvy 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:
+
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">
 
<source lang="sql">
 
   SELECT city.CountryCode, city.name, language, isOfficial, percentage FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode
 
   SELECT city.CountryCode, city.name, language, isOfficial, percentage FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode
 
</source>  
 
</source>  
 
  
 
Výsledok tohto dotazu je nasledujúci:
 
Výsledok tohto dotazu je nasledujúci:
Riadok 967: Riadok 996:
  
  
'''Úloha:''' Akými jazykmi sa hovorí v hlavných mestách európy?
+
'''Ú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.
+
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, informácie 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. V nasledujúcom texte je použité označenie ''tabuľka.atribút''. Toto označenie sa používa v tých prípadoch, ak pracujeme s viacerými tabuľkami a názvy niektorých atribútov sú rovnaké.
  
Prepojenie medzi tabuľkami:
+
Prepojenie medzi tabuľkami :
*countrylanguage.CountryCode - city.CountryCode (N:1)
+
*''countrylanguage.CountryCode'' - ''city.CountryCode'' (N:1)
*country.code - city.CountryCode (1:N)
+
*''country.code'' - ''city.CountryCode'' (1:N)
  
 
Riešenie:  
 
Riešenie:  
 
<source lang="sql">
 
<source lang="sql">
   SELECT country.name as Krajina,city.Name AS Mesto,Language, continent  
+
   SELECT country.name AS Krajina,city.Name AS Mesto,Language, continent  
 
   FROM countrylanguage, city, country
 
   FROM countrylanguage, city, country
 
   WHERE Continent = 'Europe'
 
   WHERE Continent = 'Europe'
Riadok 1 013: Riadok 1 042:
  
  
'''Úloha:''' Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín európy?
+
'''Úloha:''' Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín Európy?
 +
 
  
 
Podúloha: Vyber len tie mestá, kde je viac oficiálnych jazykov.
 
Podúloha: Vyber len tie mestá, 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.
 
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 city.name, count(language)
+
   SELECT city.name, COUNT(language)
 
   FROM countrylanguage, city, country
 
   FROM countrylanguage, city, country
 
   WHERE Continent = 'Europe'
 
   WHERE Continent = 'Europe'
Riadok 1 057: Riadok 1 090:
 
Výsledok dotazu stačí obmedziť pomocou klauzuly HAVING:
 
Výsledok dotazu stačí obmedziť pomocou klauzuly HAVING:
 
<source lang="sql">
 
<source lang="sql">
   SELECT city.name, count(language)
+
   SELECT city.name, COUNT(language)
 
   FROM countrylanguage, city, country
 
   FROM countrylanguage, city, country
 
   WHERE Continent = 'Europe'
 
   WHERE Continent = 'Europe'
Riadok 1 065: Riadok 1 098:
 
       AND isOfficial = true
 
       AND isOfficial = true
 
   GROUP BY city.name
 
   GROUP BY city.name
   HAVING count(language)>1  
+
   HAVING COUNT(language)>1  
 
</source>
 
</source>
  
 
== SELECT - spájanie tabuliek pomocou JOIN==
 
== SELECT - spájanie tabuliek pomocou JOIN==
 
SQL príkaz JOIN a používa v prípade SELECT dotazu, ktorý vyberá údaje z viacerých tabuliek.  
 
SQL príkaz JOIN a používa v prípade SELECT dotazu, ktorý vyberá údaje z viacerých tabuliek.  
Spojenie tabuliek pomocou klúčového slova JOIN môže byť 4-kého typu
+
Syntax pri použití spojenie JOIN:
;vnútorné spojenie - INNER JOIN: Vráti všetky tie záznamy, kde sa záznam podľa ktorého sú tabuľky spojené nachádza v oboch tabuľkách
+
 
;spojenie vľavo - LEFT JOIN: Vráti všetky záznamy z 'ľavej' (teda prvej) tabuľky. Dokonca aj tie, ktoré nemajú v pravej tabuľke patričný záznam.
+
<source lang="SQL">
;spojenie vpravo - RIGHT JOIN: Vráti všetky záznamy z 'pravej' (teda druhej) tabuľky. Dokonca aj tie, ktoré nemajú v ľavej tabuľke patričný záznam.
+
SELECT  select_expr
;úplné spojenie - FULL JOIN:Vráti tie záznamy, ktorých prvok voči ktorému sa vytvára spojenie existuje v minimálne jednej tabuľke.
+
  FROM tabulka1
 +
  [LEFT | RIGHT | INNER | FULL ] JOIN tabulka2
 +
  ON priradenie_atributov
 +
 
 +
priradenie_atributov::=
 +
  tabulka1.atribut1=tabulka2.atribut2
 +
</source>
 +
 
 +
kde:
 +
* ''priradenie_atributov'' je výraz, ktorým sa definuje vzájomná relácia medzi tabuľkami.
 +
 
 +
 
 +
Spojenie tabuliek pomocou kľúčového slova JOIN existuje v štyroch variantoch.
 +
;Vnútorné spojenie - INNER JOIN.: Vráti všetky tie záznamy, kde sa záznam podľa ktorého sú tabuľky spojené nachádza v oboch tabuľkách.
 +
;Spojenie vľavo - LEFT JOIN.: Vráti všetky záznamy z 'ľavej' (teda prvej) tabuľky. Dokonca aj tie, ktoré nemajú v pravej tabuľke prislúchajúci záznam.
 +
;Spojenie vpravo - RIGHT JOIN.: Vráti všetky záznamy z 'pravej' (teda druhej) tabuľky. Dokonca aj tie, ktoré nemajú v ľavej tabuľke prislúchajúci záznam.
 +
;Úplné spojenie - FULL JOIN.:Vráti tie záznamy, ktorých prvok voči ktorému sa vytvára spojenie existuje v minimálne jednej tabuľke.
 +
 
  
 
'''Úloha''':
 
'''Úloha''':
  
Budeme pracovať s databázou [[Jazyk SQL#Slovník ver.2 - obojsmerný slovník|slovník2]]. Všetky tabuľky máme čiastočne naplnené. V tabuľle slova_en je 21 slov, v tabuľke slova_sk je 25 slov. V tabuľke preklad je 21 záznamov, teda 21 prekladov. Niektoré slová nie sú preložené.
+
Budeme pracovať s databázou [[Jazyk SQL#Slovník ver.2 - obojsmerný slovník|''slovník2'']]. Všetky tabuľky máme čiastočne naplnené. V tabuľke ''slova_en'' je 21 slov, v tabuľke ''slova_sk'' je 25 slov. V tabuľke ''preklad'' je 21 záznamov, teda 21 prekladov. Niektoré slová nie sú preložené.
  
 
Zistite, ktoré slovenské a anglické slová nie sú preložené.
 
Zistite, ktoré slovenské a anglické slová nie sú preložené.
 +
  
 
Riešenie:
 
Riešenie:
Úlohou je nájsť také slovenské (anglické) slová, ktoré sa nevyskytujú v tabuľke preklad. Tabuľka slovenských (anglických) slov bude prvá tabuľka (ľavá) a tabuľka preklad bude druhá (pravá) tabuľka. Pre zistenie slov bez prekladu použijeme LEFT JOIN.
+
Úlohou je nájsť také slovenské (anglické) slová, ktoré sa nevyskytujú v tabuľke ''preklad''. Tabuľka slovenských (anglických) slov bude prvá tabuľka (ľavá) a tabuľka preklad bude druhá (pravá) tabuľka. Pre zistenie slov bez prekladu použijeme LEFT JOIN.
  
 
<source lang="sql">
 
<source lang="sql">
Riadok 1 091: Riadok 1 142:
  
 
Vysvetlenie SQL dotazu:
 
Vysvetlenie SQL dotazu:
*Vyberáme údaje z tabuľky slovnik_slova_sk; túto tabuľku považujeme za prvú - teda ľavú tabuľku
+
*Vyberáme údaje z tabuľky ''slovnik_slova_sk''; túto tabuľku považujeme za prvú - teda ľavú tabuľku.
*Tabuľku slovnik_slova_sk spojíme vľavo (LEFT JOIN) s tabuľkou slovnik_preklad
+
*Tabuľku ''slovnik_slova_sk'' spojíme vľavo (LEFT JOIN) s tabuľkou ''slovnik_preklad''.
*atribútom, ktorým tieto tabuľky spojíme je
+
*atribútom, ktorým tieto tabuľky spojíme je:
**v tabuľke slovnik_slova_sk je to ''id''
+
**v tabuľke ''slovnik_slova_sk'' je to ''id'',
**v tabuľke slovnik_preklad je to ''id_sk''
+
**v tabuľke ''slovnik_preklad'' je to ''id_sk''.
 
Vo výsledku dotazu budú všetky slovenské slová, aj tie, ku ktorým neexistuje preklad:
 
Vo výsledku dotazu budú všetky slovenské slová, aj tie, ku ktorým neexistuje preklad:
  
Riadok 1 114: Riadok 1 165:
 
| 29 || čau      ||    29 ||    4 ||    2  
 
| 29 || čau      ||    29 ||    4 ||    2  
 
|-
 
|-
| 14 || červenßá ||    14 ||    34 ||    2  
+
| 14 || červená ||    14 ||    34 ||    2  
 
|-
 
|-
 
| 12 || ísť      ||    12 ||    25 ||    2  
 
| 12 || ísť      ||    12 ||    25 ||    2  
Riadok 1 129: Riadok 1 180:
 
   SELECT id,slovo_sk FROM slovnik_slova_sk  
 
   SELECT id,slovo_sk FROM slovnik_slova_sk  
 
   LEFT JOIN slovnik_preklad ON id=id_sk  
 
   LEFT JOIN slovnik_preklad ON id=id_sk  
   where id_sk is NULL
+
   where id_sk IS NULL
 
</source>
 
</source>
  

Aktuálna revízia z 19:35, 17. január 2011

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 tabulky
   [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}]
   [INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name']

kde:

  • select_expr - definícia samotného výberu,
  • FROM tabulky - určuje z ktorých databázových tabuliek sa budú vyberať údaje,
  • WHERE - definuje obmedzujúce kritériá pre výber údajov,
  • GROUP BY - výsledok dotazu zlúči do skupín podľa definovanej spoločnej vlastnosti,
  • HAVING - obmedzuje výber v skupinách,
  • ORDER BY - usporiadanie výsledku,
  • LIMIT - definuje počet riadkov, ktoré budú vrátené ako výsledok,
  • INTO OUTFILE - výsledok dotazu môže byť uložený do súboru.

SELECT výber všetkých údajov

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

Riešenie:

  SELECT * from city

Výsledok:

ID Name CountryCode District Population
3210 Košice SVK Východné Slovensko 242874
3211 Prešov SVK Východné Slovensko 94977
1 Kabul AFG Kabol 1780000
2 Qandahar AFG Qandahar 237500
3 Herat AFG Herat 186800
4 Mazar-e-Sharif AFG Balkh 127800
5 Amsterdam NLD Noord-Holland 731200
6 Rotterdam NLD Zuid-Holland 593321
7 Haag NLD Zuid-Holland 440900
8 Utrecht NLD Utrecht 234323

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

Riešenie:

  SELECT Name, Population from city

Výsledok:

Name Population
Košice 242874
Prešov 94977
Kabul 1780000
Qandahar 237500
Herat 186800
Mazar-e-Sharif 127800
Amsterdam 731200
Rotterdam 593321
Haag 440900
Utrecht 234323

SELECT - alias

Pomocou SQL príkazu AS môžeme definovať alias tabuľke alebo jej atribútu. Používa sa na sprehľadnenie SQL dotazov.

Definovanie aliasu pre tabuľku:

   SELECT column_name(s)
   FROM table_name
   AS alias_name

Definovanie aliasu pre atribút tabuľky:

   SELECT column_name AS alias_name
   FROM table_name


Príklad:

Z tabuľky city vypíšte slovenské mestá. V záhlaví tabuľky s výsledkami dotazu uveďte slovenské ekvivalenty.

   SELECT Name AS Mesto, CountryCode AS KodKrajiny
   FROM  `city` 
   WHERE CountryCode =  'SVK'

Výsledok:

Mesto KodKrajiny
Bratislava SVK
Trenčín SVK
SOBLAHOV SVK
Trenčín SVK
Stropkov SVK
Mníchová Lehota SVK
Žilina SVK
Malá Hradná SVK
Prievidza SVK

SELECT - obmedzenie počtu záznamov vo výsledku

LIMIT sa používa na obmedzenie počtu vrátených výsledkov. Používa sa napríklad pre zobrazenie len N výsledkov, alebo pre zobrazenie výsledkov rozmedzí od X do Y.

Syntax:

   SELECT * FROM tabulka LIMIT X,Y

kde

  • X - číslo záznamu, ktoré bude vo výsledku prvé
  • Y - počet záznamov vo výsledku.

Príklady:

Zobrazí sa prvých 10 výsledkov z tabuľky city.

    SELECT * FROM city LIMIT 0, 10


Zobrazí 8 záznamov z tabuľky city, pričom prvý vrátený záznam bude 5-ty z celkového poradia. Teda vráti záznamy 4, 5, 6, 7, 8, 9, 10 a 11. Prvý záznam má vždy poradové číslo 0.

    SELECT * FROM city LIMIT 5, 8

Poznámka: Vo všetkých nasledujúcich príkladoch je na koniec SQL príkazu doplnený výraz 'LIMIT 0,8'. Teda výsledkom dotazu je vždy prvých 8 záznamov.

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:

CountryCode
SVK
AFG
NLD
ANT
ALB
DZA
ASM
AND
AGO
AIA


Ú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) v danej krajine, ďalej informácie o 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:

Continent GovernmentForm
Asia Islamic Emirate
Europe Constitutional Monarchy
North America Nonmetropolitan Territory of The Netherlands
Europe Republic
Africa Republic
Oceania US Territory
Europe Parliamentary Coprincipality
North America Dependent Territory of the UK
North America Constitutional Monarchy
Asia Emirate Federation

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:

Relačné operátory v MySQL
= porovnanie
>= väčší alebo rovný
> väčší
<= menší alebo rovný
< menší
IS NULL Test na hodnotu NULL
IS Test na logickú hodnotu true/false alebo na hodnotu NULL
LIKE Porovnávanie reťazcov
!=, <> Operátor nerovnosti
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:

ID Name CountryCode District Population
206 Sao Paulo BRA Sao Paulo 9968485
207 Rio de Janeiro BRA Rio de Janeiro 5598953
456 London GBR England 7285000
608 Cairo EGY Kairo 6789479
939 Jakarta IDN Jakarta Raya 9604900
1024 Mumbai (Bombay) IND Maharashtra 10500000
1025 Delhi IND Delhi 7206704
1380 Teheran IRN Teheran 6758845


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


Riešenie:

  SELECT * FROM city WHERE CountryCode LIKE "SVK"

Výsledok:

ID Name CountryCode District Population
3210 Košice SVK Východné Slovensko 242874
3211 Prešov SVK Východné Slovensko 94977
3209 Bratislava SVK Bratislava 432061


Ú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:

ID Name CountryCode District Population
1 Kabul AFG Kabol 1780000
70 La Matanza ARG Buenos Aires 1266461
71 Córdoba ARG Córdoba 1157507
126 Yerevan ARM Yerevan 1248700
132 Brisbane AUS Queensland 1291117
133 Perth AUS West Australia 1096829
144 Baku AZE Baki 1787800
151 Chittagong BGD Chittagong 1392860


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


Riešenie:

  SELECT * FROM city WHERE Name LIKE 'Bra%'


Výsledok:

ID Name CountryCode District Population
165 Brahmanbaria BGD Chittagong 109032
211 Brasília BRA Distrito Federal 1969868
388 Braganca Paulista BRA Sao Paulo 116929
468 Bradford GBR England 289376
743 Brakpan ZAF Gauteng 171363
1148 Brahmapur IND Orissa 210418


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:

ID Name CountryCode District Population
2729 Kathmandu NPL Central 591835
2730 Biratnagar NPL Eastern 157764
2731 Pokhara NPL Western 146318
2732 Lalitapur NPL Central 145847
2733 Birgunj NPL Central 90639
3493 Noumca NCL ? 76293
3494 Auckland NZL Auckland 381800
3495 Christchurch NZL Canterbury 324200
3496 Manukau NZL Auckland 281800
3497 North Shore NZL Auckland 187700


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 100 tisíc obyvateľov.

Riešenie:

  SELECT * FROM city WHERE CountryCode LIKE "GBR" AND Population<100000

Výsledok:

ID Name CountryCode District Population
520 Chelmsford GBR England 97451
521 Colchester GBR England 96063
522 Crawley GBR England 97000
523 Gillingham GBR England 92000
524 Solihull GBR England 94531
525 Rochdale GBR England 94313
526 Birkenhead GBR England 93087
527 Worcester GBR England 95000


Ú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:

ID Name CountryCode District Population
3210 Košice SVK Východné Slovensko 242874
3211 Prešov SVK Východné Slovensko 94977
3209 Bratislava SVK Bratislava 432061
3339 Praha CZE Hlavní mesto Praha 1181126
3340 Brno CZE Jizní Morava 381862
3341 Ostrava CZE Severní Morava 320041
3342 Plzen CZE Zapadní Cechy 166759
3343 Olomouc CZE Severní Morava 102702


Ú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:

ID Name CountryCode District Population
3211 Prešov SVK Východné Slovensko 94977
3344 Liberec CZE Severní Cechy 99155
3345 Ceské Budejovice CZE Jizní Cechy 98186
3346 Hradec Králové CZE Východní Cechy 98080
3347 Ústí nad Labem CZE Severná Cechy 95491
3348 Pardubice CZE Vřchodná Cechy 91309

Poznámka: pri použití komplikovanejších dotazov potrebujeme použiť viac logických operátorov. Spôsob ako jednoducho určiť prioritu týchto operátorov je použiť zátvorky. Ak by sme v predchádzajúcom SQL dotaze vynechali zátvorky význam by bol tento: vyber slovenské mestá alebo české mestá s populáciou menšou ako 100000.

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). Kľúčové slovo ORDER BY sa vždy uvádza na konci SQL dotazu.


Ú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:

ID Name CountryCode District Population
3348 Pardubice CZE Vřchodná Cechy 91309
3211 Prešov SVK Východné Slovensko 94977
3347 Ústí nad Labem CZE Severná Cechy 95491
3346 Hradec Králové CZE Východní Cechy 98080
3345 Ceské Budejovice CZE Jizní Cechy 98186
3344 Liberec CZE Severní Cechy 99155

Ú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

Výsledok:

ID Name CountryCode District Population
3347 Ústí nad Labem CZE Severná Cechy 95491
3211 Prešov SVK Východné Slovensko 94977
3348 Pardubice CZE Vřchodná Cechy 91309
3344 Liberec CZE Severní Cechy 99155
3346 Hradec Králové CZE Východní Cechy 98080
3345 Ceské Budejovice CZE Jizní Cechy 98186

SELECT - výber z množiny hodnôt

Pomocou operátora IN môžeme vyberať z množiny hodnôt. Základná syntax je:

   SELECT stlpce
   FROM tabulka
   WHERE atribut_n IN (value1,value2,...)

Dotaz vráti výsledky pre omedzujúcu podmienku: atribut_n má hodnotu z uvedených za operátorom IN.

Príklad: Z tabuľky city vyberte mestá, s počtom obyvateľov nad 350000. Výber obmedzte len na krajiny Slovensko, Česká republika, Poľsko.

Riešenie:

   SELECT * FROM city
   WHERE population >350000
   AND CountryCode
   IN ( 'SVK',  'CZE',  'POL')
   ORDER BY  `city`.`Population` ASC

Výsledok:

ID Name CountryCode District Population
2936 Lublin POL Lubelskie 356251
3340 Brno CZE Jizní Morava 381862
2935 Bydgoszcz POL Kujawsko-Pomorskie 386855
2934 Szczecin POL Zachodnio-Pomorskie 416988
3339 Praha CZE Hlavní mesto Praha 431061
4116 Uherske Hradiste CZE Zlinsky 452614
3209 Bratislava SVK Bratislava 452614
4117 Uherske Hradiste CZE Zlinsky 452614
2933 Gdansk POL Pomorskie 458988

SELECT - zoskupovanie

Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie 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 sa zlúčia (zoskupia) riadky v ktorých sa hodnoty 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ý, resp. zlúčený 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? Zaujíma nás počet miest v každej krajine.

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 zlúčené do jedného riadku. Pomocou zápisu COUNT(name) vypočítame počet tých miest, ktoré majú rovnaký kód krajiny.

Výsledok:

CountryCode COUNT(name)
ABW 1
AFG 4
AGO 5
AIA 2
ALB 1
AND 1
ANT 1
ARE 5


Ú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:

Continent count(name)
Asia 32
Europe 24
North America 10
Africa 32
Oceania 1
South America 9

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 kontinenty s 10 a viac krajinami.

Riešenie:

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

Výsledok:

Continent count(name)
Asia 32
Europe 24
North America 10
Africa 32


Ú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:

District avg(population)
al-Asima 28859.0000
al-Batina 90814.0000
al-Zawiya 89338.0000
Almaty 98000.0000
Andorra la Vella 21189.0000
Apure 93809.0000
Aqua Grande 49541.0000
ARMM 94861.0000


Ú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:

CountryCode count( district )
AFG 4
AGO 5
ARE 5
ARG 57
AUS 14
AUT 6
AZE 4
BEL 9

Poznámka: Na riešenie tohto dotazu sa nedá použiť časť WHERE, pretože dané obmedzenie výsledku je potrebné robiť po zoskupení. Pomocou časti WHERE dokážeme výsledok obmedziť, ale to je ešte pred zlúčením do skupín.

Úloha: Vyber všetky krajiny, ktorých kód krajiny končí na 'A' spolu s počtom ľudí v danej krajine. Vo výsledku nech sú len tie krajiny, ktorých priemerný počet obyvateľov je väčší ako 300 000.

Analýza: Krajiny, ktorých kód sa končí na písmeno 'A' môžeme obmedziť pomocou výrazu za časťou WHERE. Súčet obyvateľov miest v danej krajine docielime pomocou funkcie SUM. Obmedzenie na tie krajiny, ktoré majú priemerný počet obyvateľov viac ako 300 000 musíme urobiť až po zoskupení výsledkov, teda pomocou kľúčového slova HAVING. Výpočet priemerného počtu docielime použitím funkcie AVG.

Riešenie:

   SELECT CountryCode, SUM(Population) FROM city WHERE CountryCode LIKE "%A" GROUP BY CountryCode HAVING AVG(Population)>300000

Výsledok:

CountryCode SUM(Population)
BFA 1229000
BRA 85876862
GHA 1819889
LVA 968596
THA 7953161
UGA 890800

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. Názvy 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 city.CountryCode, city.name, language, isOfficial, percentage FROM countrylanguage, city WHERE city.CountryCode LIKE countrylanguage.CountryCode

Výsledok tohto dotazu je nasledujúci:

CountryCode name Language IsOfficial Percentage
SVK Košice Czech and Moravian F 1.1
SVK Košice Hungarian F 10.5
SVK Košice Romani F 1.7
SVK Košice Slovak T 85.6
SVK Košice Ukrainian and Russian F 0.6
SVK Prešov Czech and Moravian F 1.1
SVK Prešov Hungarian F 10.5
SVK Prešov Romani F 1.7

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 Language,isOfficial, Percentage FROM countrylanguage, city 
   WHERE city.CountryCode LIKE countrylanguage.CountryCode AND name LIKE 'Bratislava'

Výsledok:

Language isOfficial Percentage
Slovak T 85.6
Hungarian F 10.5
Romani F 1.7
Czech and Moravian F 1.1
Ukrainian and Russian F 0.6

Ú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:

Language isOfficial Percentage
Slovak T 85.6
Hungarian F 10.5
Romani F 1.7
Czech and Moravian F 1.1
Ukrainian and Russian F 0.6


Ú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, informácie 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. V nasledujúcom texte je použité označenie tabuľka.atribút. Toto označenie sa používa v tých prípadoch, ak pracujeme s viacerými tabuľkami a názvy niektorých atribútov sú rovnaké.

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:

Krajina Mesto Language continent
Netherlands Amsterdam Dutch Europe
Albania Tirana Albaniana Europe
Belgium Bruxelles [Brussel] Dutch Europe
Bosnia and Herzegovina Sarajevo Serbo-Croatian Europe
United Kingdom London English Europe
Bulgaria Sofija Bulgariana Europe
Spain Madrid Spanish Europe
Faroe Islands Trshavn Faroese Europe


Úloha: Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín Európy?


Podúloha: Vyber len tie mestá, 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:

name count(language)
Amsterdam 1
Andorra la Vella 1
Athenai 1
Beograd 1
Berlin 1
Bern 4
Bratislava 1
Bruxelles [Brussel] 3


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

SELECT - spájanie tabuliek pomocou JOIN

SQL príkaz JOIN a používa v prípade SELECT dotazu, ktorý vyberá údaje z viacerých tabuliek. Syntax pri použití spojenie JOIN:

 SELECT  select_expr
   FROM tabulka1
   [LEFT | RIGHT | INNER | FULL ] JOIN tabulka2
   ON priradenie_atributov

priradenie_atributov::=
   tabulka1.atribut1=tabulka2.atribut2

kde:

  • priradenie_atributov je výraz, ktorým sa definuje vzájomná relácia medzi tabuľkami.


Spojenie tabuliek pomocou kľúčového slova JOIN existuje v štyroch variantoch.

Vnútorné spojenie - INNER JOIN.
Vráti všetky tie záznamy, kde sa záznam podľa ktorého sú tabuľky spojené nachádza v oboch tabuľkách.
Spojenie vľavo - LEFT JOIN.
Vráti všetky záznamy z 'ľavej' (teda prvej) tabuľky. Dokonca aj tie, ktoré nemajú v pravej tabuľke prislúchajúci záznam.
Spojenie vpravo - RIGHT JOIN.
Vráti všetky záznamy z 'pravej' (teda druhej) tabuľky. Dokonca aj tie, ktoré nemajú v ľavej tabuľke prislúchajúci záznam.
Úplné spojenie - FULL JOIN.
Vráti tie záznamy, ktorých prvok voči ktorému sa vytvára spojenie existuje v minimálne jednej tabuľke.


Úloha:

Budeme pracovať s databázou slovník2. Všetky tabuľky máme čiastočne naplnené. V tabuľke slova_en je 21 slov, v tabuľke slova_sk je 25 slov. V tabuľke preklad je 21 záznamov, teda 21 prekladov. Niektoré slová nie sú preložené.

Zistite, ktoré slovenské a anglické slová nie sú preložené.


Riešenie: Úlohou je nájsť také slovenské (anglické) slová, ktoré sa nevyskytujú v tabuľke preklad. Tabuľka slovenských (anglických) slov bude prvá tabuľka (ľavá) a tabuľka preklad bude druhá (pravá) tabuľka. Pre zistenie slov bez prekladu použijeme LEFT JOIN.

   SELECT * FROM slovnik_slova_sk 
   LEFT JOIN slovnik_preklad ON id=id_sk

Vysvetlenie SQL dotazu:

  • Vyberáme údaje z tabuľky slovnik_slova_sk; túto tabuľku považujeme za prvú - teda ľavú tabuľku.
  • Tabuľku slovnik_slova_sk spojíme vľavo (LEFT JOIN) s tabuľkou slovnik_preklad.
  • atribútom, ktorým tieto tabuľky spojíme je:
    • v tabuľke slovnik_slova_sk je to id,
    • v tabuľke slovnik_preklad je to id_sk.

Vo výsledku dotazu budú všetky slovenské slová, aj tie, ku ktorým neexistuje preklad:

id slovo_sk id_sk id_en id_k
16 ahoj 16 4 2
3 atribút NULL NULL NULL
9 auto 9 7 2
29 čau 29 4 2
14 červená 14 34 2
12 ísť 12 25 2
6 jablko 6 3 2
13 mačka 13 30 2


Modifikujme dotaz, aby sme dostali len zoznam slovenských slov bez prekladu:

   SELECT id,slovo_sk FROM slovnik_slova_sk 
   LEFT JOIN slovnik_preklad ON id=id_sk 
   where id_sk IS NULL
id slovo_sk
3 atribút
8 pomaranč
1 tabuľka
4 vlastnosť

Zdroje a odkazy