Difference between revisions of "Opakování SQL"

From Wikivyuka
Jump to: navigation, search
m
m
 
(18 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Tutoriály SQL]]
+
====Samostatná práce====
  
Pro orientaci v datové struktuře se podívejte na model dat pres Data Modeler. Spustíte Tools/Data Modeler. Pro zobrazení stačí natáhnout tabulky formou Drag nad Drop do okna módu, kde se zobrazí struktura dat i s vazbami.
+
Pro orientaci v datové struktuře databáze HR máte k dispozici E-R schema na stránce [[Schema HR]].
 +
<!--Spustíte Tools/Data Modeler. Pro zobrazení stačí natáhnout tabulky formou Drag nad Drop do okna módu, kde se zobrazí struktura dat i s vazbami.-->
  
V případě, že nemáte k dispozici grafické zobrazení, je vhodné použít příkaz DESCRIBE table; Ten vypíše strukturu tabulky, což umožní zadávat příkazy SQL postavené na znalosti datové struktury.
+
V případě, že byste neměli k dispozici grafické zobrazení schematu, ani grafického klenta, použijte příkaz  
 +
DESCRIBE table;  
 +
Výpis struktury tabulky umožní zadávat příkazy SQL postavené na znalosti datové struktury i z řádkového režimu.
  
'''Dotazy nad jednou tabulkou'''
+
=====Dotazy nad jednou tabulkou=====
  
 
#Vypište seznam všech zaměstanců s jejich Id, jménem, příjmením a výší platu.
 
#Vypište seznam všech zaměstanců s jejich Id, jménem, příjmením a výší platu.
Line 16: Line 19:
 
#Kde a v jaké pozici pracuje pan Atkinson?  
 
#Kde a v jaké pozici pracuje pan Atkinson?  
 
#Kteří zaměstanci mají jméno začínající na G?
 
#Kteří zaměstanci mají jméno začínající na G?
 +
#Kteří zaměstnanci mají jméno končící na "s"?
 
#Kteří zaměstanci mají plat nižší než $5000? Zkuste setřídit dle výšky platu.
 
#Kteří zaměstanci mají plat nižší než $5000? Zkuste setřídit dle výšky platu.
 
#Kteří zaměstanci byli zaměstnáni po 1. lednu 1999?
 
#Kteří zaměstanci byli zaměstnáni po 1. lednu 1999?
Line 22: Line 26:
 
#Zobrazte všechny zaměstnance, kteří pracují v oddělení 80.
 
#Zobrazte všechny zaměstnance, kteří pracují v oddělení 80.
 
#Zobrazte všechny zaměstnance, kteří mají manažera s ID 146. (Zkusit formu parametrického dotazu MANAGER_ID=:mannum)
 
#Zobrazte všechny zaměstnance, kteří mají manažera s ID 146. (Zkusit formu parametrického dotazu MANAGER_ID=:mannum)
#Kteří zaměstanci z oddělení 80 pracující pod manažerem 146 mají plat větší než 7000?  
+
#Kteří zaměstanci z oddělení 80 pracující pod manažerem 146 mají plat větší než 7000?
  
 
Možnost kontroly Vašich dotazů: [[Dotazy nad jednou tabulkou - možné řešení]]
 
Možnost kontroly Vašich dotazů: [[Dotazy nad jednou tabulkou - možné řešení]]
  
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze Hlavní stránka předmětu]
+
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD Hlavní stránka předmětu]
  
'''Dotazy nad více tabulkami'''
+
=====Agregační funkce=====
 +
 
 +
#Kolik zaměstnanců je celkem zaregistrováno?
 +
#Kolik zaměstnanců má oddělení 80?
 +
#Kolik různých oddělení je celkem?
 +
#Zjistěte, na kolik různých oddělení jsou zaměstnanci rozděleni?
 +
#Zjistěte, jaký je minimální, maximální a průměrný plat zaměstnanců z oddělení IT.
 +
#Jaký je průměrný plat na jednotlivých odděleních?
 +
#Která oddělení mají průměrný plat vyšší než 7000?
 +
#Kdo vydělává nejvíc? Kolik to činí?
 +
 
 +
Možnost kontroly Vašich dotazů: [[Dotazy - agregované funkce - 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]
 +
 
 +
=====Dotazy nad více tabulkami=====
  
 
Spojení více tabulek dle normy SQL1999: SELECT [DISTINCT] * | column [alias], ... FROM table1 JOIN table2 ON (col_name_1 = col_name_2);
 
Spojení více tabulek dle normy SQL1999: SELECT [DISTINCT] * | column [alias], ... FROM table1 JOIN table2 ON (col_name_1 = col_name_2);
Line 38: Line 57:
 
#Vypište strukturu tabulek Employees a Departments.
 
#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?)
 
#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?
+
#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.
+
#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í.
 
#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.
 
#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.
Line 46: Line 65:
 
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í]]
  
'''Agregační funkce'''
+
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze_-_cvi%C4%8Den%C3%AD Hlavní stránka předmětu]
 
 
Seznam a význam agregačních funkcí:
 
 
 
COUNT(*) navrátí počet počet řádků, které má odpověď
 
COUNT()          počet platných hodnot
 
SUM()            součet numerických hodnot ze zadaného sloupce
 
AVG()            průměrnou hodnotu z numerických platných hodnot
 
MIN()            minimální hodnotu z numerických platných hodnot
 
MAX()            maximální hodnota z numerických platných hodnot
 
 
 
#Kolik zaměstnanců je celkem zaregistrováno?
 
#Kolik zaměstnanců má oddělení 80?
 
#Kolik různých oddělení je celkem?
 
#Zjistěte, na kolik různých odděleních jsou zaměstnanci rozděleni?
 
