Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím,
prosím, potřebovala bych poradit s úkolem. Máme databázi:
Pacient(RČ, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Lékař(IČO, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Návštěva(RČ, IČO, datum návštěvy, diagnoza, datum kontroly)
A máme přepsat následující dotazy do n-ticového relačního kalkulu a algebry:
1. Všechny lékaře a pacienty, kteří bydlí ve stejném městě.
2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.
3. Kdy má přijít na kontrolu pacient “Novák”.
4. Kolik ošetření provedl dne “30.11.2000” lékař “Král”.
5. Pacienty, kteří byli na návštěvě pouze u lékaře “Krále”.
6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.
Jediné co mám, tak je 5. :
x.RČ WHERE Návštěva(x) AND Lékař.přijímení = ´Král´
Co znamená to x?
Děkuji moc
Offline
↑ Ilhvm:
síce netuším, čo je x ale tá 5-ka sa mi nepozdáva tak, či tak
zapíšem dotaz č. 5 v SQL zápise:
SELECT p.jmeno, p.prijmeni, p.rc FROM pacient p JOIN navsteva n ON p.rc = n.rc JOIN lekar l ON n.ico = l.ico WHERE l.prijmeni = 'Kral' MINUS SELECT p.jmeno, p.prijmeni, p.rc FROM pacient p JOIN navsteva n ON p.rc = n.rc JOIN lekar l ON n.ico = l.ico WHERE l.prijmeni <> 'Kral'
V zadaní sa píše pouze u Krále - a to "pouze" zásadne mení situáciu.
Preto by malo ísť o 2 množiny dát. V prvej sa vytvorí spojenie cez všetky tabuľky a vyberú sa iba pacienti, ktorí boli u "Krále".
Druhá množina je to isté spojenie, ale podmienka je opačná, teda pacienti ktorí boli u nejakého iného lekára.
Ich rozdiel sú pacienti, ktorí boli u "Krále" ale neboli u iného lekára.
SQL zápisom som chcel ukázať, že toho obsahuje viac než ten zápis s "x". A iba pomocou WHERE a AND sa tento dotaz nedá správne realizovať.
"x" by mohol byť asi nejaký pokus zapísať JOIN operáciu, ktorá tam je určite nevyhnutná.
Offline
↑ etchie:
Děkuju.
Mě spíše jde o tu relační algebru a kalkul, studuji dálkově, takže nemám moc možností jak to pochopit a ze skript mi to prostě nedává smysl někdy.
Např.:
Mějme relace:
KINO(NÁZEV_K, ADRESA)
FILM(JMÉNO_F, HEREC, ROK)
PROGRAM(NÁZEV_K, JMÉNO_F, DATUM)
Zapište v relační algebře dotaz: Najděte název kina a jeho adresu, kde dávají film Kolja.
Řešení:
(PROGRAM(JMÉNO_F = 'Kolja‘ [NÁZEV_K = NÁZEV_K])
[NÁZEV_K=NÁZEV_K] KINO [NÁZEV_K,ADRESA]
Zdá se mi to složitě sepsané, takže teď nevím, jestli to tak fakt má být a nebo to tak složitě píše vyučující (ještě k tomu tam někde chybí závorka).
Proč se tam 2x porovnává NÁZEV_K?
Offline
↑ Ilhvm:
Ja sa tiež práve učím relačnú algebru, ale SQL zápis mi je oveľa bližší.
Tomu zápisu RA, ako ho uvádzaš, nerozumiem veľmi dobre. My sa učíme relačnú algebru zapisovať inak.
Ak to popíšem slovami, tak by to bolo: spoj KINO a PROGRAM na základe poľa NÁZEV_K tj. výraz [NÁZEV_K = NÁZEV_K] z tejto množiny vyber záznamy kde film je 'Kolja' tj. podmienka JMÉNO_F = 'Kolja'.
Z toho, čo ostane už iba vyber stĺpce [NÁZEV_K, ADRESA].
Takže tiež nerozumiem prečo tam je 2x [NÁZEV_K = NÁZEV_K]
Offline
↑ Ilhvm:
Ja som zvyknutý na toto Relační algebra alebo Relačná algebra
Ale našiel som v nejakých zdrojoch aj tieto zápisy:
projekcia: R[C] kde C sú atribúty teda stĺpce, ktoré sa vyberajú
selekcia: R(C) kde C je podmienka, podľa ktorej sa vyberá
spojenie: R * S
rozdiel: R - S
Je tam aj príklad, ktorý sa dosť podobá na ten tvoj.
Vypíšte zoznam kín, kde nedávajú žiadny film s hercom Marlon Brando.
KINO[NAZOV_K] - (FILM(HEREC=Brando)[MENO_F] * PROGRAM[NAZOV_K, MENO_F]) [NAZOV_K]
číta sa to takto:
1. KINO[NAZOV_K] vyber z tabuľky KINO všetky názvy kín a odlož si ich na neskôr - robí sa tu projekcia
2. FILM(HEREC=Brando)[MENO_F] vyber z tabuľky FILM všetky filmy kde hrá Brando a vyber iba názov filmu - robí sa tu selekcia a projekcia
3. PROGRAM[NAZOV_K, MENO_F] z tabuľky PROGRAM vyber 2 stĺpce - iba projekcia
4. to čo ti vyšlo z bodu 2 a z bodu 3 spoj dokopy teda: FILM(HEREC=Brando)[MENO_F] * PROGRAM[NAZOV_K, MENO_F] - ide o spojenie
5. z množiny, ktorá vznikla v bode 4 vyber iba stĺpec [NAZOV_K] - robí sa tu projekcia
6. z množiny, ktorú sme odložili v bode 1 odpočítaj všetky prvky ktoré obsahuje množina z bodu 5 - robí sa rozdiel množín
To čo ostalo sú kiná, kde Brando nehrá v žiadnom filme.
Offline
↑ etchie:
Super, děkuju.
No, tak nějak jsem přišla na ten druhý příklad nahoře, kdy hledáme pacienty, kteří nebyli na žádné návštěvě, s tím zbytkem si nevím rady, šlo by to nějak takto?
pacient[jmeno, prijmeni](Navsteva(datum_navstevy = " "))
Offline
↑ Ilhvm:
2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.
Tento dotaz sa realizuje takzvaným ľavým vonkajším spojením - LEFT OUTER JOIN
V zdrojoch, z ktorých som uvádzal zápis sa o tom síce hovorí, ale vôbec tam nie je napísané ako sa to označuje.
Musím teda zaviesť nejaké vlastné značenie, lebo neviem nikde nájsť ako to označiť.
Takže: nech *L je ľavé vonkajšie spojenie. (*R by bolo pravé a *F by bol FULL OUTER JOIN)
(Pacient *L Navsteva) (datum_navstevy IS NULL) [RC, Jmeno, Prijmeni]
Tento dotaz musí byť realizovaný ako ľavé vonkajšie spojenie pretože, tí pacienti čo ešte neboli na žiadnej návšteve, nemajú v relácii Návšteva žiadne záznamy. Operácia *L im napriek tomu takéto záznamy dotiahne a ich hodnoty budú všade NULL.
Vzhľadom na hodnoty NULL dosadené pre neexistujúce záznamy je aj tento zápis ekvivalentný:
(Pacient *L Navsteva) (ICO IS NULL) [RC, Jmeno, Prijmeni]
to znamená že nie len, že deň návštevy neexistuje, ale ani lekár, ktorý vyšetril pacienta.
Offline
6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.
obtiažnosť tejto úlohy je úplne že "no ty vole !".
Mne z toho vychádza, že je potrebné definovať označenie pre ďalšiu operáciu tzv. CROSS JOIN. To je vlastne karteziánsky súčin a tu by sa celkom hodilo to X z úvodu témy. Nech teda R X S je karteziánsky súčin relácií R a S.
A mne z toho teraz vychádza takáto šialenosť:
Pacient[RC, Jmeno, Prijmeni] - ( (Pacient X Lekar) [ICO, RC, Jmeno, Prijmeni] - (Pacient * Navsteva) [ICO, RC, Jmeno, Prijmeni] )[RC, Jmeno, Prijmeni]
Offline
↑ etchie:
No je to takové nějaké složité, sama bych na to určitě nepřišla.
Pacient(RČ, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Lékař(IČO, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Návštěva(RČ, IČO, datum návštěvy, diagnoza, datum kontroly)
RELAČNÍ ALGEBRA
1. Všechny lékaře a pacienty, kteří bydlí ve stejném městě.
Join Lékař and Pacient where město_l = město_p
2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.
Project (Join (Minus (Project Pacient over RČ) and (Project Návštěva over RČ)) and Pacient where RČ = RČ ) over jméno_p, příjmení_p, RČ
3. Kdy má přijít na kontrolu pacient “Novák”.
Project (Join (Restrict Pacient where příjmení_p =„Novák“) and Návštěva where RČ = RČ) over jméno_p, příjmení_p, RČ, datum_kontroly
4. Kolik ošetření provedl dne “30.11.2000” lékař “Král”.
Project (Restrict (Join (Restrict Návštěva where datum_návštěvy=“30.11.2000”) and Lékař where IČO = IČO) where příjmení_l = “Král“) over count(RČ)
5. Pacienty, kteří byli na návštěvě pouze u lékaře “Krále”.
Project (Join Pacient and (Minus (Join Návštěva and (Restrict Lékař where příjmení_l=„Král“) where IČO=IČO) and (Join Návštěva and (Restrict Lékař where příjmení_l<>„Král“) where IČO=IČO)) where RČ=RČ) over jméno_p, příjmení_p, RČ
6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.
Project (Join (Devide (Project Návštěva over IČO, RČ) by (Project Lékaři over IČO)) and Pacient where RČ = RČ) over jméno_p, příjmení_p, RČ
Offline