Как объединить таблицы в sql
Перейти к содержимому

Как объединить таблицы в sql

  • автор:

Команда UNION

Команда UNION объединяет данные из нескольких таблиц в одну при выборке. При объединении количество столбцов во всех таблицах должно совпадать, иначе будет ошибка Имена столбцов будут такие же, как в основной таблице, в которую добавляются данные из других таблиц.

Внимание: если не используется ключевое слово ALL для UNION, все возвращенные строки будут уникальными, так как по умолчанию подразумевается DISTINCT , который удаляет неуникальные значения. Чтобы отменить такое поведение — нужно указать ключевое слово ALL , вот так: UNION ALL.

Синтаксис

С удалением дублей:

SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие

Без удаления дублей:

SELECT * FROM имя_таблицы1 WHERE условие UNION ALL SELECT * FROM имя_таблицы2 WHERE условие

Можно объединять не две таблицы, а три или более:

SELECT * FROM имя_таблицы1 WHERE условие UNION SELECT * FROM имя_таблицы2 WHERE условие UNION SELECT * FROM имя_таблицы3 WHERE условие UNION SELECT * FROM имя_таблицы4 WHERE условие

Таблицы для примеров

таблица countries

id
айди
name
название
1 Беларусь
2 Россия
3 Украина
таблица cities

id
айди
name
название
country_id
айди страны
1 Минск 1
2 Минск 1
3 Москва 2
4 Киев 3

Пример

В данном примере объединяются записи из двух таблиц:

SELECT id, name FROM countries UNION ALL SELECT id, name FROM cities

Результат выполнения кода:

id
айди
name
название
1 Беларусь
2 Россия
3 Украина
1 Минск
2 Минск
3 Москва
4 Киев

Пример

В данном примере отсутствует ключевое слово ALL, однако дубли не будут удалены, так как дублями считается полное совпадение строк:

SELECT id, name FROM countries UNION SELECT id, name FROM cities

Результат выполнения кода:

id
айди
name
название
1 Беларусь
2 Россия
3 Украина
1 Минск
2 Минск
3 Москва
4 Киев

Пример

А вот теперь дубли будут удалены (из двух Минсков останется один), так как будет иметь место полное совпадение строк (потому что поле осталось одно, но это не обязательно):

SELECT name FROM countries UNION SELECT name FROM cities

Результат выполнения кода:

name
название
Беларусь
Россия
Украина
Минск
Москва
Киев

Пример

А теперь добавим слово ALL — и дубли не будут удалятся:

SELECT name FROM countries UNION ALL SELECT name FROM cities

Результат выполнения кода:

name
название
Беларусь
Россия
Украина
Минск
Минск
Москва
Киев

Пример

В данном примере демонстрируется работа условий WHERE в комбинации с UNION:

SELECT id, name FROM countries WHERE id>=2 UNION SELECT id, name FROM cities WHERE id<=2

Результат выполнения кода:

id
айди
name
имя
2 Россия
3 Украина
1 Минск
2 Минск

Пример

Имена колонок берутся из первой таблицы (то есть имена колонок таблиц, подключенных через UNION нигде себя не проявят):

SELECT id as country_id, name as country_name FROM countries UNION SELECT id, name FROM cities

Результат выполнения кода:

country_id
айди
country_name
имя
1 Беларусь
2 Россия
3 Украина
1 Минск 1
2 Минск 1
3 Москва 2
4 Киев 3

Пример

Такой запрос выдаст ошибку, так как в таблицах не совпадает количество колонок:

SELECT id, name FROM countries UNION SELECT id, name, country_id FROM cities

И такой запрос тоже выдаст ошибку в нашем случае — количество колонок в обеих таблицах не совпадает:

SELECT * FROM countries UNION SELECT * FROM cities

Пример

Если нам очень надо забрать из какой-либо таблицы столько полей, что в другой таблице столько и нет, можно создавать дополнительные поля вручную.

К примеру, мы хотим забрать 3 поля из второй таблицы, а в первой таблице полей только 2 . Решим эту проблему создав поле с именем country_id и содержимым 0 для первой таблицы (вот так: 0 as country_id):

SELECT id, name, 0 as country_id FROM countries UNION SELECT id, name, country_id FROM cities

Результат выполнения кода:

id
айди
name
имя
country_id
айди страны
1 Беларусь 0
2 Россия 0
3 Украина 0
1 Минск 1
2 Минск 1
3 Москва 2
4 Киев 3

Смотрите также

  • команду JOIN ,
    которая объединяет связанные таблицы

Как соединить 3 таблицы в sql

Чтобы соединить три таблицы в SQL, вы можете использовать оператор JOIN . Оператор JOIN объединяет две таблицы на основе общих столбцов, а при необходимости вы можете объединить несколько таблиц.

Для объединения трех таблиц вам нужно выполнить три операции JOIN . Рассмотрим пример:

SELECT t1.column1, t2.column2, t3.column3 FROM table1 t1 JOIN table2 t2 ON t1.column1 = t2.column1 JOIN table3 t3 ON t2.column2 = t3.column2; 