#Zjistěte, jaký je minimální, maximální a průměrný plat zaměstnanců z oddělení IT.
 
#Jaký je průměrný plat na jednotlivých odděleních?
 
#Která oddělení mají průměrný plat vyšší než 7000?
 
#Kdo vydělává nejvíc? Kolik to činí?
 
#Jak se jmenují zaměstnanci, kteří vydělávají víc než Gates?
 
 
 
Možnost kontroly Vašich dotazů: [[Dotazy - agregované funkce - možné řešení]]
 
  
'''Vnořené dotazy'''
+
=====Vnořené dotazy=====
  
 
#Jak se jmenují zaměstnanci, kteří vydělávají víc než Gates?
 
#Jak se jmenují zaměstnanci, kteří vydělávají víc než Gates?
#Jaký průměrný plat je největší v rámci různého pracovního zařazení (čili seskupení dle job_id)?  
+
#Na kterém oddělení je největší průměrný plat?  
 
#Který typ práce je takto ohodnocen?
 
#Který typ práce je takto ohodnocen?
 
#Je možné dotaz formulovat stejně i pro nejnižší průměrný plat?
 
#Je možné dotaz formulovat stejně i pro nejnižší průměrný plat?
Line 79: Line 77:
 
Možnost kontroly Vašich dotazů: [[Vnořené dotazy - možné řešení]]
 
Možnost kontroly Vašich dotazů: [[Vnořené dotazy - možné řešení]]
  
[http://gis.vsb.cz/wikivyuka/index.php/Prostorov%C3%A9_datab%C3%A1ze Hlavní stránka předmětu]
+
[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 09:23, 10 April 2015

Samostatná práce

Pro orientaci v datové struktuře databáze HR máte k dispozici E-R schema na stránce Schema HR.

V případě, že byste neměli k dispozici grafické zobrazení schematu, ani grafického klenta, použijte příkaz

DESCRIBE table; 

Výpis struktury tabulky umožní zadávat příkazy SQL postavené na znalosti datové struktury i z řádkového režimu.

Dotazy nad jednou tabulkou
  1. Vypište seznam všech zaměstanců s jejich Id, jménem, příjmením a výší platu.
  2. Jak budou vypadat platy zaměstanců, pokud je zvýšíme o 500 (asi $ :-))?
  3. Kolik vydělávají zaměstanci ročně? Kolik to bude dělat v případě, že k ročnímu platu dostanou odměnu $500?
  4. Kolik by vydělávali ročně, pokud bychom jim zvedli plat o $500 měsíčně? Vypište včetně porovnání se stávajícím platem.
  5. Kteří zaměstanci mají provizi? (Nejprve si to vypište jako celek a pak použijte klauzuli WHERE.)
  6. Kolik tedy doopravdy vydělávají ti, kteří mají procenta z provize?
  7. Vypište seznam zaměstnanců a jejich měsíčních platů v jednom sloupci.
  8. Kde a v jaké pozici pracuje pan Atkinson?
  9. Kteří zaměstanci mají jméno začínající na G?
  10. Kteří zaměstnanci mají jméno končící na "s"?
  11. Kteří zaměstanci mají plat nižší než $5000? Zkuste setřídit dle výšky platu.
  12. Kteří zaměstanci byli zaměstnáni po 1. lednu 1999?
  13. Kdo všechno nastoupil v roce 1999?
  14. Kdo šéfuje (Id) jednotlivým oddělením?
  15. Zobrazte všechny zaměstnance, kteří pracují v oddělení 80.
  16. Zobrazte všechny zaměstnance, kteří mají manažera s ID 146. (Zkusit formu parametrického dotazu MANAGER_ID=:mannum)
  17. Kteří zaměstanci z oddělení 80 pracující pod manažerem 146 mají plat větší než 7000?

Možnost kontroly Vašich dotazů: Dotazy nad jednou tabulkou - možné řešení

Hlavní stránka předmětu

Agregační funkce
  1. Kolik zaměstnanců je celkem zaregistrováno?
  2. Kolik zaměstnanců má oddělení 80?
  3. Kolik různých oddělení je celkem?
  4. Zjistěte, na kolik různých oddělení jsou zaměstnanci rozděleni?
  5. Zjistěte, jaký je minimální, maximální a průměrný plat zaměstnanců z oddělení IT.
  6. Jaký je průměrný plat na jednotlivých odděleních?
  7. Která oddělení mají průměrný plat vyšší než 7000?
  8. Kdo vydělává nejvíc? Kolik to činí?

Možnost kontroly Vašich dotazů: Dotazy - agregované funkce - možné řešení

Hlavní stránka předmětu

Dotazy nad více tabulkami

Spojení více tabulek dle normy SQL1999: SELECT [DISTINCT] * | column [alias], ... FROM table1 JOIN table2 ON (col_name_1 = col_name_2);

"Přirozené" spojení má v Oracle syntaxi: SELECT [DISTINCT] * | column [alias], ... FROM table1 NATURAL JOIN table2;

Pro případ spojení přes více sloupců: SELECT [DISTINCT] * | column [alias], ... FROM table1 JOIN table2 USING common_col_name;

  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

Vnořené dotazy
  1. Jak se jmenují zaměstnanci, kteří vydělávají víc než Gates?
  2. Na kterém oddělení je největší průměrný plat?
  3. Který typ práce je takto ohodnocen?
  4. Je možné dotaz formulovat stejně i pro nejnižší průměrný plat?
  5. Vypište id, prijmeni, funkcni zařazení zaměstnanců, kteří mají vyšší plat než je průměr ve firmě. Také uveďte o kolik to je.

Možnost kontroly Vašich dotazů: Vnořené dotazy - možné řešení

Hlavní stránka předmětu