Úvod do jazyka SQL Hodina č. 6 dvojitý GROUP BY GROUP BY length http://munidb.jdem.cz/ Počet lidí, které mají jednotlivé fakulty v jednotlivých budovách SELECT fakulta, budova, SUM(pocet_lidi) FROM fakulty GROUP BY fakulta, budova COUNT(*) vs COUNT(sloupec) Databáze “minidb” Vypište počet výtisků jednotlivých knih spolu s počtem těch, které jsou zrovna vypůjčené SELECT kniha, COUNT(*) as vytisku FROM minidb GROUP BY kniha
 
 vs.
 
 SELECT kniha, COUNT(Pujceno) as vypujceno FROM minidb GROUP BY kniha Databáze “minidb” Vypište počet výtisků jednotlivých knih spolu s počtem těch, které jsou zrovna vypůjčené SELECT kniha, COUNT(*) AS vytisku, 
 COUNT(Pujceno) AS vypujceno, COUNT(*) - COUNT(Pujceno) AS volnych 
 FROM minidb GROUP BY kniha DISTINCT Databáze “fakulty” Vypište jednotlivé fakulty. SELECT fakulta FROM fakulty GROUP BY fakulta 
 
 nebo
 
 SELECT DISTINCT fakulta FROM fakulty Databáze “fakulty” Vypište počet budov jednotlivých fakult Databáze “fakulty” Vypište počet budov jednotlivých fakult SELECT fakulta, COUNT(budova), COUNT(katedra) FROM fakulty GROUP BY fakulta; ^ TOHLE NEFUNGUJE!
 oba COUNTy prostě spočítají “počet řádků” Budov je však méně, jen se opakují Databáze “fakulty” Vypište počet budov jednotlivých fakult SELECT fakulta, COUNT(DISTINCT budova), COUNT(katedra) FROM fakulty GROUP BY fakulta; ^ TOHLE FUNGUJE!
 DISTINCT způsobí, že každá z budov je započítána jen jednou GROUP_CONCAT The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. A comma (",") is used as the separator if Y is omitted. The order of the concatenated elements is arbitrary. Databáze “fakulty” Vypište seznam budov pro jednotlivé fakulty SELECT fakulta, GROUP_CONCAT(DISTINCT budova) FROM fakulty GROUP BY fakulta Slovesa SQL • SELECT … • INSERT • UPDATE • DELETE INSERT INSERT INTO table (column1, column2,…) VALUES (value1, value2,…); UPDATE UPDATE table SET column1 = value1, column2 = value2 WHERE … AND … Doporučení: Při UPDATE si vždy prvně pomocí SELECT vyzkoušejte, jestli WHERE podmínka vrací opravdu to co chcete. DELETE DELETE FROM table WHERE … AND … Doporučení: Při DELETE si vždy prvně pomocí SELECT vyzkoušejte, jestli WHERE podmínka vrací opravdu to co chcete. DELETE DELETE FROM table WHERE … AND … JOIN Příspěvky Jméno E-mail Příspěvek Kampaň Honza jsem@posp.cz 300 hithit Honza jsem@posp.cz 1000 kontaktní Tomáš fil.hrabal@gmail. com 500 hithit Eliška eliska@eps.cz 300 kontaktní Problémy? • Změna kontaktů u dárce - musíte změnit všude • Pokud byste chtěli více kontaktů (telefon, adresa, ...), tak se tabulka nafukuje, ač vám původně šlo jen o evidenci příspěvků • Problematické evidování poznámek (např. “nevolat”) • Evidence potenciálních dárců je problematická • Konktakty nemůžete snadno využít v jiné interní agendě (například) PříspěvkyDonoři Řešení?
 Oddělené tabulky ID Jméno Kontakt Telefon Poznámka 1 Honza jsem@posp.cz 111 Nevolat před 10 dopo 2 Tomáš fil.hrabal@gmail.com 222 3 Eliška eliska@frankbold.org 333 Pracuje ve FrankBold Donor Příspěvek Kdy Kampaň 1 300 30. 10. 2014 hithit 1 1000 1. 11. 2014 konktatní 2 500 1. 11. 2014 hithit 3 300 30. 10. 2014 kontaktní http://fund3.jdem.cz/ PříspěvkyDonoři Řešení? PříspěvkyDonoři ID Jméno Kontakt Poznámka 1 Honza jsem@posp.cz Nevolat před 10 dopo 2 Tomáš fil.hrabal@gmai l.com 3 Eliška eliska@eps.cz Pracuje v EPS Donor Příspěvek Kdy Kampaň 1 300 30. 10. 2014 hithit 1 1000 1. 11. 2014 konktatní 2 500 1. 11. 2014 hithit 3 300 30. 10. 2014 kontaktní JOIN ID Jméno Kontakt Poznám ka 1 Honza jsem@pos p.cz Nevolat před 10 dopo 2 Tomáš fil.hrabal@ gmail.com 3 Eliška eliska@eps .cz Pracuje v EPS Donor Příspěvek Kdy Kampaň 1 300 30. 10. 2014 hithit 1 1000 1. 11. 2014 konktatní 2 500 1. 11. 2014 hithit 3 300 30. 10. 2014 kontaktní JOIN ID Jméno Kontakt Poznám ka 1 Honza jsem@pos p.cz Nevolat před 10 dopo 2 Tomáš fil.hrabal@ gmail.com 3 Eliška eliska@eps .cz Pracuje v EPS SELECT * FROM prispevky JOIN donori ON donori.ID = prispevky.donor Donor Příspěvek Kdy Kampaň 1 300 30. 10. 2014 hithit 1 1000 1. 11. 2014 konktatní 2 500 1. 11. 2014 hithit 3 300 30. 10. 2014 kontaktní Výsledek Jméno Kontakt Poznámka Příspěvek Kampaň Honza jsem@posp.cz Nevolat před 10 dopo 300 hithit Honza jsem@posp.cz Nevolat před 10 dopo 1000 kontaktní Tomáš fil.hrabal@gma il.com 500 hithit Eliška eliska@eps.cz Pracuje v EPS 300 kontaktní Se "spojenou" tabulkou se dá pracovat úplně stejně jako s "klasickou" tabulkou Neví nic o sémantice vašich dat SELECT * FROM donori JOIN prispevky ON donori.rocnik = prispevky.castka POZOR: Databáze je hloupá!