SQLtutor - chyby ZS 2007

Z GeoWikiCZ

Eliška Svobodová

101

procházím si testy na Vašem SQL tutorovi. Moc se mi líbí tento způsob učení jazyka SQL přímo na příkladech s možností zobrazení správného řešení.

Dnes na cvičení jste říkal, že pokud najdeme chybu, tak se máme ozvat. Nevím, jestli se moje poznámka dá charakterizovat jako upozornění na chybu. Spíše chci poukázat na nejasné položení otázky č. 101. Vypište seznam všech zaměstnanců. Mám k dispozici tato data.

Tabulka Sloupce

 pracoviste   	  kod, popis  
 zamestnanci   	  id, jmeno, prijmeni, pracoviste_kod, vek  
 mzdy   	  id, vlozeno, zamestnanec_id, castka  

Za seznam zaměstnanců bych spíše než výpis celé tabulky "zamestnanci" (id, jmeno, prijimeni, pracoviste_kod, vek) považovala seznam jmen a přijímení zaměstnanců (pouze sloupce jmeno a prijimeni). Proto jsem dotaz napsala takto: SELECT jmeno, prijmeni FROM zamestnanci;

Při vyhodnocení SQL mi tutor ohlásil chybnou odpověď. Myslím ale, že ze zadání není zcela jasné, zda má být výsledkem jmenný seznam nebo jmenný seznam doplněný o id, kód pracoviště a věk.

Nerada bych, aby mne taková nejasnost potkala při testování v závěru semestru :-)

Děkuji a ještě jednou chválím možnost procvičování dotazů v SQL tutorovi.

ano : 1

206

našla jsem ještě další nesrovnalost u otázky č. 206. Zde je jasně daná otázka: Jaké je id filmu 'Dům u jezera'? K dispozici jsou data:

Tabulka Sloupce

 filmy   	  id, rok, titul  
 umelci   	  id, jmeno  
 obsazeni   	  film_id, umelec_id, poradi  
 rezie   	  film_id, umelec_id  

Odpověď na tuto otázku by měl být pouze jeden sloupec obsahující id. Napsala jsem proto příkaz:

SELECT id FROM filmy WHERE titul='Dům u jezera'

Dle Vašeho správného řešení však má odpověď obsahovat dva sloupce: id a název filmu. A to je podle mě chyba, neboť dotaz zní jasně a týká se pouze id.

Nejsem žádný expert, proto se nezlobte, že opět píši. Jen mě baví procházet si úlohy v SQL tutorovi a zkoušet je řešit.

ano : 1

Pavel Seeman

Zkoušel jsem si příklady v SQL tutoru a objevil jsem dvě drobné chybky u příkladů 205 a 217. O co jde?

205

U 205 je dotaz: Jaké id má Miloš Forman? Z otázky chápu, že mám vypsat jen příslušné id, ale za správnou odpověď není považován zápis:

SELECT id
FROM umelci
WHERE jmeno = 'Miloš Forman'

Místo toho je správný výpis i se jménem Miloš Forman. Jde o stejný typ chyby jako byl u příkladu 206 (viz. zveřejněné chyby na gamě). A o to samé se jedná i u příkladu 217 (Vypište všechny filmy a herce za rok 2003.), kdy správné řešení opět vyžaduje i sloupec s rokem 2003.

ano: 1

217

ano: 3

600

několik připomínek k SQL tutoru:

V datasetu 600 u tabulky dopravni_letadla bych přejmenoval sloupec spolecnost na vyrobce, aby se název nepletl se sloupcem stejného jména v tabulce letecke_spolecnosti. ( U některé z otázek mi nebylo jasné, jestli se společností myslí výrobce či provozovatel letadel.)

ano i ne : 3 (důvody jsou pro i proti, zatím jsem ponechal v původním stavu)

800

U datasetu 800 chybí u tabulky cleneni v zadání sloupec tok_id. (V zobrazených datech již je.)

ano : 5

704

V příkladu 704 bych změnil otázku na: Jaká je celková rozloha rybníků podle povodí? Uveďte vždy povodí, celkovou rozlohu a počet rybníků v daném povodí. Ze současného dotazu není podle mě jasné, že se má vypsat i sloupec povodí. Jedná se o podobnou chybu jako byla u 205 a 217, ale tentokrát bych spíše upravil zadání než SQL dotaz.

ano : 3

213

