Имплицитно спајање¶
Још један начин да се две или више табела споје је тзв. имплицитно
спајање. Наиме, ако се након FROM наведе више табела раздвојених
зарезима, израчунава се њихов Декартов производ. У случају две
табеле то значи да се свака врста прве табеле комбинује са сваком врстом
друге табеле. У случају више табела би се свака таква врста комбиновала
са сваком врстом наредне табеле итд.
Можемо, на пример, да пишемо:
SELECT *
FROM izostanak, ucenik;
Извршавањем упита добија се следећи резултат:
id |
id_ucenik |
datum |
cas |
status |
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|---|---|---|---|---|
1 |
1 |
2021-05-14 |
1 |
оправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
1 |
1 |
2021-05-14 |
1 |
оправдан |
2 |
Милица |
Јовановић |
ж |
2006-04-03 |
1 |
1 |
1 |
1 |
2021-05-14 |
1 |
оправдан |
3 |
Лидија |
Петровић |
ж |
2006-12-14 |
1 |
1 |
1 |
1 |
2021-05-14 |
1 |
оправдан |
4 |
Петар |
Миловановић |
м |
2005-12-08 |
2 |
1 |
1 |
1 |
2021-05-14 |
1 |
оправдан |
5 |
Ана |
Пекић |
ж |
2005-02-23 |
2 |
1 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
Од свих ових врста, за нас имају смисла само оне у којима је
идентификатор ученика из табеле изостанака једнак идентификатору из
табеле ученика и њих можемо издвојити клаузулом WHERE.
SELECT *
FROM izostanak i, ucenik u
WHERE i.id_ucenik = u.id;
Извршавањем упита добија се следећи резултат:
id |
id_ucenik |
datum |
cas |
status |
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|---|---|---|---|---|
1 |
1 |
2021-05-14 |
1 |
оправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
2 |
1 |
2021-05-14 |
2 |
неоправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
3 |
4 |
2021-05-14 |
1 |
нерегулисан |
4 |
Петар |
Миловановић |
м |
2005-12-08 |
2 |
1 |
4 |
4 |
2021-05-14 |
2 |
нерегулисан |
4 |
Петар |
Миловановић |
м |
2005-12-08 |
2 |
1 |
5 |
6 |
2021-06-01 |
1 |
неоправдан |
6 |
Јован |
Миленковић |
м |
2006-04-07 |
1 |
2 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
Наравно, у клаузули WHERE може да се наведе и додатан услов, на пример такав
да се додатно ограничимо само на жељени датум.
SELECT *
FROM izostanak i, ucenik u
WHERE i.id_ucenik = u.id AND datum = '2021-05-14';
Извршавањем упита добија се следећи резултат:
id |
id_ucenik |
datum |
cas |
status |
id |
ime |
prezime |
pol |
datum_rodjenja |
razred |
odeljenje |
|---|---|---|---|---|---|---|---|---|---|---|---|
1 |
1 |
2021-05-14 |
1 |
оправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
2 |
1 |
2021-05-14 |
2 |
неоправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
3 |
4 |
2021-05-14 |
1 |
нерегулисан |
4 |
Петар |
Миловановић |
м |
2005-12-08 |
2 |
1 |
4 |
4 |
2021-05-14 |
2 |
нерегулисан |
4 |
Петар |
Миловановић |
м |
2005-12-08 |
2 |
1 |
6 |
1 |
2021-05-14 |
3 |
оправдан |
1 |
Петар |
Петровић |
м |
2006-07-01 |
1 |
1 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
Ипак, експлицитно спајање (помоћу JOIN) је пожељније користити
од имплицитног. Упити који користе експлицитно спајање издвајају
услов за спајање у посебну целину па се лакше разумеју, а на неким
системима за управање базама података могу да буду и ефикаснији.
Вежба¶
Покушај да наредни упит напишеш самостално.
Приказати све регулисане изостанке у читљивом формату (у ком се види име и презиме ученика и датум, час и статус изостанка), али тако да упит користи имплицитно, а не експлицитно спајање.