UNION, FULL JOIN

Често се налага да обединим резултата от една или повече SELECT заявки в една резултатна таблица.

Това може да стане като използваме заявка за обединение – UNION.

 (SELECT a…..) 
UNION или UNION ALL
(SELECT b…..);

Резултатът ще бъде обединението от двата SELECT-а.

Нека да дадем пример:

Искаме да изведем имената на всички ученици и на всички треньори, както и ЕГН-тата им в един общ резултат:

(SELECT name, egn
FROM students)
UNION
(SELECT name, egn
FROM coaches);

Резултатът е:
1

!!! Важно:

  • Броят на колоните в двете заявки трябва да бъде един и същ!
  • Не е задължително типът на тези колони да е един и същ!
  • За имена на колони на резултатната таблица се взимат имената на колоните от първата заявка!
  • В резултата няма да присъстват повтарящи се редове ( работи на принципа на SELECT DISTINCT –резултатите са без повторения).
  • Ако желаете да получите всички редове, включително и повтарящите се, може да използвате UNION ALL.

FULL JOIN

Какво ще представлява понятието FULL JOIN? След като вече разбрахте, че вътрешните съединения се делят на LEFT и на RIGHT JOIN и при тях натежава (излиза цялата в резултата) или едната, или другата таблица, не е трудно да се досетите, че с FULL JOIN  ще искаме да „натежат“ и двете таблици. Ако просто добавите думата FULL в обикновена заявка с JOIN, това няма да свърши работа, тъй като не е функционално реализиран в MySQL. Ще трябва да го „симулираме“. И така, нека обединим един LEFT и един RIGHT JOIN чрез UNION. Ще използваме познат пример. Искаме всички спортни групи, заедно с имената на треньорите им, независимо дали имат треньори, също така и всички треньори, заедно с групите им, независимо дали имат групи.

Ето какви данни имаме в sportgroups:

2

Също така и в coaches:

3

Ето как би изглеждала заявката:

(SELECT sportgroups.location,
sportgroups.dayOfWeek,
sportgroups.hourOfTraining,
sportgroups.sport_id,
coaches.name
FROM sportgroups LEFT OUTER JOIN coaches
ON sportgroups.coach_id = coaches.id)
UNION 
(SELECT sportgroups.location,
sportgroups.dayOfWeek,
sportgroups.hourOfTraining,
sportgroups.sport_id,
coaches.name
FROM sportgroups RIGHT JOIN coaches
ON sportgroups.coach_id = coaches.id);

Ако решим, може да го направим и с UNION ALL, но тогава ще трябва втората заявка да добавя в резултата само такива записи, при които sportgroups.coach_id е NULL:

(SELECT sportgroups.location,
sportgroups.dayOfWeek,
sportgroups.hourOfTraining,
sportgroups.sport_id,
coaches.name
FROM sportgroups LEFT OUTER JOIN coaches
ON sportgroups.coach_id = coaches.id)
UNION ALL
(SELECT sportgroups.location,
sportgroups.dayOfWeek,
sportgroups.hourOfTraining,
sportgroups.sport_id,
coaches.name
FROM sportgroups RIGHT JOIN coaches
ON sportgroups.coach_id = coaches.id
WHERE sportgroups.coach_id  is NULL);

Резултатът и в двата случая е:

4

С това условието на задачата е изпълнено.

Даниел Джолев

Leave a Reply

Your email address will not be published. Required fields are marked *