Úvod do jazyka SQL Hodina č. 6 http://munidb.jdem.cz/ dvojitý GROUP BY GROUP BY color dvojitý GROUP BY GROUP BY length 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) Viz https://www.sqlite.org/lang_aggfunc.html#count The count(X) function returns a count of the number of times that X is not NULL in a group. The count(*) function (with no arguments) returns the total number of rows in the group. 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 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? 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á PříspěvkyDonoři Řešení? Dvě 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 SELECT * FROM prispevky JOIN donori ON donori.ID = prispevky.donor WHERE ... GROUP BY ... LIMIT ... JOIN vs. LEFT JOIN Donoři Příspěvky JOIN vs. LEFT JOIN Donoři Příspěvky NIC (INNER) JOIN Donoři Příspěvky Neví nic o sémantice vašich dat SELECT * FROM donori JOIN prispevky ON donori.rocnik = prispevky.castka POZOR: Databáze je "hloupá"! Spojí řádky na základě zcela nesouvisejícího sloupce JOIN vs. LEFT JOIN Donoři Příspěvky NIC LEFT Donoři Příspěvky NULL Vypište lidi, kteří zatím nikdy nedarovali SELECT donori.* FROM donori LEFT JOIN prispevky ON donori.ID = prispevky.donor WHERE castka IS NULL Otázka Kolik kdo z dárců v průběhu roku přispěl? SELECT donori.jmeno, SUM(castka) FROM donori INNER JOIN prispevky ON donori.ID = prispevky.donor GROUP BY donori.ID