SQL - select: Rozdiel medzi revíziami
(16 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
− | {{Skripta_dbs}} | + | {{Skripta_dbs}} |
− | + | 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 <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> Kompletná syntax je nasledujúca<ref>SQL syntax - http://dev.mysql.com/doc/refman/5.5/en/select.html</ref>: <source lang="sql"> | + | </source> |
− | SELECT | + | Kompletná syntax je nasledujúca<ref>SQL syntax - http://dev.mysql.com/doc/refman/5.5/en/select.html</ref>: |
− | [ALL | DISTINCT | DISTINCTROW ] | + | <source lang="sql"> |
− | select_expr | + | 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'] | |
− | + | </source> | |
− | </source> | + | 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 === | === SELECT výber všetkých údajov === | ||
Riadok 59: | Riadok 68: | ||
|} | |} | ||
− | '''Úloha:''' vyberte všetky záznamy z | + | '''Ú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 70: | Riadok 79: | ||
{| class="datatable" | {| class="datatable" | ||
|- | |- | ||
− | ! | + | !Name |
− | ! | + | !Population |
|- | |- | ||
| Košice || 242874 | | Košice || 242874 | ||
Riadok 94: | Riadok 103: | ||
|} | |} | ||
− | === SELECT eliminácia duplicitných záznamov === | + | === 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: | ||
+ | <source lang="SQL"> | ||
+ | SELECT column_name(s) | ||
+ | FROM table_name | ||
+ | AS alias_name | ||
+ | </source> | ||
+ | |||
+ | Definovanie aliasu pre atribút tabuľky: | ||
+ | <source lang="SQL"> | ||
+ | SELECT column_name AS alias_name | ||
+ | FROM table_name | ||
+ | </source> | ||
+ | |||
+ | |||
+ | '''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"> | ||
+ | SELECT Name AS Mesto, CountryCode AS KodKrajiny | ||
+ | FROM `city` | ||
+ | WHERE CountryCode = 'SVK' | ||
+ | </source> | ||
+ | |||
+ | Výsledok: | ||
+ | {| class=datatable | ||
+ | |- | ||
+ | !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: | ||
+ | <source lang="sql"> | ||
+ | SELECT * FROM tabulka LIMIT X,Y | ||
+ | </source> | ||
+ | |||
+ | 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''. | ||
+ | <source lang="sql"> | ||
+ | SELECT * FROM city LIMIT 0, 10 | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 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> | ||
+ | |||
+ | ''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. | 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 104: | Riadok 193: | ||
SELECT DISTINCT CountryCode FROM city | SELECT DISTINCT CountryCode FROM city | ||
</source> | </source> | ||
+ | |||
Výsledok: | Výsledok: | ||
Riadok 132: | Riadok 222: | ||
|} | |} | ||
− | |||
− | 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. | + | '''Ú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: | Riešenie: | ||
Riadok 140: | 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 169: | 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 181: | Riadok 277: | ||
|- | |- | ||
! <nowiki>>=</nowiki> | ! <nowiki>>=</nowiki> | ||
− | | väčší rovný | + | | väčší alebo rovný |
|- | |- | ||
! <nowiki>></nowiki> | ! <nowiki>></nowiki> | ||
Riadok 187: | Riadok 283: | ||
|- | |- | ||
! <nowiki><=</nowiki> | ! <nowiki><=</nowiki> | ||
− | | menší rovný | + | | menší alebo rovný |
|- | |- | ||
! <nowiki><</nowiki> | ! <nowiki><</nowiki> | ||
Riadok 196: | Riadok 292: | ||
|- | |- | ||
! IS | ! IS | ||
− | | Test na logickú hodnotu true/false | + | | Test na logickú hodnotu true/false alebo na hodnotu NULL |
|- | |- | ||
! LIKE | ! LIKE | ||
Riadok 202: | Riadok 298: | ||
|- | |- | ||
! <nowiki>!=, <></nowiki> | ! <nowiki>!=, <></nowiki> | ||
− | | Operátor | + | | Operátor nerovnosti |
|- | |- | ||
! NOT LIKE | ! NOT LIKE | ||
Riadok 211: | 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 245: | Riadok 342: | ||
− | '''Úloha:''' Vyber všetky mestá, ktoré majú kód krajiny | + | '''Ú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 | + | SELECT * FROM city WHERE CountryCode LIKE "SVK" |
</source> | </source> | ||
Riadok 268: | Riadok 367: | ||
| 3209 || Bratislava || SVK || Bratislava || 432061 | | 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: | Riešenie: | ||
<source lang="sql"> | <source lang="sql"> | ||
− | SELECT * FROM city WHERE Population | + | SELECT * FROM city WHERE Population BETWEEN 1000000 AND 2000000 |
</source> | </source> | ||
+ | |||
Výsledok: | Výsledok: | ||
Riadok 305: | Riadok 406: | ||
− | + | ||
+ | '''Úloha:''' Vyber všetky mestá, ktorých názov začína na 'Bra' | ||
+ | |||
Riešenie: | Riešenie: | ||
Riadok 311: | Riadok 414: | ||
SELECT * FROM city WHERE Name LIKE 'Bra%' | SELECT * FROM city WHERE Name LIKE 'Bra%' | ||
</source> | </source> | ||
+ | |||
Výsledok: | Výsledok: | ||
Riadok 338: | Riadok 442: | ||
Poznámka: Znak % (percento) zastupuje ľubovoľný počet znakov. | 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: | Riešenie: | ||
Riadok 344: | 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 381: | 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: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 | + | '''Ú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 | + | SELECT * FROM city WHERE CountryCode LIKE "GBR" AND Population<100000 |
</source> | </source> | ||
Riadok 422: | Riadok 524: | ||
|} | |} | ||
− | + | ||
+ | '''Ú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 | + | SELECT * FROM city WHERE CountryCode LIKE "SVK" OR CountryCode LIKE "CZE" |
</source> | </source> | ||
Riadok 456: | 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 | + | SELECT * FROM city WHERE (CountryCode LIKE "SVK" OR CountryCode LIKE "CZE") AND population<100000 |
</source> | </source> | ||
Riadok 484: | 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. |
+ | |||
− | + | '''Ú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 | + | 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 522: | Riadok 630: | ||
Riešenie: | Riešenie: | ||
<source lang="sql"> | <source lang="sql"> | ||
− | SELECT * FROM city WHERE (CountryCode | + | SELECT * FROM city WHERE (CountryCode LIKE "SVK" OR CountryCode LIKE "CZE") AND population<100000 ORDER BY Name DESC |
− | </source> | + | </source> |
Výsledok: | Výsledok: | ||
Riadok 547: | Riadok 655: | ||
|} | |} | ||
− | < | + | === SELECT - výber z množiny hodnôt=== |
+ | Pomocou operátora IN môžeme vyberať z množiny hodnôt. Základná syntax je: | ||
+ | |||
+ | <source lang="sql"> | ||
+ | SELECT stlpce | ||
+ | FROM tabulka | ||
+ | WHERE atribut_n IN (value1,value2,...) | ||
+ | </source> | ||
+ | |||
+ | 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: | ||
+ | <source lang="sql"> | ||
+ | SELECT * FROM city | ||
+ | WHERE population >350000 | ||
+ | AND CountryCode | ||
+ | IN ( 'SVK', 'CZE', 'POL') | ||
+ | ORDER BY `city`.`Population` ASC | ||
+ | </source> | ||
+ | |||
+ | Výsledok: | ||
+ | {| class=datatable | ||
+ | |- | ||
+ | !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 === | === SELECT - zoskupovanie === | ||
− | Výsledok SQL dotazu môžeme zoskupiť do skupín podľa ich hodnôt. Pre zoskupenie | + | 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 | + | 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 572: | 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 597: | Riadok 754: | ||
|} | |} | ||
− | + | ||
+ | '''Ú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, | + | SELECT Continent, COUNT(name) FROM country WHERE population>5000000 GROUP BY Continent |
</source> | </source> | ||
Riadok 628: | Riadok 786: | ||
SELECT zoznam_stĺpcov | SELECT zoznam_stĺpcov | ||
FROM zoznam_tabuliek | FROM zoznam_tabuliek | ||
− | + | [ 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 | + | '''Ú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, | + | SELECT Continent, COUNT(name) FROM country WHERE population>5000000 GROUP BY Continent HAVING COUNT(name)>=10 |
</source> | </source> | ||
Riadok 656: | 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, | + | SELECT District, AVG(population) FROM city GROUP BY District HAVING AVG(population) < 100000 |
</source> | </source> | ||
Riadok 687: | 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, | + | SELECT CountryCode, COUNT(district) FROM city GROUP BY CountryCode HAVING COUNT(district)>3 |
</source> | </source> | ||
Riadok 717: | 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 | + | '''Ú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, | + | SELECT CountryCode, SUM(Population) FROM city WHERE CountryCode LIKE "%A" GROUP BY CountryCode HAVING AVG(Population)>300000 |
</source> | </source> | ||
Riadok 729: | Riadok 890: | ||
|- | |- | ||
! CountryCode | ! CountryCode | ||
− | ! | + | ! SUM(Population) |
|- | |- | ||
− | | | + | |BFA ||1229000 |
|- | |- | ||
− | | | + | |BRA ||85876862 |
|- | |- | ||
− | | | + | |GHA ||1819889 |
|- | |- | ||
− | | | + | |LVA ||968596 |
|- | |- | ||
− | | | + | |THA ||7953161 |
|- | |- | ||
− | | | + | |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. | + | 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 840: | Riadok 996: | ||
− | '''Úloha:''' Akými jazykmi sa hovorí v hlavných mestách | + | '''Ú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 | + | 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 886: | Riadok 1 042: | ||
− | '''Úloha:''' Koľkými oficiálnymi jazykmi sa hovorí v hlavných mestách krajín | + | '''Ú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, | + | SELECT city.name, COUNT(language) |
FROM countrylanguage, city, country | FROM countrylanguage, city, country | ||
WHERE Continent = 'Europe' | WHERE Continent = 'Europe' | ||
Riadok 930: | 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, | + | SELECT city.name, COUNT(language) |
FROM countrylanguage, city, country | FROM countrylanguage, city, country | ||
WHERE Continent = 'Europe' | WHERE Continent = 'Europe' | ||
Riadok 938: | Riadok 1 098: | ||
AND isOfficial = true | AND isOfficial = true | ||
GROUP BY city.name | GROUP BY city.name | ||
− | HAVING | + | 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 | + | Syntax pri použití spojenie JOIN: |
− | ; | + | |
− | ; | + | <source lang="SQL"> |
− | ; | + | SELECT select_expr |
− | ; | + | 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 | + | 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 964: | 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 987: | Riadok 1 165: | ||
| 29 || čau || 29 || 4 || 2 | | 29 || čau || 29 || 4 || 2 | ||
|- | |- | ||
− | | 14 || | + | | 14 || červená || 14 || 34 || 2 |
|- | |- | ||
| 12 || ísť || 12 || 25 || 2 | | 12 || ísť || 12 || 25 || 2 | ||
Riadok 1 002: | 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 | + | where id_sk IS NULL |
</source> | </source> | ||
Riadok 1 018: | Riadok 1 196: | ||
| 4 || vlastnosť | | 4 || vlastnosť | ||
|} | |} | ||
− | == | + | == Zdroje a odkazy == |
− | |||
<references /> | <references /> |
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.
Obsah
- 1 Syntax príkazu SELECT
- 2 SELECT - výber z viacerých tabuliek
- 3 SELECT - spájanie tabuliek pomocou JOIN
- 4 Zdroje a odkazy
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:
= | 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
- ↑ SQL syntax - http://dev.mysql.com/doc/refman/5.5/en/select.html