• Welcome to TUKE FÓRUM - Fórum pre študentov Technickej Univerzity v Košiciach.
 

DBS

Started by xxx3, 16.02.2012, 15:10:05

« predchdzajce - alie »

veteran

#150
Quote from: Rajo on  07.04.2012, 00:45:18
raz má selekciu v tých riešených úlohach ako prvú a raz pod join...kedy ma byť tak a kedy tak? :D
Vo väčšine prípadov dá použiť aj jeden, aj druhý spôsob (ale nemusí to platiť vždy). Potom ale:

MV1 <-- σ job_title like '%Manager%' jobs
MV2 <-- employees  ⋈  job_id = job_id jobs   <--- MV1
MV3 <-- MV2 ⋈ department_id = department_id departments
V <-- π first_name,last_name,job_title, department_name (MV3)


Ja to ale riešim na istotu, že si najprv spravím join a až potom selekciu.


Rajo

select first_name,last_name,job_title, department_name from hr.employees join hr.jobs using (job_id) join hr.departments using (department_id) where job_title like '%Manager%';

a nie náhodou:
MV1 <-- σ job_title like '%Manager%' (jobs)
MV2 <-- MV1  ⋈  job_id = job_id jobs
MV3 <-- MV2 ⋈ department_id = department_id departments
V <-- π first_name,last_name,job_title, department_name (MV3)


???

lebo:
select spz,typ,count(*) from auto join asz using (spz) where typ in ('o','O') group by spz,typ having count(*) = 2;

MV1<-- σ s typ = 'o' OR typ = 'O' (auto)
MV2 <-- MV1 ⋈ spz = spz asz
MV3(spz,typ,pocet) <-- spz, typ F COUNT spz (MV2)
V(spz,typ,pocet) <-- s pocet = 2(MV3)

veteran

Quote from: Rajo on  07.04.2012, 01:45:00

a nie náhodou:
MV1 <-- σ job_title like '%Manager%' (jobs)
MV2 <-- MV1  ⋈  job_id = job_id jobs <---- employees
MV3 <-- MV2 ⋈ department_id = department_id departments
V <-- π first_name,last_name,job_title, department_name (MV3)


Ak narážaš na poradie MV1 a tej druhej tabuľky (má tam byť employees, nie jobs), tak je to v tomto prípade IMHO jedno. Je jedno, či ku medzivýsledku pripojíš employees alebo ku employees medzivýsledok. Výsledok z toho bude rovnaký.

xxx3

skontrolovali by ste mi toto prosim, ci to mam OK ?

select department_name, city, count(*)
from hr.employees OUTER join hr.departments using (department_id) join hr.locations using (location_id)
where city like 'Seattle'
group by department_name, city
having count(*)>=1 AND count(*)<=4
order by 3;

MV1 <- employees OUTER JOIN department_id=department_id departments
MV2 <- MV1 JOIN location_id=location_id locations
MV3 <- sigma city like 'Seattle' (MV2)
MV4(department_name, city, pocet) <- department_name, city, F count employee_id (MV3)
V(department_name, city, pocet) <- sigma pocet between 1 and 4 (MV4)   


veteran

Quote from: xxx3 on  09.04.2012, 19:17:10
skontrolovali by ste mi toto prosim, ci to mam OK ?

select department_name, city, count(*)
from hr.employees OUTER join hr.departments using (department_id) join hr.locations using (location_id)
where city like 'Seattle'
group by department_name, city
having count(*)>=1 AND count(*)<=4
order by 3;

MV1 <- employees OUTER JOIN department_id=department_id departments
MV2 <- MV1 JOIN location_id=location_id locations
MV3 <- sigma city like 'Seattle' (MV2)
MV4(department_name, city, pocet) <- department_name, city, F count employee_id (MV3)
V(department_name, city, pocet) <- sigma pocet between 1 and 4 (MV4)   

Je to dobre, ale nie je potrebné dávať tam OUTER JOIN. Stačí JOIN.

xxx3

ked tam nedam OUTER ale iba JOIN tak sa to berie automaticky ako OUTER JOIN ? alebo INNER ?

veteran

Quote from: xxx3 on  09.04.2012, 21:29:05
ked tam nedam OUTER ale iba JOIN tak sa to berie automaticky ako OUTER JOIN ? alebo INNER ?
INNER.

Písať "OUTER JOIN" je zbytočné. Pri OUTER JOINe treba vždy špecifikovať o aký typ OUTER JOINU ide - LEFT (OUTER) JOIN, RIGHT (OUTER) JOIN, FULL (OUTER) JOIN. Bez toho to nemá zmysel ani písať. Kľúčové slovo OUTER je nepovinné, písať ho netreba, ale keď ho napíšeš bez špecifikácie (LEFT, RIGHT, FULL), to je akoby si ho ani nenapísal.

JOIN = INNER JOIN
LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
FULL JOIN = FULL OUTER JOIN

xxx3

uloha na dalsi tyzden: vytvorte fyzický (relačný) model tak, aby platili všetky integritné obmedzenia

to akoze fyzicku schemu treba spravit ? Taku ako je na moodle Schéma hr (fyzická schéma) pdf ??

veteran

Quote from: xxx3 on  14.04.2012, 23:20:14
to akoze fyzicku schemu treba spravit ? Taku ako je na moodle Schéma hr (fyzická schéma) pdf ??
Áno.

xxx3

do tabulky zamul treba pridat stlpce idz a idul ?

a d ozamestnanec evrp ?

Wolfdale


Ešte sme to nedokončili celkom, ale takmer sme už začali.

Rajo

a nie idz do rod_prislusnik ?

Wolfdale

