Stránka 1 z 1

vysvětlení toho příkladu na sql...

Napsal: úte 18. led 2011, 17:02
od Václav Sedlář
dobrý den, mám zadáni:
Mějme tabulky UCITEL(..), UCI(..…), PŘEDMĚT(…), které realizují skutečnost, že jeden učitel
může učit jeden nebo více předmětů a jeden předmět může mít více učitelů. Napište SQL
příkaz, co najde všechny (tedy i ty co nic neučí) vyučující (jméno, příjmení, adresa,
název_předmětu), kteří bydlí v Liberci či Praze a zároveň jsou mladší než 20 let. Výsledek
seřaďte podle jejich příjmení.
a výsledný příkaz je prý toto:
SELECT jmeno, prijmeni, adresa, nazev
FROM osoba LEFT JOIN uci ON (osoba.oc_cislo = uci.os_cislo)
WHERE adresa IN (‘Liberec’, ‘Praha’) AND vek <= 20
ORDER BY prijmeni
a mě by zajímalo co přesně dělá toto:
LEFT JOIN uci ON (osoba.oc_cislo = uci.os_cislo)
děkuji

Re: vysvětlení toho příkladu na sql...

Napsal: úte 18. led 2011, 18:15
od arxeiss
Jednoduché.
INNER JOIN připojuje tabulku, a podle podmínky přiřazuje jednotlivé údaje z tabulky k jiným, to je myslím jasné.
Jenomže ty máš v tabulce UCI IDčka učitelů s IDčkama předmětů které učí, říká se tomu propojovací entita, a např učitelka půjde na mateřskou, ale ze školy ji nevyhodí, pouze je pryč, tak neučí, tím pádem není v tabulce UCI.
A ty máš vypsat všechny učitelé, ale podle podmínky by to ty na mateřské nevypsalo, protože nikde se nebude shodovat s ničím v tabulce UCI. Proto je tam to LEFT, které značí, že v levé tabulce od toho příkazu (tj OSOBA) nemusí se shodovat ta podmínka, takže pokud nebude i v té tabulce UCI tak to nevadí, jí to stejně vypíše, ale v atributech které budeš brát z tabulky UCI bude NULL.
To samé RIGHT JOIN, to je to samé, ale naopak, takže kdyby jsi k tabulce UCI připojoval OSOBA tak by jsi pouzil RIGHT JOIN
Kapiš?

Edit:\\ To že se podmínka nemusí shodovat jsem napsal špatně, to by znamenalo, že jí to může přiřadit k čemukoli, lépe řečeno, vypíše ji to, i pokud se nenajde shoda s tabulkou UCI, a ty atributy budou NULL. Krátký příklad:

Tabulka OSOBA

Kód: Vybrat vše

ID    JMÉNO
--------------
1     Ondra
2     Martin
3     Dana
Tabulka UCI

Kód: Vybrat vše

IDucitele   IDpredmetu   HodinTydne
------------------------------------
    1       2          5
    1       5          1
    2       1         15
    2       3         7
Tvůj dotaz ovšem neodpovídá zadání :!: :!: :!:
Protože ty máš vypsat název předmětu, ale nikde nepřipojuješ tabulku předměty, tj zjistíš maximálně IDčko předmětu, ne jeho název
Ale tvůj dotaz by vrátil něco takového

Kód: Vybrat vše

Jméno   IDpredmetu   
--------------------------
 Ondra          2 
 Ondra          5 
 Martin          1
 Martin          3
Dana           NULL
Aby dotaz byl úplný, vypadal by asi takto

Kód: Vybrat vše

SELECT jmeno, prijmeni, adresa, nazev
(FROM osoba LEFT JOIN uci ON (osoba.oc_cislo = uci.os_cislo))
INNER JOIN predmet ON uci.IDpredmetu = predmet.IDpredmetu
WHERE adresa IN (‘Liberec’, ‘Praha’) AND vek <= 20
ORDER BY prijmeni
Pokud děláte v MSSQL tak to musíš uzavřít do závorek ten druhý řádek, já už to udělal, ale pokud děláš např MySQL tak tam nemusíš mít ty závorky, a místo INNER JOIN stačí jenom JOIN
A jěště bych ti doporučil přejmenovávání tabulek.

Re: vysvětlení toho příkladu na sql...

Napsal: úte 18. led 2011, 21:20
od Václav Sedlář
moc děkuji za vyčerpávající odpověď...ten příklad byl v testu kde jsem nebyl (mě to čeká zítra) a tak jsem si to procházel....

P.S.: to řešení co jsem sem dával bylo přímo od učitele...

Re: vysvětlení toho příkladu na sql...

Napsal: úte 18. led 2011, 22:47
od arxeiss
Tak to teda nechápu, ale tabulka s názvem předmětu není vůbec připojena, takže jak to může vybrat? Jedině, že by název předmětu byl napsán v tabulce UCI, ale to by potom nesplňovalo pravidla databází, konkrétně redudantnost dat