Проблем:
Искате да покажете данни от дадени колони (от подобен тип данни) от две таблици в SQL.
Пример:
В нашата база данни има две таблици:employee
и customer
.
employee
таблицата съдържа данни в следните колони:id , собствено_име , фамилно_име и възраст .
id | first_name | фамилно_име | възраст |
---|---|---|---|
1 | Том | Милър | 22 |
2 | Джон | Смит | 26 |
3 | Лиза | Уилямс | 30 |
4 | Чарлз | Дейвис | 21 |
5 | Джеймс | Мур | 22 |
customer
таблицата съдържа данни в следните колони:id , собствено_име , фамилно_име и възраст .
id | first_name | фамилно_име | възраст |
---|---|---|---|
1 | Милано | Смит | 45 |
2 | Чарлз | Дейвис | 21 |
3 | Марк | Подкрепител | 19 |
В един набор от резултати нека покажем собственото име, фамилията и възрастта за всички хора в базата данни, както служители, така и клиенти.
Решение 1:
Ще използваме UNION ALL
за обединяване на данни от колони в две таблици.
Ето заявката, която бихте написали:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Ето резултата:
first_name | фамилно_име | възраст |
---|---|---|
Том | Милър | 22 |
Джон | Смит | 26 |
Лиза | Уилямс | 30 |
Чарлз | Дейвис | 21 |
Джеймс | Мур | 28 |
Милано | Смит | 45 |
Чарлз | Дейвис | 21 |
Отметка | Подкрепител | 19 |
Дискусия:
Използвайте клаузата UNION ALL, за да обедините данни от колони в две или повече таблици. В нашия пример ние обединяваме данни от employee
и customer
маси. Отляво на ключовата дума UNION ALL поставете първия оператор SELECT, за да получите данни от първата таблица (в нашия пример таблицата employee
). Вдясно използвайте друг оператор SELECT, за да получите данни от втората таблица (в нашия пример, customer
).
Не забравяйте, че избраните данни в двете таблици трябва да са от един и същ тип данни във всяка колона. Например, ако първата колона в първия SELECT е низов тип данни, първата колона във втория SELECT трябва също да бъде низов тип данни. Ако втората колона в първия израз SELECT е цяло число, втората колона във втората таблица също трябва да е от целочислен тип.
В първата заявка избрахме възраст (възрастта на служителя, която е целочислен тип данни) за третата колона. Следователно, третата колона във втория SELECT също е целочислена стойност; това е възрастта на клиента.
Вторите колони и в двата оператора SELECT са от същия тип данни. Ако обаче стойностите са еднакви и в двете таблици, те ще бъдат показани няколко пъти; например „Чарлз Дейвис 21“ се показва два пъти в набора от резултати.
Ами ако не искате няколко еднакви записи в таблицата с резултати? В този случай използвайте UNION
. Това е подобно на UNION ALL
, но премахва дублиращи се записи. Вижте следния пример.
Решение 2:
Ето заявката, която избягва дублиращи се записи:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Ето резултата от горната заявка:
first_name | фамилно_име |
---|---|
Маркиране | Подкрепител |
Джеймс | Мур |
Джон | Смит |
Чарлз | Дейвис |
Милано | Смит |
Том | Милър |
Лиза | Уилямс |
Забележка:
UNION ALL
е по-бърз от UNION
, но UNION
премахва дублиращи се редове. Изборът зависи от данните за резултата, от които се нуждаем.