Database
 sql >> база данни >  >> RDS >> Database

SQL UNION Клауза за начинаещи

В SQL, UNION клаузата обединява резултатите от две заявки в един набор от резултати.

Можете да използвате UNION клауза със или без ALL аргумент:

  • UNION ALL – Включва дубликати.
  • UNION – Изключва дубликати.

По-долу са дадени няколко основни примера, за да демонстрирате как работи.

Примерни таблици

Да предположим, че имаме две таблици:Cats и Dogs

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
| 1002    | Fetch     |
+---------+-----------+

Можем да използваме SELECT изявление с UNION клауза за комбиниране на резултатите от двете таблици в един набор от резултати.

Пример за използване на UNION ALL

Първо, нека използваме UNION ALL така че да включва дубликати.

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Резултат:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

В този случай се връщат седем реда. Можем да видим, че „Извличане“ се връща два пъти. Това е така, защото има две кучета на име Fetch.

Има също котка и куче със същото име:Fluffy.

Имайте предвид, че използвах псевдоним на колона за именуване на полето, върнато от операцията. Ако не бях направил това, резултатът щеше да използва имената на колоните от първата заявка. В този случай заглавката на колоната щеше да се нарича DogName вместо PetName .

SELECT DogName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;

Резултат:

+-----------+
| DogName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fetch     |
| Meow      |
| Fluffy    |
| Scratch   |
+-----------+
(7 rows affected)

Това може да е приемливо или не, в зависимост от данните, които връщате в заявката си. В нашия случай не е подходящо, защото не всички резултати са кучета.

Пример за използване на UNION

Нека видим какво се случва, когато премахнем ALL аргумент.

SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;

Резултат:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Meow      |
| Scratch   |
| Wag       |
+-----------+
(5 rows affected)

Този път се връщат само пет реда. И двата дубликата се премахват.

UNION срещу DISTINCT

Имайте предвид, че това е различно от прилагането на DISTINCT за всеки отделен SELECT изявление. Ако бяхме направили това, Fluffy щеше да бъде върнат два пъти, защото ALL ще се прилага само за SELECT изявление, срещу което се прилага (не към конкатенираните резултати).

Ето един пример, който да илюстрира какво имам предвид.

SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;

Резултат:

+-----------+
| PetName   |
|-----------|
| Fetch     |
| Fluffy    |
| Wag       |
| Fluffy    |
| Meow      |
| Scratch   |
+-----------+
(6 rows affected)

Всички заявки трябва да връщат един и същ брой колони

Когато използвате UNION клауза, всяка заявка трябва да има еднакъв брой колони и те трябва да са в същия ред.

Ако не, ще получите грешка.

SELECT CatName FROM Cats
UNION ALL
SELECT DogId, DogName FROM Dogs;

Резултат:

Msg 205, Level 16, State 1, Line 1
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

Това е грешката, която SQL Server връща при използване на неравен брой колони. Тази конкретна грешка показва, че същото ограничение важи и за INTERSECT и EXCEPT оператори. Съобщението за грешка, което получавате, може да е различно в зависимост от вашата СУБД.

Типовете данни трябва да са съвместими

Освен че изискват същия брой колони, тези колони трябва да имат съвместим тип данни.

Не е задължително те да са от същия тип данни, но ще трябва да са съвместими. Тоест те трябва да са съвместими чрез имплицитно преобразуване. Ако типовете данни не съвпадат, СУБД трябва да може да извърши имплицитно преобразуване, така че да съвпадат.

Ако не, ще получите грешка.

SELECT CatName FROM Cats
UNION ALL
SELECT DogId FROM Dogs;

Резултат:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Meow' to data type int.

Поръчване на резултатите

Ако искате да сортирате резултатите с ORDER BY клауза, ще трябва да го поставите в последната заявка. Не можете да поставите отделен ORDER BY клауза за всяка заявка или в този смисъл всяка заявка, която не е последната.

Ето грешката, която получавам, когато се опитвам да направя това в SQL Server:

SELECT DogName AS PetName
FROM Dogs
ORDER BY DogName
UNION ALL
SELECT CatName
FROM Cats;

Резултат:

Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'UNION'.

Следователно, ако искаме да поръчаме резултатите, ще трябва да направим нещо подобно:

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
ORDER BY PetName;

Прилагане на UNION към Повече от две заявки

Предишните примери комбинираха резултати от две различни заявки, но няма нищо, което да ви спре да добавите още. Можете да го използвате, за да комбинирате резултатите от много заявки, ако е необходимо.

Например, ако имахме и Birds таблица, можем да направим това:

SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats
UNION ALL
SELECT BirdName
FROM Birds;

Нормализация

Примерите на тази страница поставят котки и кучета в две отделни таблици. Причината да направя това е, защото това е ясен и кратък начин да илюстрирам как UNION работи.

На практика може да ги имате в същата таблица, наречена, да речем Pets , след което има отделен PetTypes таблица (или подобна). Това е известно като нормализиране и е начинът, по който обикновено се проектират релационни бази данни.

След това можете да изпълните обединяване на тези таблици, за да върнете данни според изискванията.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въпроси за интервю за инженер по данни с Python

  2. Как да не се показват дубликати в SQL

  3. Защо използването на модулни тестове е страхотна инвестиция във висококачествена архитектура

  4. ScaleGrid вече е наличен в региона на Сидни AWS

  5. SQL СЪЗДАВАНЕ НА ТАБЛИЦА... КАТО Инструкция SELECT