Difference between revisions of "Dotazy nad více tabulkami"

From Wikivyuka
Jump to: navigation, search
m
m
 
Line 4: Line 4:
  
 
  SELECT [DISTINCT] * | nazev_sloupce [alias], ...  
 
  SELECT [DISTINCT] * | nazev_sloupce [alias], ...  
  FROM nazev_tabulky1 JOIN nazev_tabulky2 ON (nazev_sloupce1 = nazev_sloupce2);
+
  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.
 
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.
  
''Přirozené'' spojení má v Oracle syntaxi:  
+
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], ...  
 
  SELECT [DISTINCT] * |  nazev_sloupce [alias], ...  
 
  FROM nazev_tabulky1 NATURAL JOIN nazev_tabulky2;
 
  FROM nazev_tabulky1 NATURAL JOIN nazev_tabulky2;
  
Pro případ spojení přes více sloupců: SELECT [DISTINCT] * | column [alias], ... FROM table1 JOIN table2 USING common_col_name;  
+
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.

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.

  1. Vypište strukturu tabulek Employees a Departments.
  2. 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?)
  3. 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?)
  4. 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?)
  5. Zobrazte seznam oddělení (id, název) a název města, ve kterém sídlí.
  6. 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.
  7. 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í

Hlavní stránka předmětu