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

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Václav Sedlář
Žlutá karta Bazar
Žlutá karta Bazar
Registrován: 01. dub 2006
Bydliště: Liberec
Kontaktovat uživatele:

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

Příspěvek 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
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

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

Příspěvek 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.
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Václav Sedlář
Žlutá karta Bazar
Žlutá karta Bazar
Registrován: 01. dub 2006
Bydliště: Liberec
Kontaktovat uživatele:

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

Příspěvek 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...
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

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

Příspěvek 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
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Odpovědět

Zpět na „Programování a web“