SQLtutor - chyby ZS 2007: Porovnání verzí

Z GeoWikiCZ
 
(Není zobrazeno 5 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;cepek@jama:~/work$
  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 297: Řádek 301:


<span style="color:blue">ano : 8</span> &nbsp; v sql textu bylo zapomenuto puvodni jméno tabulky limity_spa (nyní limity_cm)
<span style="color:blue">ano : 8</span> &nbsp; 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 353: Řá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>&nbsp;&nbsp;porovnáváte letecke_spolecnosti.id a dopravni_letadla.id, což nedává smysl. Musíte tabulky spojit přes letecké flotily.


== Martin Janata ==
== Martin Janata ==

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