zkoušel jsem si opět příklady z SQL tutoru a objevil jsem, že v 213 je úplně špatně SQL dotaz. Otázka zní: Kteří herci hráli alespoň pětkrát v hlavní roli?

Moc jsem si se zadáním nevěděl rady a tak jsem zkusil příkaz:

SELECT jmeno
FROM umelci
JOIN obsazeni
ON id = umelec_id
GROUP BY jmeno
HAVING COUNT(poradi) >= 5;

o kterém jsem tušil, že vypíše herce, kteří hráli v alespoň pěti filmech, bez rozlišení role. K mému překvapení SQLtutor vyhodnotil odpověď jako správnou. Zdálo se mi to ale podezřelé, že by nebyl žádný herec s pěti a více filmy a třeba jen s jednou hlavní rolí. Podíval jsem se tedy do nápovědy, ale ta mi moc nepomohla - zdála se mi taky chybná. Tato domněnka se mi potvrdila, když jsem si prošel přednášky o subselectech a napsal příkaz:

SELECT jmeno, COUNT(poradi), SUM(poradi)
FROM umelci
JOIN obsazeni
ON id = umelec_id
GROUP BY jmeno
HAVING jmeno = 'Morgan Freeman';

Z výsledku (počet filmu je 5 a suma pořadí je 9) je jasné, že Morgan Freeman nemohl hrát v alespoň pěti filmech hlavní roli.

Nechtěl jsem Vám poslat jen zprávu o chybě, ale i správný dotaz a tak jsem docela dlouho zkoušel vyřešit příklad přes subselecty, ale nakonec to bylo mnohem jednodušší:

SELECT jmeno
FROM umelci
JOIN obsazeni
ON umelci.id = umelec_id
GROUP BY jmeno
HAVING (2*COUNT(poradi) - SUM(poradi)) >= 5;

(Atribut pořadí je pouze 1 či 2.)

ano : 8

... nicméně se mi Vaše řešení moc nelíbí (je to takový trik s pořadím). Mně tam chyběla jedna podmínka WHERE poradi=1 a nakonec jsem to napsal jako JOIN (podobně jako Vy, ale s explicitní a jasnou podmínkou). Ve sbírce příkladů jsem to opravil, mělo by to být správně i na sqltutorovi.
        SELECT jmeno
          FROM umelci
               JOIN obsazeni
               ON id = umelec_id
         WHERE poradi=1
         GROUP BY jmeno
        HAVING COUNT(poradi) >= 5;

Zuzana Basíková

104

myslím,že lze jednodušší řešení :

select jmeno, prijmeni, zamestnanci.id
from zamestnanci
where pracoviste_kod='it';

ano : 3  (není to JOIN, ale jednoduchý select, snížil jsem počet bodů a změnil kategorii)

216

Co je v tabulkách jméno režiséra? jako umělce?

odpověď : 3   režiséři mohou být zároveň i herci a naopak. Zařadil jsem je proto všechny do tabulky umelci ... myslím, že je to tak v pořádku, ale mohu se mýlit. Zatím jsem to ponechal jak je.

309

nesrozumitelné zadání, má jen 3 body

názor : 1   Mně se otázka Na kterých tramvajových linkách je čtyřicet a ví­ce zastávek? zdá jasná, mohu se ale mýlit, je to příklad na pouzžití agregační funkce COUNT, tři body jsou myslím dostatečné.

518

v SQLtutor se zobrazuje: Jaká je celkový populace ... ? čeština

ano : 3

802

chyba ve spojení tabulek, tok_id není v cleneni. podle mě by mělo být:

select jmeno
  from toky
       join stanice
       on toky.id=stanice.id
       join cleneni
       on stanice_id=stanice.id
where povodi = 'Berounka';

ano : 5   atribut tok_id jsem neměl uveden v tabulce datasets pro tabulku cleneni. Na totéž upozornil pan Seeman, viz výše.

bodové hodnocení

otázka 310: dala bych alespoň 5 bodů
otázka 608: těžká, má jen 3 body
otázka 610: těžká, má jen 3 body
otázka 613: dala bych alespoň 4 body
otázka 624: těžká, alespoň 4 body, není žádný bod
otázka 625: těžká, alespoň 4 body, není žádný bod
otázka 627: dost těžká, má jen 3 body
otázka 808: by měla mít více bodů než 9

výborně!   tuto anketu (revize bodového hodocení) musíme nějak sjednotit. Připoměňte mi to napřednášce, uděláme si na toto téma příklad. Body pak budeme počítat zvlášť. Nepříjdete o ně.