Ja mám idz aj v zamul aj v rod_prislusnik.

Ešte sme to nedokončili celkom, ale takmer sme už začali.

veteran

Quote from: Rajo on  15.04.2012, 02:22:30
a nie idz do rod_prislusnik ?
idz musí ísť aj do rod_prislusnik, aj do zamul. V tabuľke zamul sa evidujú informácie o tom, koľko ktorý zamestnanec odpracoval na nejakej úlohe (bez idz by to asi nešlo :)). zamul je teda "sprostredkovateľom" vzťahu m:n medzi tabuľkami zamestnanec a uloha.

xxx3

#164
a toto ako spravit pri create table ?
atribúty datum_narodenia, start_date, ende_date sú v tvare: dd.mm.yyyy

// a teda to predosle takto:
do zamul: idul, idz
do zamestnanec: evrp
do rod_prislusnik: idz 

a primary key v zamul bude (idul, idz) ?

takto je to spravne ? urcite aj v rod_prislusnik ma byt idz ? .. lebo ked si pozriete hr schemu tak medzi EMPLOYEES a JOBS je taky isty vztah ako medzi ZAMESTNANEC a ROD_PRISLUSNIK ... a tam je iba z tabulky JOBS, JOB_ID v EMPLOYESS, ale v JOBS nie je EMPLOYEE_ID ...

+ vkladali ste tam aj nejake data do tych tabuliek ? :D ... sice to tam nepise, ale potom by bola blbost robit selecty

veteran

Quote from: xxx3 on  15.04.2012, 16:28:15
a toto ako spravit pri create table ?
atribúty datum_narodenia, start_date, ende_date sú v tvare: dd.mm.yyyy
I have no idea  ???

Quote from: xxx3 on  15.04.2012, 16:28:15
// a teda to predosle takto:
do zamul: idul, idz
do zamestnanec: evrp
do rod_prislusnik: idz 

takto je to spravne ?
Nie. Do tabuľky zamestnanec sa nedáva žiaden FK.

Quote from: xxx3 on  15.04.2012, 16:28:15urcite aj v rod_prislusnik ma byt idz ? .. lebo ked si pozriete hr schemu tak medzi EMPLOYEES a JOBS je taky isty vztah ako medzi ZAMESTNANEC a ROD_PRISLUSNIK ... a tam je iba z tabulky JOBS, JOB_ID v EMPLOYESS, ale v JOBS nie je EMPLOYEE_ID ...
V rod_prislusnik bezpodmienečne musí byť idz. Inak, by si nevedel priradiť rodinného príslušníka ku zamestnancovi.

Medzi hr.employees a hr.jobs je presne opačný vzťah, ako pri zamestnanec a rod_prislusnik.

v hr-schéme: Jeden zamestnanec má jeden job, ale jeden job môže robiť viacero zamestnancov.
v tejto úlohe: Jeden zamestnanec môže mať viacero rod. príslušníkov, ale daný rod. príslušník má väzbu len s jedným zamestnancom

Teda hr.employees akoby zodpovedalo tabuľke rod_prislusnik a hr.jobs zodpovedá tabuľke zamestnanec.

Quote from: xxx3 on  15.04.2012, 16:28:15
+ vkladali ste tam aj nejake data do tych tabuliek ? :D ... sice to tam nepise, ale potom by bola blbost robit selecty
Nepíše to tam, ale keď nechceš robiť selecty naslepo, tak by bolo dobré si tam nejaké dáta vložiť ;)

xxx3

ok, diky ... som si to zle pozrel v tej hr scheme ... a co si daval ako primary key v zamul ?

veteran

Quote from: xxx3 on  15.04.2012, 17:10:46
ok, diky ... som si to zle pozrel v tej hr scheme ... a co si daval ako primary key v zamul ?
Všetky stĺpce od zloženého PK.

xxx3

aj hodiny ?

veteran

Quote from: xxx3 on  15.04.2012, 17:20:18
aj hodiny ?
Tam je to také divné...

Primárny kľúč by mala mať každá tabuľka. Ak by sme dali do PK len idz a idul, dosiahli by sme tým to, že daný zamestnanec by už druhýkrát nemohol vykonať tú istú úlohu. Ak dáme do zloženého PK aj hodiny, bude to "menej škodlivé", lebo tým vylúčime "len" to, že daný zamestnanec nebude môcť vykonávať opakovane tú istú úlohu za ten istý odpracovaný čas.

Najideálnejší by tam bol ďalší stĺpec (nejaké idzamul), ktorý by bol jediným PK v tabuľke. Taký stĺpec ale v schéme nie je, takže by sa nemal vytvárať.

razer08

no to aby akceptoval len taky date format to sa neda v oracle...lebo oracle ma fixny format a len pri inserte sa da formatovat...alebo cez alter session set nls_date_format='tu zapises date format';...inak sa neda

xxx3

ako spravit toto?

6. Zistite priemerný základný plat manažérov. (11800)


veteran

Quote from: xxx3 on  21.04.2012, 23:53:17
ako spravit toto?

6. Zistite priemerný základný plat manažérov. (11800)
Vypíšeš AVG salary tých zamestnancov, ktorých employee_id sa nachádza v subqery (select manager_id from hr.employees).

xxx3


xxx3

a s dalsou ulohou mi nevies helpnut?

skusal som toto:
select department_name, min(salary)
from hr.employees join hr.departments using (department_id)
where min(salary) >= (select min(salary) from hr.employees where department_id=80 ) group by department_name;


ale pise mi chybu pri tom where min(salary), ze nie je tam povolena ta dunkcia ... a ked ju tam nedam tak mam iny vysledok