Объединение используется для объединения записей из более чем одной таблицы. Таблицы объединяются на основе общих столбцов / значений из этих таблиц.
Существуют разные типы соединений.
- Внутреннее соединение
- Левое внешнее соединение
- Правое внешнее соединение
- Полное внешнее соединение
- Самостоятельное присоединение
- Перекрестное соединение
- Декартово-Производственное Объединение
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Внутреннее объединение объединяет записи из нескольких таблиц и возвращает значения, которые существуют в обеих таблицах.
Синтаксис
Ниже приводится синтаксис оператора INNER JOIN.
SELECT col1, col2, col3…. FROM Table-1 INNER JOIN Table-2 ON (col1 = col2) <WHERE condition>;
пример
Рассмотрим следующую таблицу сотрудников и таблицу зарплат.
Сотрудник № | Имя | Фамилия | JoinedDate | DepartmentNo | Дата рождения |
---|---|---|---|---|---|
101 | Майк | Джеймс | 3/27/2005 | 1 | 1/5/1980 |
102 | Роберт | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Питер | Павел | 3/21/2007 | 2 | 4/1/1983 |
104 | Alex | Стюарт | 2/1/2008 | 2 | 11/6/1984 |
105 | Роберт | Джеймс | 1/4/2008 | 3 | 12/1/1984 |
Сотрудник № | Валовой | дедукция | NetPay |
---|---|---|---|
101 | 40000 | 4000 | 36000 |
102 | 80000 | 6000 | 74000 |
103 | 90000 | 7000 | 83000 |
104 | 75000 | 5000 | 70000 |
Следующий запрос объединяет таблицу Employee и таблицу Salary в общем столбце EmployeeNo. Каждой таблице присваивается псевдоним A и B, а столбцы имеют правильный псевдоним.
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay FROM Employee A INNER JOIN Salary B ON (A.EmployeeNo = B. EmployeeNo);
Когда вышеуказанный запрос выполняется, он возвращает следующие записи. Сотрудник 105 не включен в результат, поскольку у него нет соответствующих записей в таблице зарплаты.
*** Query completed. 4 rows found. 3 columns returned. *** Total elapsed time was 1 second. EmployeeNo DepartmentNo NetPay ----------- ------------ ----------- 101 1 36000 102 2 74000 103 2 83000 104 2 70000
НАРУЖНОЕ СОЕДИНЕНИЕ
LEFT OUTER JOIN и RIGHT OUTER JOIN также объединяют результаты из нескольких таблиц.
-
LEFT OUTER JOIN возвращает все записи из левой таблицы и возвращает только совпадающие записи из правой таблицы.
-
RIGHT OUTER JOIN возвращает все записи из правой таблицы и возвращает только совпадающие строки из левой таблицы.
-
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ объединяет результаты как ЛЕВЫХ ВНЕШНИХ, так и ПРАВИЛЬНЫХ ВНЕШНИХ СОЕДИНЕНИЙ. Он возвращает как совпадающие, так и не совпадающие строки из соединенных таблиц.
LEFT OUTER JOIN возвращает все записи из левой таблицы и возвращает только совпадающие записи из правой таблицы.
RIGHT OUTER JOIN возвращает все записи из правой таблицы и возвращает только совпадающие строки из левой таблицы.
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ объединяет результаты как ЛЕВЫХ ВНЕШНИХ, так и ПРАВИЛЬНЫХ ВНЕШНИХ СОЕДИНЕНИЙ. Он возвращает как совпадающие, так и не совпадающие строки из соединенных таблиц.
Синтаксис
Ниже приводится синтаксис оператора OUTER JOIN. Вам необходимо использовать один из вариантов: ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ или ПОЛНОЕ НАРУЖНОЕ СОЕДИНЕНИЕ.
SELECT col1, col2, col3…. FROM Table-1 LEFT OUTER JOIN/RIGHT OUTER JOIN/FULL OUTER JOIN Table-2 ON (col1 = col2) <WHERE condition>;
пример
Рассмотрим следующий пример запроса LEFT OUTER JOIN. Он возвращает все записи из таблицы Employee и соответствующие записи из таблицы Salary.
SELECT A.EmployeeNo, A.DepartmentNo, B.NetPay FROM Employee A LEFT OUTER JOIN Salary B ON (A.EmployeeNo = B. EmployeeNo) ORDER BY A.EmployeeNo;
Когда вышеуказанный запрос выполняется, он производит следующий вывод. Для сотрудника 105 значение NetPay равно NULL, поскольку в таблице зарплат нет соответствующих записей.
*** Query completed. 5 rows found. 3 columns returned. *** Total elapsed time was 1 second. EmployeeNo DepartmentNo NetPay ----------- ------------ ----------- 101 1 36000 102 2 74000 103 2 83000 104 2 70000 105 3 ?
CROSS JOIN
Перекрестное соединение соединяет каждую строку из левой таблицы с каждой строкой из правой таблицы.
Синтаксис
Ниже приведен синтаксис оператора CROSS JOIN.
SELECT A.EmployeeNo, A.DepartmentNo, B.EmployeeNo,B.NetPay FROM Employee A CROSS JOIN Salary B WHERE A.EmployeeNo = 101 ORDER BY B.EmployeeNo;
Когда вышеуказанный запрос выполняется, он производит следующий вывод. EmployeeNo 101 из таблицы Employee объединяется с каждой записью из таблицы Salary.