Difference between revisions of "Dotazy nad více tabulkami"
m |
m |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | Při dotazování, kdy používáme propojení více tabulek, je nutno určit, jak bude propojení realizováno. | |
− | + | Spojení více tabulek podle normy SQL1999 má syntaxi: | |
− | Pro případ spojení přes více sloupců: SELECT [DISTINCT] * | | + | SELECT [DISTINCT] * | nazev_sloupce [alias], ... |
+ | FROM nazev_tabulky1 t1 JOIN nazev_tabulky2 t2 ON (t1.nazev_sloupce = t2.nazev_sloupce); | ||
+ | |||
+ | kde ''nazev_sloupce1 = nazev_sloupce2'' většinou předpokládá referenční integritu, která je často již definována formou cizího klíče. Obecně je ovšem možné toto spojení na základě rovnosti hodnot dat v uvedených sloupcích použít kdykoli, omezí se tím kartézský součin, vznikající při propojování tabulek na takovou podmnožinu, která odpovídá uvedené podmínce. | ||
+ | |||
+ | Starší syntaxe SQL používala vymezující podmínku v klauzuli WHERE. princip implementace dotazu je obdobný: | ||
+ | SELECT [DISTINCT] * | nazev_sloupce [alias], ... | ||
+ | FROM nazev_tabulky1 t1, nazev_tabulky2 t2 | ||
+ | WHERE t1.nazev_sloupce = t2.nazev_sloupce; | ||
+ | |||
+ | Oracle nabízí implementaci i spojení INNER, OUTER, NATURAL, pro naše použití ve většině případů vystačíme se základními typy. Podrobnosti lze najít v dokumentaci Oracle. ''Přirozené'' spojení má v Oracle syntaxi: | ||
+ | SELECT [DISTINCT] * | nazev_sloupce [alias], ... | ||
+ | FROM nazev_tabulky1 NATURAL JOIN nazev_tabulky2; | ||
+ | |||
+ | Pro případ spojení přes více sloupců pak bude mít SELECT syntaxi: | ||
+ | SELECT [DISTINCT] * | nazev_sloupce [alias], ... | ||
+ | FROM nazev_tabulky1 t1 JOIN nazev_tabulky2 t2 USING nazvy_sloupcu; | ||
+ | |||
+ | Vyzkoušejte si propojování tabulek v následujících příkladech. Výsledky si zkontrolujte na stránce s řešením. | ||
#Vypište strukturu tabulek Employees a Departments. | #Vypište strukturu tabulek Employees a Departments. | ||
Line 14: | Line 32: | ||
Možnost kontroly Vašich dotazů: [[Dotazy nad více tabulkami - možné řešení]] | Možnost kontroly Vašich dotazů: [[Dotazy nad více tabulkami - možné řešení]] | ||
+ | |||
+ | [http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD Hlavní stránka předmětu] |
Latest revision as of 07:02, 4 September 2014
Při dotazování, kdy používáme propojení více tabulek, je nutno určit, jak bude propojení realizováno.
Spojení více tabulek podle normy SQL1999 má syntaxi:
SELECT [DISTINCT] * | nazev_sloupce [alias], ... FROM nazev_tabulky1 t1 JOIN nazev_tabulky2 t2 ON (t1.nazev_sloupce = t2.nazev_sloupce);
kde nazev_sloupce1 = nazev_sloupce2 většinou předpokládá referenční integritu, která je často již definována formou cizího klíče. Obecně je ovšem možné toto spojení na základě rovnosti hodnot dat v uvedených sloupcích použít kdykoli, omezí se tím kartézský součin, vznikající při propojování tabulek na takovou podmnožinu, která odpovídá uvedené podmínce.
Starší syntaxe SQL používala vymezující podmínku v klauzuli WHERE. princip implementace dotazu je obdobný:
SELECT [DISTINCT] * | nazev_sloupce [alias], ... FROM nazev_tabulky1 t1, nazev_tabulky2 t2 WHERE t1.nazev_sloupce = t2.nazev_sloupce;
Oracle nabízí implementaci i spojení INNER, OUTER, NATURAL, pro naše použití ve většině případů vystačíme se základními typy. Podrobnosti lze najít v dokumentaci Oracle. Přirozené spojení má v Oracle syntaxi:
SELECT [DISTINCT] * | nazev_sloupce [alias], ... FROM nazev_tabulky1 NATURAL JOIN nazev_tabulky2;
Pro případ spojení přes více sloupců pak bude mít SELECT syntaxi:
SELECT [DISTINCT] * | nazev_sloupce [alias], ... FROM nazev_tabulky1 t1 JOIN nazev_tabulky2 t2 USING nazvy_sloupcu;
Vyzkoušejte si propojování tabulek v následujících příkladech. Výsledky si zkontrolujte na stránce s řešením.
- Vypište strukturu tabulek Employees a Departments.
- Vytvořte seznam všech atributů při spojení těchto tabulek. (Odpovídají si hodnoty ze sloupců Department_ID z obou původních tabulek?)
- Seznam "ořežte" na tyto atributy: employee_id, department_id, department_name, kde department_id je požadováno jak z tabulky employees, tak i department. (Jaký je výsledek? Kolik záznamů obsahuje?)
- Seznam vytvořte tak, aby obsahoval "správné" spojení - tj. přes rovnost hodnot department_id v obou tabulkách. (Jaký je výsledek? Kolik záznamů obsahuje?)
- Zobrazte seznam oddělení (id, název) a název města, ve kterém sídlí.
- Vypište seznam všech zaměstanců z oddělení prodeje (název oddělení 'Sales') s jejich Id, jménem, příjmením a velikostí jejich provize.
- Kdo komu dělá šéfa? Zkuste setřídit dle jména manažera.
Možnost kontroly Vašich dotazů: Dotazy nad více tabulkami - možné řešení