SQLtutor - chyby ZS 2007: Porovnání verzí
mBez shrnutí editace |
|||
(Není zobrazeno 12 mezilehlých verzí od stejného uživatele.) | |||
Řádek 18: | Řádek 18: | ||
INSERT INTO revize VALUES (1002, 'cepek', 4, 'nedocenena otazka'); | INSERT INTO revize VALUES (1002, 'cepek', 4, 'nedocenena otazka'); | ||
-- | -- | ||
SELECT * FROM revize; | SELECT * FROM revize; | ||
Podněty pro revizi bodového hodnocení budu vybírat společně, patrně ke konci roku. | |||
Dodane podklady jsou shromažďovány na adrese [http://josef.fsv.cvut.cz/~gin/dasy/2007/revize-bodoveho-hodnoceni/ http://josef.fsv.cvut.cz/~gin/dasy/2007/revize-bodoveho-hodnoceni/] | |||
== Eliška Svobodová == | == Eliška Svobodová == | ||
Řádek 209: | Řádek 213: | ||
GROUP BY jmeno | GROUP BY jmeno | ||
HAVING COUNT(poradi) >= 5; | HAVING COUNT(poradi) >= 5; | ||
===214=== | |||
kompletně jsem si projel otázky k datasetu filmy (200) a objevil jsem | |||
ještě dvě nesrovnalosti. | |||
214: Vypište filmy z roku 2006 seřazené podle obsazení (tj. počtu | |||
herců uvedených v databázi a titul filmu). | |||
Z otázky jsem pochopil, že mám vypsat filmy z roku 2006 seřazené | |||
podle obsazení a dále seřazené podle titulu (abecedy). Což bylo | |||
špatně. Zmátla mě ta závorka. Otázku bych tedy mírně upravil | |||
na: | |||
Vypište filmy z roku 2006 seřazené podle obsazení (tj. počtu herců | |||
uvedených v databázi). Uveďte obsazení a titul filmu. | |||
<span style="color:blue">ano:8</span> mírně jsem ještě pozměnil text otázky. | |||
===204=== | |||
204: Jaké jsou tituly filmů s id 3, 5, 7, 11? | |||
Zde je stejná chyba jako byla třeba u 206. Tutor chce navíc vypsat | |||
i sloupec s id, i když ze zadání to není jasné. | |||
<span style="color:blue">ano:1</span> | |||
== Zuzana Basíková == | == Zuzana Basíková == | ||
Řádek 274: | Řádek 301: | ||
<span style="color:blue">ano : 8</span> v sql textu bylo zapomenuto puvodni jméno tabulky limity_spa (nyní limity_cm) | <span style="color:blue">ano : 8</span> v sql textu bylo zapomenuto puvodni jméno tabulky limity_spa (nyní limity_cm) | ||
=== 621 === | |||
Dobrý den, | |||
jedná se o příklad 621. Neměla by být ve správné odpovědi použita agregační funkce count místo sum ? Jedná se přeci o počet id s výrobcem Airbus, ne o jejich součet. | |||
<span style="color:blue">ano : 10</span> | |||
== Jan Kopáč == | == Jan Kopáč == | ||
Řádek 330: | Řádek 364: | ||
<span style="color:blue">ano : 2</span> | <span style="color:blue">ano : 2</span> | ||
=== 616 === | |||
Dobrý den, | |||
nezdá se mi moc výsledek nápovědy u otázky č. 616 (Které společnosti mají nejstarší letadla (letadlo, jehož typ je nejdéle v provozu)? Uveďte leteckou společnost, výrobce, letadlo a rok.). Dle nápovědy je správná odpověd rok 1957, avšak já | |||
jsem našel 1952. Kdyžtak se na to podívejte, děkuji predem, | |||
Jan Kopáč | |||
Nabízená možnost: | |||
<pre> | |||
SELECT S.spolecnost AS dopravce, L.vyrobce AS vyrobce, | |||
letadlo, v_provozu_od AS rok | |||
FROM dopravni_letadla L | |||
JOIN | |||
letecke_flotily F | |||
ON F.letadlo_id=L.id | |||
JOIN | |||
letecke_spolecnosti S | |||
ON S.id=F.spolecnost_id | |||
WHERE L.v_provozu_od = (SELECT MIN(v_provozu_od) | |||
FROM dopravni_letadla | |||
JOIN letecke_flotily | |||
ON id=letadlo_id); | |||
</pre> | |||
Moje verze: | |||
<pre> | |||
SELECT spolecnost,vyrobce, letadlo,v_provozu_od | |||
FROM dopravni_letadla | |||
JOIN | |||
letecke_spolecnosti | |||
ON letecke_spolecnosti.id= dopravni_letadla.id | |||
WHERE v_provozu_od = (SELECT min(v_provozu_od) FROM dopravni_letadla ); | |||
</pre> | |||
<span style="color:blue">ne : +1</span> porovnáváte letecke_spolecnosti.id a dopravni_letadla.id, což nedává smysl. Musíte tabulky spojit přes letecké flotily. | |||
== Martin Janata == | |||
Posilam nekolik oprav (dle meho nazoru) SQL tutora. | |||
===105=== | |||
U otazky c. 105 se ve spravne odpovedi zamestnanci opakuji, jestli by nebylo | |||
lepsi pridat "group by prijmeni" a misto "castka" zjistovat "avg(castka)". | |||
<span style="color:blue">ne : 3</span> otázka 104 se od přechozí 104 liší v tom, že obsahuje JOIN, podmínka WHERE není podstatná. | |||
===611=== | |||
V otazce c. 611 neni explicitne receno, ze jsou ve vysledku pozadovany dva sloupce. | |||
<span style="color:blue">ano : 7</span> | |||
===401=== | |||
U otazky c. 401 neni moc logicke, ze jsou nektere pamatky v databazi vicekrat, jestli by tedy nestalo za to to zduraznit. | |||
<span style="color:blue">ano : 3</span> | |||
===608=== | |||
Posledni vec je jen kosmeticka uprava u otazky c. 608: jestli by nebylo srozumitelnejsi, kdyz by mezi vetami bylo a (misto carky). | |||
<span style="color:blue">ano : 3</span> |
Aktuální verze z 2. 12. 2007, 11:26
> SQLtutor
Revize bodového hodnocení
-- http://josef.fsv.cvut.cz/~gin/SQLtutor/sqlquiz/quiz DROP TABLE revize; CREATE TABLE revize ( id int NOT NULL, -- id otazky jmeno varchar(30) NOT NULL, -- kdo podava pripominku k hodnoceni navrh int, -- navrh noveho bodoveho hodnoceni komentar text ); -- INSERT INTO revize (id, jmeno, navrh) VALUES (100, 'cepek', 3); INSERT INTO revize (id, jmeno, komentar) VALUES (101, 'cepek', 'divna otazka vyradit'); INSERT INTO revize VALUES (1002, 'cepek', 4, 'nedocenena otazka'); -- SELECT * FROM revize;
Podněty pro revizi bodového hodnocení budu vybírat společně, patrně ke konci roku.
Dodane podklady jsou shromažďovány na adrese http://josef.fsv.cvut.cz/~gin/dasy/2007/revize-bodoveho-hodnoceni/
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
510
drobné nedorozumnění jsem našla u otázky č. 510: Které evropské země (Europe) mají HPD na hlavu vyšší než Velká Británie (United Kingdom). Myslím, že zde by jako správná odpověď měl stačit 1 sloupec tvořený seznamem evropských států. Zde jsou za správnou odpověď požadovány sloupce dva a to stat a region. Otázka zní, které Evropské země, proto myslím, že stačí, když se tato podmínka objeví pouze v dotazu SQL (........WHERE region LIKE '%Europe%'...........) a nikoli jako další sloupec na výstupu. Popřípadě by bylo dobré uznat jako správnou odpověď také samostatný sloupec se státy splňujícími podmínku (Evropa, HDP na hlavu).
ano : 5 na výstupu má být jen jméno země-
412
Podobným případem je v otázka* č. 412: *Které země mají v seznamu světového dědictví UNESCO zapsáno deset a více památek?
SELECT zeme FROM unesco GROUP BY zeme HAVING COUNT(pamatka) >= 10;
Tento příkaz vypíše seznam zemí, ale bez počtu památek, což je považováno za chybnou odpověď, ale v otázce není napsáno, že je třeba zobrazit i počet.
ano : 4 zde jsem doplnil do zadání uveďte zemi a počet památek (ty počty památek jsou zajímavé)
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 : 3 změnil jsem a doufám, že jsem při tom do testu nezanesl příliš nových chyb
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;
214
kompletně jsem si projel otázky k datasetu filmy (200) a objevil jsem ještě dvě nesrovnalosti.
214: Vypište filmy z roku 2006 seřazené podle obsazení (tj. počtu herců uvedených v databázi a titul filmu). Z otázky jsem pochopil, že mám vypsat filmy z roku 2006 seřazené podle obsazení a dále seřazené podle titulu (abecedy). Což bylo špatně. Zmátla mě ta závorka. Otázku bych tedy mírně upravil na: Vypište filmy z roku 2006 seřazené podle obsazení (tj. počtu herců uvedených v databázi). Uveďte obsazení a titul filmu.
ano:8 mírně jsem ještě pozměnil text otázky.
204
204: Jaké jsou tituly filmů s id 3, 5, 7, 11? Zde je stejná chyba jako byla třeba u 206. Tutor chce navíc vypsat i sloupec s id, i když ze zadání to není jasné.
ano:1
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 použ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 na přednášce, uděláme si na toto téma příklad. Body pak budeme počítat zvlášť. Nepříjdete o ně.
Jana Hrnčířová
804
během procvičování SQL jsem přišla na nejasnost u příkladu č. 804. Na mojí odpověď se napsala následující hláška: ERROR: relation "limity_spa" does not exist. Přitom ani v zadaných tabulkách, ani v mé odpovědi se žádný takový parametr nevyskytuje. Když jsem použila odpověď z nápovědy, objevila se stejná hláška. Odpověď z nápovědy používá limity_spa jako název tabulky, ale tabulka se jmenuje limity_cm. Po úprave odpovědi z nápovědi též vyskočí stejná hláška.
ano : 8 v sql textu bylo zapomenuto puvodni jméno tabulky limity_spa (nyní limity_cm)
621
Dobrý den, jedná se o příklad 621. Neměla by být ve správné odpovědi použita agregační funkce count místo sum ? Jedná se přeci o počet id s výrobcem Airbus, ne o jejich součet.
ano : 10
Jan Kopáč
pravděpodobně našel jsem chybu v sql tutorovi. Jde o otázku č. 627: Které letadlo má největší dolet? Uveďte výrobce, letadlo a dolet. I přesto , že jsem to dle mého napsal dobře mi to hlásilo chybu, podíval jsem se tedy na nápovědu, a zjistil jsem, že se tam odvoláváte na sloupec výrobce, který v zobrazení dat u tabulky dopravni_letadla neexistuje (místo toho je tam sloupec spolecnost). Co je ale pro mne nejzajímavější, výsledek je správný, čemuž nerozumím. Kdyžtak se na to zkuste podívat.
Obdobný problém je i u otázek č.613 a c.628. Takže pokud je to skutečně chyba, bude se vyskytovat i u dalších otázek odkazující se právě na tabulku dopravni_letadla.
ano : 5 opravil jsem datové tabulky a testy, ale zapomněl jsem na tabulky datasets, které se používají pouze pro tisk přehledu tabulek v tutorovi před zadáním otázky. Proto to chodilo, i když tutor říkal něco jiného.
619
U otázky č.619 bych raději přeformuloval dotaz z : Které typy letadel byly uvedeny do provozu v letech 1993 až 1995 Uveďte společnost, typ letadla a rok. na: Které typy letadel byly uvedeny do provozu v letech 1993 až 1995 Uveďte vyrobce, typ letadla a rok.
Chyba je způsobena přepsáním sloupce spolecnost na vyrobce v tabulce dopravni_letadla, tato otázka však zůstala zachována a mohla by dále někoho klamat.
ano : 1
511
Moc se mi ještě nelíbí odpověď otázky 511: Které země mají HPD vyšší než všechny evropské země (Europe). Z ní se mi nabízí vše řešit pomoci sum():
SELECT stat FROM staty WHERE hdp > (SELECT sum(hdp) FROM staty WHERE region LIKE '%Europe%');
oproti nabízené nápovědě s ALL:
SELECT stat FROM staty WHERE hdp > ALL (SELECT hdp FROM staty WHERE region LIKE '%Europe%');
Z otázky dle mého vyplývá, které státy mají větší hdp, než je součet všech hdp evropských států. Podle nabízené verze z nápovědy dostaneme: Japan (hdp = 4 331 706 615 000) United States (hdp = 11 011 216 812 000) , když samotný součet hdp evropských států je 12 306 108 549 000. Odpověď by měla poté nulovou odpověď . Což je divné, hold dle otázky mi to tak vychází. Přesně jsem si totiž nebyl jistý užitím ALL, proto jsem si celou úlohu rozdělil do částí a ty mi po spojení nevyšly, jak by měly.
ano : 6 myslím, že ta otázka je po jazykové stránce správně, je ale opravdu matoucí. Přidal jsem tam alternativní formulaci na vysvětlenou. Ten příklad jsem dal do sbírky jako úlohu na poddotaz vracející tabulku, ve které musím porovnat všechny hodnoty (ALL), jinak to jde i přes MAX(). Matoucí podle mne je na tom to HDP. Pokud bych se ptal, kteří závodníci skočili výš než všichni závodníci Francie, nikoho by nenapadlo francouzské výsledky ve skoku do výšky sčítat. Snad je to teď srozumitelné.
HDP
Když si čtu po sobě ještě tento e-mail, všiml jsem si maličkosti, která se v otázkách ještě objevuje špatně. Jde o zkratku HPD místo HDP, min se vyskytuje ještě v otázce č.510 spolu právě s č.511. Půjde jen o otázky týkající se tabulky staty.
ano : 2
616
Dobrý den, nezdá se mi moc výsledek nápovědy u otázky č. 616 (Které společnosti mají nejstarší letadla (letadlo, jehož typ je nejdéle v provozu)? Uveďte leteckou společnost, výrobce, letadlo a rok.). Dle nápovědy je správná odpověd rok 1957, avšak já jsem našel 1952. Kdyžtak se na to podívejte, děkuji predem, Jan Kopáč
Nabízená možnost:
SELECT S.spolecnost AS dopravce, L.vyrobce AS vyrobce, letadlo, v_provozu_od AS rok FROM dopravni_letadla L JOIN letecke_flotily F ON F.letadlo_id=L.id JOIN letecke_spolecnosti S ON S.id=F.spolecnost_id WHERE L.v_provozu_od = (SELECT MIN(v_provozu_od) FROM dopravni_letadla JOIN letecke_flotily ON id=letadlo_id);
Moje verze:
SELECT spolecnost,vyrobce, letadlo,v_provozu_od FROM dopravni_letadla JOIN letecke_spolecnosti ON letecke_spolecnosti.id= dopravni_letadla.id WHERE v_provozu_od = (SELECT min(v_provozu_od) FROM dopravni_letadla );
ne : +1 porovnáváte letecke_spolecnosti.id a dopravni_letadla.id, což nedává smysl. Musíte tabulky spojit přes letecké flotily.
Martin Janata
Posilam nekolik oprav (dle meho nazoru) SQL tutora.
105
U otazky c. 105 se ve spravne odpovedi zamestnanci opakuji, jestli by nebylo lepsi pridat "group by prijmeni" a misto "castka" zjistovat "avg(castka)".
ne : 3 otázka 104 se od přechozí 104 liší v tom, že obsahuje JOIN, podmínka WHERE není podstatná.
611
V otazce c. 611 neni explicitne receno, ze jsou ve vysledku pozadovany dva sloupce.
ano : 7
401
U otazky c. 401 neni moc logicke, ze jsou nektere pamatky v databazi vicekrat, jestli by tedy nestalo za to to zduraznit.
ano : 3
608
Posledni vec je jen kosmeticka uprava u otazky c. 608: jestli by nebylo srozumitelnejsi, kdyz by mezi vetami bylo a (misto carky).
ano : 3