VIKMB55 SQL pro pokročilé a datové modelování Hodina č. 6 Jak uděláme SQL test? Feedback na DÚ SELECT 10 > 111 Pravda? 1) Ne, viz další slajd 2) SELECT “C” > “B” Pravda? Ano, viz další slajd 3) …WHERE datum < “2015-07-01” Budou obsaženy řádky z 1. 7.? Ne, viz další slajd 4) …WHERE datum > “2015-07-01” Budou obsaženy řádky z 1. 7.? Ano, viz další slajd 5) …WHERE datum <= “2015-07-01” Budou obsaženy řádky z 1. 7.? POZOR: Ne, viz další slajd 6) …WHERE datum < “2015-07” Budou obsaženy řádky z července? Ne, viz další slajd 7) …WHERE datum > “2015-07” Budou obsaženy řádky z července? Ano, viz další slajd 8) …WHERE datum BETWEEN "2015-01-02" AND "2015-06-30" Budou obsaženy řádky z 30. 6.? POZOR: Ne, viz další slajd 9) …WHERE datum > “2015-07-00” Budou obsaženy všechny řádky ze července ? Ano, viz další slajd 10) …WHERE datum >= "2015-07-01%" Budou obsaženy všechny řádky z 1. 7 ? POZOR: Ne, viz další slajd 11) SELECT "$%@" > "$%&" Pravda? Ano, viz další slajd… …ale je to jedno OMG WTF aneb jak to teda funguje? ASCII TABULKA % < * “+” “1” “a”“=“ “+” < 1 < “=“ < “a” “aab” “aac”> “aab” “aac”> “aab” “aac”> FALSE “a” “az”> “a” “az”> “a ” “az”> FALSE …WHERE datum > “2015-07” “2015-07-03” “2015-07”> “2015-07-03” “2015-07”> “2015-07-03” “2015-07 ”> TRUE …WHERE datum > “2015-07%” “2015-07-03” “2015-07%”> “2015-07-03” “2015-07%”> “2015-07-03” “2015-07%”> 45 > 37 ASCII code “2015-07-03” “2015-07%”> 45 > 37 TRUE “%” nahrazuje “cokoliv” POUZE za použití LIKE …WHERE datum BETWEEN "2015-01-02" AND "2015-06-30" …WHERE … datum <= "2015-06-30" “2015-06-30 18:00:00” “2015-06-30” <= “2015-06-30 18:00:00” “2015-06-30” <= “2015-06-30 18:00:00” “2015-06-30 ” <= “2015-06-30 18:00:00” “2015-06-30 ” <= FALSE Jsou-li dva řetězce různě dlouhé a kratší z nich se plně shoduje s první částí delšího, je ten delší vždy “větší” “AAA AAAAD” “AAA”> Řešení? …WHERE DATE(datum) BETWEEN "2015-01-02" AND "2015-06-30" Řešení? …WHERE DATE(datum) > “2015-07-01” …WHERE DATE(datum) >= “2015-07-01” Vypište všechny zákazníky, kteří si někdy objednali Knihu 1 nebo Knihu 2 SELECT DISTINCT(z.jmeno) FROM zakaznici z LEFT JOIN objednavky o ON(z.id_zakaznik = o.id_zakaznik) LEFT JOIN polozky_objednavky p ON (o.id_objednavka = p.id_objednavka) WHERE p.id_kniha = "1" OR p.id_kniha = "2" Vypište všechny zákazníky, kteří si Knihu 1 a Knihu 2 objednali v rámci jedné objednávky SELECT id_zakaznik FROM objednavky o INNER JOIN polozky_objednavky po ON po.id_objednavka = o.id_objednavka AND id_kniha IN (1,2) GROUP BY o.id_objednavka HAVING COUNT(*) > 1 Vypište všechny zákazníky, kteří si někdy objednali Knihu 1 a Knihu 2 (tj. nemuselo se tak stát v rámci jedné objednávky) SELECT id_zakaznik, ob.id_objednavka FROM polozky_objednavky po INNER JOIN objednavky ob ON po.id_objednavka = ob.id_objednavka WHERE id_kniha = 1 1 2 5 SELECT id_zakaznik, ob.id_objednavka FROM polozky_objednavky po INNER JOIN objednavky ob ON po.id_objednavka = ob.id_objednavka WHERE id_kniha = 2 1 2 5 1 2 5 3 1 2 5 3 1 2 5 1 2 5 3 SELECT * FROM (SELECT id_zakaznik, ob.id_objednavka FROM polozky_objednavky po INNER JOIN objednavky ob ON po.id_objednavka = ob.id_objednavka WHERE id_kniha = 2) as k1 INNER JOIN (SELECT id_zakaznik, ob.id_objednavka FROM polozky_objednavky po2 INNER JOIN objednavky ob ON po2.id_objednavka = ob.id_objednavka WHERE id_kniha = 1) as k2 ON k1.id_zakaznik = k2.id_zakaznik Vypiště všechny zákazniky, kteří udělali objednávku, kde byla Kniha 1, Kniha 2 a nic dalšího SELECT po.id_objednavka, COUNT(DISTINCT id_kniha) as pocet_vse_knih, data.pocet as pocet_knih_vybranych FROM polozky_objednavky po INNER JOIN (SELECT id_zakaznik, ob.id_objednavka, COUNT(po.id_kniha) as pocet FROM polozky_objednavky po INNER JOIN objednavky ob ON po.id_objednavka = ob.id_objednavka WHERE id_kniha IN (1,2) GROUP BY ob.id_objednavka) data ON data.id_objednavka = po.id_objednavka GROUP BY po.id_objednavka HAVING pocet_vse_knih = pocet_knih_vybranych AND pocet_vse_knih = 2 Login: VIKMB55 Heslo: VIKMB5511 http://korel.savana-hosting.cz/adm http://korel.savana-hosting.cz/phpmyadmin