SQL операторы JOIN, UNION, INTERSECT и EXCEPT
Содержание
- Естественное соединение
- Декартово произведение (перекрестное соединение)
- Внешнее соединение
- Тета-соединение
- Самосоединение
- Полусоединение
- Оператор UNION
Соединение таблиц в запросе SELECT выполняется с помощью оператора JOIN.
Возможно также выполнить соединение и без оператора JOIN с помощью инструкции WHERE используя столбцы соединения, но этот синтаксис считается неявным и устаревшим.
Выделяют следующие виды соединения, каждому из которых соответствует своя форма оператора JOIN:
- CROSS JOIN — перекрестное или декартово соединение
- [INNER] JOIN — естественное или внутреннее соединение
- LEFT [OUTER] JOIN — левое внешнее соединение
- RIGHT [OUTER] JOIN — правое внешнее соединение
- FULL [OUTER] JOIN — полное внешнее соединение
Существует также тета-соединение, самосоединение и полусоединение.
Естественное соединение
Естественное соединение — внутреннее соединение или соединение по эквивалентности.
Transact-SQL
SELECT employee.*, department.* FROM employee INNER JOIN department ON employee.dept_no = department.dept_no;
SELECT employee.*, department.* FROM employee INNER JOIN department ON employee.dept_no = department.dept_no; |
Здесь предложение FROM определяет соединяемые таблицы и в нем явно указывается тип соединения — INNER JOIN. Предложение ON является частью предложения FROM и указывает соединяемые столбцы. Выражение employee.dept_no = department.dept_no определяет условие соединения.
Эквивалентный запрос с применением неявного синтаксиса:
Transact-SQL
SELECT employee.*, department.* FROM employee, department WHERE employee.dept_no = department.dept_no;
SELECT employee. *, department.* FROM employee, department WHERE employee.dept_no = department.dept_no; |
Соединяемые столбцы должны иметь идентичную семантику, т.е. оба столбца должны иметь одинаковое логическое значение. Соединяемые столбцы не обязательно должны иметь одинаковое имя (или даже одинаковый тип данных), хотя часто так и бывает.
Соединяются только строки имеющие одинаковое значение в соединяемых столбцах. Строки, не имеющие таких одинаковых значений в результирующий набор вообще не попадут.
В инструкции SELECT объединить можно до 64 таблиц (ограничение MS SQL), при этом один оператор JOIN соединяет только две таблицы:
Transact-SQL
SELECT emp_fname, emp_lname FROM works_on JOIN employee ON works_on.emp_no=employee.emp_no JOIN department ON employee.dept_no=department.dept_no
SELECT emp_fname, emp_lname FROM works_on JOIN employee ON works_on. emp_no=employee.emp_no JOIN department ON employee.dept_no=department.dept_no |
Декартово произведение (перекрестное соединение)
Декартово произведение (перекрестное соединение) соединяет каждую строку первой таблицы с каждой строкой второй. Результатом декартово произведения первой таблицы с n строками и второй таблицы с m строками будет таблица с n × m строками.
Transact-SQL
SELECT employee.*, department.* FROM employee CROSS JOIN department;
SELECT employee.*, department.* FROM employee CROSS JOIN department; |
Внешнее соединение
Внешнее соединение позволяет в отличие от внутреннего извлечь не только строки с одинаковыми значениями соединяемых столбцов, но и строки без совпадений из одной или обеих таблиц.
Выделяют три вида внешних соединений:
- левое внешнее соединение — в результирующий набор попадают все строки из таблицы с левой стороны оператора сравнения (независимо от того имеются ли совпадающие строки с правой стороны), а из таблицы с правой стороны — только строки с совпадающими значениями столбцов. При этом если для строки из левой таблицы нет соответствий в правой таблице, значениям строки в правой таблице будут присвоены NULL
Transact-SQL
SELECT employee_enh.*, department.location FROM employee_enh LEFT OUTER JOIN department ON domicile = location;
SELECT employee_enh.*, department.location
FROM employee_enh LEFT OUTER JOIN department
ON domicile = location;
- правое внешнее соединение — аналогично левому внешнему соединению, но таблицы меняются местами
Transact-SQL
SELECT employee_enh.domicile, department.* FROM employee_enh RIGHT OUTER JOIN department ON domicile =location;
SELECT employee_enh.domicile, department.*
FROM employee_enh RIGHT OUTER JOIN department
ON domicile =location;
- полное внешнее соединение — композиция левого и правого внешнего соединения: результирующий набор состоит из всех строк обеих таблиц. Если для строки одной из таблиц нет соответствующей строки в другой таблице, всем ячейкам строки второй таблицы присваивается значение NULL.
Тета-соединение
Условие сравнения столбцов соединения не обязательно должно быть равенством, но может быть любым другим сравнением. Соединение, в котором используется общее условие сравнения столбцов соединения, называется тета-соединением:
Transact-SQL
SELECT emp_fname, emp_lname, domicile, location FROM employee_enh JOIN department ON domicile < location;
SELECT emp_fname, emp_lname, domicile, location FROM employee_enh JOIN department ON domicile < location; |
Самосоединение
Самосоединение — это естественное соединение таблицы с самой собой. При этом один столбец таблицы сравнивается сам с собой. Сравнивание столбца с самим собой означает, что в предложении FROM инструкции SELECT имя таблицы употребляется дважды. Поэтому необходимо иметь возможность ссылаться на имя одной и той же таблицы дважды. Это можно осуществить, используя, по крайней мере, один псевдоним. То же самое относится и к именам столбцов в условии соединения в инструкции SELECT. Для того чтобы различить столбцы с одинаковыми именами, необходимо использовать уточненные имена.
Полусоединение
Полусоединение похоже на естественное соединение, но возвращает только набор всех строк из одной таблицы, для которой в другой таблице есть одно или несколько совпадений.
Оператор UNION
Оператор UNION объединяет результаты двух или более запросов в один результирующий набор, в который входят все строки, принадлежащие всем запросам в объединении:
Transact-SQL
select_1 UNION [ALL] select_2 {[UNION [ALL] select_3]}…
select_1 UNION [ALL] select_2 {[UNION [ALL] select_3]}… |
Параметры select_1, select_2, … представляют собой инструкции SELECT, которые создают объединение.
Если используется параметр ALL, отображаются все строки, включая дубликаты. По умолчанию дубликаты удаляются.Объединять с помощью инструкции UNION можно только совместимые таблицы. Под совместимыми таблицами имеется в виду, что оба списка столбцов выборки должны содержать одинаковое число столбцов, а соответствующие столбцы должны иметь совместимые типы данных. Результат объединения можно упорядочить, только используя предложение ORDER BY в последней инструкции SELECT. Предложения GROUP BY и HAVING можно применять с отдельными инструкциями SELECT, но не в самом объединении.
Два других оператора для работы с наборами:
- INTERSECT — пересечение — набор строк, которые принадлежат к обеим таблицам
- EXCEPT — разность двух таблиц — все значения, которые принадлежат к первой таблице и не присутствуют во второй
UNION в SQL — CodeChick
Оператор UNION
используется для объединения результатов двух или более запросов SELECT
в один набор результатов. Команда UNION отличается от JOIN-операторов, которые объединяют столбцы из двух таблиц. UNION создает новую таблицу, помещая все строки из двух исходных таблиц в таблицу результатов и располагая эти строки друг над другом.
Далее приведены основные правила объединения наборов результатов двух запросов SELECT
с помощью UNION
:
- Количество и порядок столбцов должны быть одинаковыми во всех запросах.
- Типы данных соответствующих столбцов должны быть совместимы.
Если эти критерии выполняются, то таблицы совместимы с оператором UNION
.
Базовый синтаксис оператора UNION
представлен следующим образом:
SELECT список_столбцов FROM таблица1
UNION SELECT список_столбцов FROM таблица2;
Чтобы лучше понять, как работает оператор UNION
, предположим, что в таблицах employees
и departments
существуют некоторые гипотетические поля first_name
и last_name
. Обратите внимание, что эти поля на самом деле не существуют в демонстрационных таблицах.
Таблица employees | Таблица departments |
+----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Ethan | Hunt | 5000 | | 2 | Tony | Montana | 6500 | | 3 | Sarah | Connor | 8000 | | 4 | Rick | Deckard | 7200 | | 5 | Martin | Blank | 5600 | +----+------------+-----------+--------+ | +----+------------+-----------+----------+ | id | first_name | last_name | city | +----+------------+-----------+----------+ | 1 | Maria | Anders | Berlin | | 2 | Fran | Wilson | Madrid | | 3 | Dominique | Perrier | Paris | | 4 | Martin | Blank | Turin | | 5 | Thomas | Hardy | Portland | +----+------------+-----------+----------+ |
Выполним оператор UNION
, чтобы объединить результаты двух запросов.
Следующая команда вернет имена и фамилии всех клиентов и сотрудников:
SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM customers;
После выполнения приведенной выше команды вы получите такой результат:
+---------------+--------------+ | first_name | last_name | +---------------+--------------+ | Ethan | Hunt | | Tony | Montana | | Sarah | Connor | | Rick | Deckard | | Martin | Blank | | Maria | Anders | | Fran | Wilson | | Dominique | Perrier | | Thomas | Hardy | +---------------+--------------+
Оператор UNION
по умолчанию удаляет дублирующиеся строки из объединенного набора результатов. Вот почему приведенный выше запрос возвращает только 9 строк. Если вы заметили, имя Martin Blank
employees
, и в таблице customers
. Однако если вы хотите оставить дублирующиеся строки, используйте ключевое слово ALL
, как показано ниже:
SELECT first_name, last_name FROM employees
UNION ALL
SELECT first_name, last_name FROM customers;
SQL JOIN (с примерами)
В этом руководстве вы узнаете об операторе SQL JOIN с помощью примеров.
SQL JOIN
объединяет две таблицы на основе общего столбца и выбирает записи, имеющие совпадающие значения в этих столбцах.
Пример
-- объединение таблиц "Клиенты" и "Заказы" -- на основе общих значений их столбцов customer_id ВЫБЕРИТЕ Customers.customer_id, Customers.first_name, Orders.item ОТ клиентов ПРИСОЕДИНЯЙТЕСЬ к заказам ON Customers.customer_id = Orders.customer_id;
Здесь команда SQL объединяет таблицы Customers
и Orders
на основе общих значений в столбцах customer_id
обеих таблиц.
Набор результатов будет состоять из
-
столбцов customer_id
иfirst_name
из таблицыCustomers
-
позиция
столбец из таблицыOrders
Синтаксис SQL JOIN
Синтаксис SQL Оператор JOIN
:
SELECT columns_from_both_tables ИЗ таблицы1 ПРИСОЕДИНЯЙТЕСЬ к таблице2 ON table1.column1 = table2.column2
Здесь
- table1 и table2 — две таблицы, которые должны быть объединены
- столбец 1 — это столбец в table1 , связанный с column2 в table2
Примечание: В SQL существует 4 типа JOIN. Но ВНУТРЕННЕЕ СОЕДИНЕНИЕ
и JOIN
относятся к одному и тому же.
Пример 1: SQL JOIN
-- объединение таблиц Customers и Orders на основе -- customer_id столбца "Клиенты" и столбца "Заказы" ВЫБЕРИТЕ Customers. customer_id, Customers.first_name, Orders.amount ОТ клиентов ПРИСОЕДИНЯЙТЕСЬ к заказам ON Customers.customer_id = Orders.customer;
Вот как работает этот код:
Пример: SQL JOIN Здесь команда SQL выбирает customer_id
и first_name
столбцы (из таблицы Клиенты
) и столбец сумма
(из таблицы Заказы
).
Набор результатов будет содержать те строки, в которых есть совпадение между customer_id
(из таблицы Customers
) и customer
(из таблицы Orders
).
Типы SQL JOIN
Как мы упоминали, команда JOIN
, которую мы выполнили в этой статье, называется INNER JOIN 9.0006 .
В SQL у нас есть четыре основных типа соединений:
- INNER JOIN
- ЛЕВОЕ СОЕДИНЕНИЕ
- ПРАВОЕ СОЕДИНЕНИЕ
- ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
SQL JOIN и псевдонимы
Мы можем использовать псевдонимы AS с именами таблиц, чтобы сделать наш запрос коротким и понятным. Например,
-- используйте псевдоним C для таблицы "Клиенты". -- использовать псевдоним O для таблицы Orders ВЫБЕРИТЕ C.customer_id, C.first_name, O.amount ОТ клиентов AS C ПРИСОЕДИНЯЙТЕСЬ к заказам КАК O ON C.customer_id = O.customer;
Здесь команда SQL объединяет таблицы Customers
и Orders
, присваивая им псевдонимы C и O соответственно.
Кроме того, мы можем временно изменить имена столбцов, используя псевдонимы AS
. Например,
-- используйте псевдоним C для таблицы "Клиенты". -- использовать псевдоним O для таблицы Orders ВЫБЕРИТЕ C.customer_id AS cid, C.first_name AS имя, O.amount ОТ клиентов AS C ПРИСОЕДИНЯЙТЕСЬ к заказам КАК O ON C.customer_id = O.customer;
Помимо предоставления псевдонимов таблицам, приведенная выше команда SQL также назначает псевдонимы столбцам таблицы Customers
:
-
столбец customer_id
имеет псевдонимcid
-
first_name
столбец имеет псевдонимимя
Содержание
Соединения SQL — типы, синтаксис и примеры
В этом руководстве рассматриваются следующие темы:
- Что такое соединения в SQL?
- Синтаксис соединения SQL
- Пример соединения SQL
- Типы соединений SQL
- Внутренние соединения в SQL
- Левые соединения в SQL
- Правые соединения в SQL
- ПОЛНЫЕ соединения в SQL
Повысьте свои навыки SQL сегодня с помощью нашего видео о соединениях SQL. Смотри!
Что такое соединения в SQL?Как следует из самого термина, SQL Joins относится к предложению в SQL, которое используется для объединения строк двух или более таблиц с использованием общих значений. Он учитывает записи из двух или более таблиц в базе данных и объединяет их. SQL Join обычно используется в ситуациях, когда вы хотите получить доступ к одной или нескольким таблицам с помощью оператора select.
Синтаксис соединения SQLСоединение SQL (также называемое INNER JOIN) — наиболее часто используемый метод соединения данных из нескольких таблиц. Синтаксис SQL Join приведен ниже:
Рассмотрим приведенный ниже пример, синтаксис, используемый для объединения данных из этих таблиц, будет следующим:
SELECT Name, City, Marks, Phone_no ОТ Student_detail, Personal_detail ГДЕ Student_details.Name=Personal_detail.Name;Пример соединения SQL:
Теперь давайте разберемся с SQL Join на подробном примере:
Рассмотрим эту таблицу со сведениями об ученике:
Имя | Рулон № | Знаки |
Акшай | 1 | 57 |
Чару | 2 | 68 |
Диша | 3 | 52 |
Ева | 4 | 68 |
Химаншу | 5 | 75 |
Джитеш | 6 | 88 |
Ниже приведена другая таблица с личными данными:
Имя | Город | Номер телефона | Идентификатор электронной почты |
Акшай | Джайпур | 9543846521 | [электронная почта защищена] |
Диша | Бомбей | 8532465892 | [электронная почта защищена] |
Джитеш | Банглор | 9684365125 | [электронная почта защищена] |
Подготовьтесь к работе в отрасли, ответив на эти лучшие вопросы и ответы на собеседовании по SQL!
Теперь, используя следующий синтаксис, две таблицы объединяются в новую таблицу, которая показывает имя учащегося, его/ее город, полученные оценки и номер телефона.
ВЫБЕРИТЕ Имя, Город, Знаки, Телефон_номер ОТ Student_detail, Personal_detail ГДЕ Student_details.Name=Personal_detail.Name;
Результат приведенного выше синтаксиса соединения SQL приведен ниже:
Имя | Город | Знаки | Номер телефона |
Акшай | Джайпур | 57 | 9543846521 |
Диша | Бомбей | 52 | 8532465892 |
Джитеш | Банглор | 88 | 9684365125 |
В SQL доступны различные типы соединений:
- Внутреннее соединение в SQL
- Левое соединение в SQL
- Правое соединение в SQL
- Полное соединение в SQL
Внутренний запрос на соединение SQL возвращает значение, если в обеих таблицах есть совпадения. Внутреннее соединение является наиболее часто используемым методом, когда речь идет о соединении таблиц. Термины «внутреннее соединение» и «соединение SQL» иногда используются как синонимы. Ниже приведен синтаксис для внутреннего соединения. Это также тот же синтаксис, который используется в случае SQL Join.
Синтаксис:SELECT Column_list ИЗ ТАБЛИЦЫ 1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТАБЛИЦА 2 ON Table1.ColName = Table2.ColNameПример:
SELECT student_data.RollNo, student_data.Name, student_data.Address, student_mark.Marks, student_mark.Grade ОТ student_data ВНУТРЕННЕЕ СОЕДИНЕНИЕ student_mark ON student_data.RollNo = student_mark.RollNo;
Левые соединения в SQL:
Левое соединение SQL возвращает все значения левой таблицы и сопоставляет строки из правой таблицы. Теперь, если с правой стороны нет совпадающего значения, левое соединение вернет значение с правой стороны как NULL. В большинстве случаев результат левого соединения почти такой же, как и результат правого соединения, за исключением того, что включаются все строки из левой таблицы.
Синтаксис:SELECT имя_столбца ИЗ таблицы1 ЛЕВОЕ СОЕДИНЕНИЕ таблица2 ON table1.column_name=table2.column_name;Пример:
SELECT Student_details.Name, Address, Roll_no, Email_id ОТ Student_details ВЛЕВО ПРИСОЕДИНЯЙСЯ ON Student_details.Name= Personal_details.Name;
У нас есть идеальный курс профессионального обучения SQL для вас!
Имя | Рулон № | Адрес | Идентификатор электронной почты |
Акшай | 1 | Джайпур | [электронная почта защищена] |
Чару | 2 | НУЛЕВОЙ | НУЛЕВОЙ |
Диша | 3 | Бомбей | [электронная почта защищена] |
Ева | 4 | НУЛЕВОЕ | НУЛЕВОЙ |
Химаншу | 5 | НУЛЕВОЙ | НУЛЕВОЙ |
Джитеш | 6 | Банглор | [электронная почта защищена] |
Узнайте, как освоить соединения SQL для следующего собеседования, в нашем блоге вопросов для собеседования по присоединению к SQL.
Правые соединения в SQL:
Правое соединение SQL Запрос возвращает все строки правой таблицы, даже если в левой таблице нет совпадений. По сути, правое соединение вернет все значения из правой таблицы вместе с соответствующими значениями из левой таблицы. Кроме того, если совпадающее значение не найдено, результатом будет NULL.
Синтаксис:SELECT имя_столбца ИЗ таблицы1 ПРАВОЕ СОЕДИНЕНИЕ таблица2 ON table1.column_name=table2.column_name;Пример:
SELECT Personal_details.Name, Address, Roll_no, Email_id ОТ Student_details ПРИСОЕДИНЯЙТЕСЬ ПРАВО Personal_details
Приходите в сообщество SQL Intellipaat, если у вас есть еще вопросы по SQL!
ON Student_details.Name= Personal_details.Name;
Имя | Адрес | Рулон № | Идентификатор электронной почты |
Акшай | Джайпур | 1 | [электронная почта защищена] |
Диша | Бомбей | 3 | [электронная почта защищена] |
Джитеш | Банглор | 6 | [электронная почта защищена] |
Полное соединение в SQL:
Полное соединение SQL Запрос возвращает все строки из левой и правой таблиц.