Често се налага да обединим резултата от една или повече SELECT заявки в една резултатна таблица.
Това може да стане като използваме заявка за обединение – UNION.
(SELECT a…..) UNION или UNION ALL (SELECT b…..);
Резултатът ще бъде обединението от двата SELECT-а.
Нека да дадем пример:
Искаме да изведем имената на всички ученици и на всички треньори, както и ЕГН-тата им в един общ резултат:
(SELECT name, egn FROM students) UNION (SELECT name, egn FROM coaches);
!!! Важно:
- Броят на колоните в двете заявки трябва да бъде един и същ!
- Не е задължително типът на тези колони да е един и същ!
- За имена на колони на резултатната таблица се взимат имената на колоните от първата заявка!
- В резултата няма да присъстват повтарящи се редове ( работи на принципа на SELECT DISTINCT –резултатите са без повторения).
- Ако желаете да получите всички редове, включително и повтарящите се, може да използвате UNION ALL.
FULL JOIN
Какво ще представлява понятието FULL JOIN? След като вече разбрахте, че вътрешните съединения се делят на LEFT и на RIGHT JOIN и при тях натежава (излиза цялата в резултата) или едната, или другата таблица, не е трудно да се досетите, че с FULL JOIN ще искаме да „натежат“ и двете таблици. Ако просто добавите думата FULL в обикновена заявка с JOIN, това няма да свърши работа, тъй като не е функционално реализиран в MySQL. Ще трябва да го „симулираме“. И така, нека обединим един LEFT и един RIGHT JOIN чрез UNION. Ще използваме познат пример. Искаме всички спортни групи, заедно с имената на треньорите им, независимо дали имат треньори, също така и всички треньори, заедно с групите им, независимо дали имат групи.
Ето какви данни имаме в sportgroups:
Също така и в coaches:
Ето как би изглеждала заявката:
(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);
Резултатът и в двата случая е:
С това условието на задачата е изпълнено.
Даниел Джолев