Здесь мы объединяем три таблицы: table1, table2 и table3. Мы выбираем определенные столбцы из каждой таблицы, а затем используем оператор JOIN для объединения таблицы table1 и table2, а затем таблицы table2 и table3.

Обратите внимание, что для успешного объединения таблиц необходимо наличие общих столбцов в этих таблицах. Кроме того, если таблицы содержат дублирующиеся строки, то результатом объединения могут быть дублирующиеся строки. Чтобы исключить дубли, можно использовать оператор DISTINCT .

Объединение таблиц – UNION

Операция UNION позволяет объединить несколько результатов выборки в один набор строк. Именно объединение строк отличает эту операцию от соединения таблиц через JOIN, которая присоединяет столбцы.

Рассмотрим пример.
Сначала придумаем две таблицы: с участниками забега; с работниками забега.

Имя_участника Место
Светлана 2
Алексей 4
Александр 1
Екатерина 5
Илья 3
Имя_работника Функция
Петр Менеджер
Иван Промоутер
Екатерина Врач
Кирилл Человек с водичкой

Теперь получим из таблиц уникальные имена всех людей.

--Сформируем первый набор из таблицы участников select Имя_участника as Имя from Участники union --Сформируем второй набор из таблицы работников select Имя_работника from Работники
Имя
Александр
Алексей
Екатерина
Иван
Илья
Кирилл
Петр
Светлана

Важно знать про UNION

Самый первый SELECT задает названия столбцам итоговой выборки.

Обратите внимание на то, что в вышеприведенном примере для уникальности имен не потребовалось использовать ключевое слово DISTINCT, т.к. операция UNION уникализирует строки после их объединения.
Если нужно получить все записи, в том числе одинаковые, то нужно использовать операцию UNION ALL вместо просто UNION.

Можно объединять более 2 наборов строк – просто продолжать писать «UNION SELECT …».

Количество столбцов должны совпадать во всех объединяемых наборах.
Типы данных для объединяемых столбцов должны совпадать или хотя бы иметь возможность неявно преобразовываться друг к другу. Например:

  • для набора №1 первый столбец имеет строковый тип VARCHAR, второй столбец числовой тип FLOAT;
  • для набора №2 первый столбец – VARCHAR, второй столбец – числовой тип INT.

Несмотря на то, что второй столбец для разных наборов отличается по типу данных, запрос все равно выполнится, т.к. INT будет преобразован к FLOAT.

Если требуется сделать сортировку полученной выборки, то предложение ORDER BY записывается в самом последнем селекте.

select col1, col2, col3 from Table1 union all select col1, col2, col3 from Table2 union all select col1, col2, col3 from Table3 order by col1 -- Сортируем весь результат
  • Объединение таблиц – UNION
  • Соединение таблиц – операция JOIN и ее виды
  • Тест на знание основ SQL

Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы я мог развивать его дальше.

Соединение двух таблиц

SQL имел бы очень маленькое практическое применение, если бы позволял получать данные только из одной таблицы.

При проектировании структуры данных стараются исключать дублирование данных (см нормальные формы).

Посмотрим на таблицу городов ( city )

SELECT * FROM city 
city_id name timezone_id
1 Москва 2
2 Санкт-Петербург 2
3 Новосибирск 5
. . .

В ней нет никакой информации o часовом поясе, только его идентификатор. Чтобы получить информацию о часовом поясе, нужно соединить таблицу городов ( city ) с таблицей часовых поясов ( timezone ) по идентификатору ( timezone_id ), т.е. для каждой записи из таблицы городов нужно получить ровно одну запись из таблицы часовых поясов с соответствующим идентификатором.

Рассмотрим запрос соединения таблиц городов и часовых поясов:

SELECT * FROM city JOIN timezone ON timezone.timezone_id = city.timezone_id 
city_id name timezone_id timezone_id time_offset
1 Москва 2 2 UTC+3
2 Санкт-Петербург 2 2 UTC+3
3 Новосибирск 5 5 UTC+6
. . . . .
SELECT * -- выбрать все поля FROM city -- из таблицы city JOIN timezone -- присоединить таблицу timezone ON timezone.timezone_id = city.timezone_id -- для каждой записи из city сопоставить запись -- из timezone с совпадающим timezone_id 

Обрати внимание на столбцы полученного результата, состоящего из 5 столбцов

  1. city_id — идентификатор города из таблицы city ;
  2. name — название города из таблицы city ;
  3. timezone_id — идентификатор часового пояса из таблицы city ;
  4. timezone_id — идентификатор часового пояса из таблицы timezone ;
  5. time_offset — время относительно UTC из таблицы timezone .

Столбец timezone_id встретился дважды в результате, потому что он есть в каждой из таблиц.

Синтаксис соединения таблиц:

SELECT список_полей FROM таблица1 JOIN таблица2 ON условия_присоединения_таблицы2 JOIN таблица3 ON условия_присоединения_таблицы3 . 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *