Приветствую всех, сегодня поговорим о объединение данных в таблице.
Внутреннее объединение-INNER JOIN
INNER JOIN (внутреннее объединение) — объединение, при котором в запросе все записи из таблицы на левой и правой стороне операции INNER JOIN добавляются в результирующий набор записей, при соответствии условию значений в связанных полях.
Производим выборку всех данных из объеденения таблиц JoinTest1 и JoinTest2 по связующим полям id_jt1 и id_jt2.
1 2 3 4 5 6 |
SELECT * FROM JoinTest2 -- Левая таблица (Таблица JoinTest2) INNER JOIN -- Оператор объединения. JoinTest1 -- Правая таблица(Таблица JoinTest1) ON id_jt1 = id_jt2; -- Условие объединения при котором значения в сравниваемых ячейках должны совпадать. GO |
Левое Внешнее Объединение-LEFT OUTER JOIN
LEFT OUTER JOIN (левое внешнее объединение) — внешнее объединение, при котором в запросе все записи из таблицы на левой стороне операции LEFT JOIN в инструкции SQL добавляются в результирующий набор записей, даже если в таблице на правой стороне отсутствуют совпадающие значения в связанных полях.
Производим выборку всех данных из результирующего набора данных левого внешнего объеденения таблиц JoinTest1 и JoinTest2 по связующим полям id_jt1 и id_jt2.
1 2 3 4 |
SELECT * FROM JoinTest2 -- Левая таблица JoinTest2 LEFT OUTER JOIN JoinTest1 -- LEFT JOIN ON id_jt1=id_jt2; GO |
Правое Внешнее Объединение-RIGHT OUTER JOIN
RIGHT OUTER JOIN (правое внешнее объединение) — внешнее объединение, при котором в запросе все записи из таблицы на правой стороне операции RIGHT JOIN в инструкции SQL добавляются в результирующий набор записей, даже если в таблице на левой стороне отсутствуют совпадающие значения в связанных полях.
Производим выборку всех данных из результирующего набора данных правого внешнего объеденения таблиц JoinTest1 и JoinTest2 по связующим полям id_jt1 и id_jt2.
1 2 3 4 |
SELECT * FROM JoinTest2 RIGHT OUTER JOIN JoinTest1 -- Правая таблица JoinTest2 ON id_jt1 = id_jt2; GO |
Полное Внешнее Объединение-FULL OUTER JOIN
FULL OUTER JOIN (полное объединение) внешнее объединение, при котором в запросе
все записи из таблицы на левой и правой стороне операции FULL JOIN добавляются в
результирующий набор записей, при соответствии условию значений в связанных полях, а
так же:
- значения из правой таблицы, не имеющие соответствий в левой таблице;
- значения из левой таблицы, не имеющие соответствий в правой таблице.
1 2 3 4 5 |
SELECT * FROM JoinTest2 FULL OUTER JOIN JoinTest1 --FULL JOIN ON id_jt1 = id_jt2; GO |
Перекрестное Объединение-CROSS JOIN
CROSS JOIN (перекрестное объединение) — выполняет декартово произведение таблиц, вовлеченных в объединение. В CROSS JOIN не используется конструкция ON
Производим выборку всех данных из результирующего набора данных перекрестного объеденения таблиц JoinTest1 и JoinTest2.
1 2 3 4 |
SELECT * FROM JoinTest1 CROSS JOIN JoinTest2 -- CROSS JOIN -- ON - не используется GO |
UNION
UNION объединяет результаты двух запросов SELECT в единую результирующую таблицу.
Если результаты обоих запросов содержат строки с совпадающими значениями ячеек, то, операция UNION помещает в результирующую таблицу только одну такую строку. Если в результате одного из запросов имеются строки с уникальными значениями, не совпадающими ни с одной из строк результата другого запроса, то эта строка так-же помещается в результирующую таблицу.
Операция UNION требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.
1 2 3 |
SELECT * FROM JoinTest1 UNION SELECT * FROM JoinTest2 |
UNION ALL
UNION ALL объединяет результаты двух запросов SELECT в единую результирующую таблицу.
Если результаты обоих запросов содержат строки с совпадающими значениями ячеек, то, операция UNION ALL помещает в результирующую таблицу все дублирующиеся строки. Если в результате одного из запросов имеются строки с уникальными значениями, не совпадающими ни с одной из строк результата другого запроса, то эта строка так-же помещается в результирующую таблицу.
Операция UNION ALL требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.
1 2 3 |
SELECT * FROM JoinTest1 UNION ALL SELECT * FROM JoinTest2 |
EXCEPT
Операция EXCEPT исключает результаты правого запроса.
Если результат левого запроса операции EXCEPT содержит уникальные строки, не совпадающие ни с одной из строк правого запроса, то, только такие строки помещается в результирующую таблицу. Уникальные строки правого запроса операции EXCEPT, никогда не входят в результирующую таблицу. Если результаты обоих запросов содержат совпадающие строки, то, операция EXCEPT игнорирует их. Операция EXCEPT требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.
1 2 3 4 5 6 7 |
SELECT * FROM JoinTest1 EXCEPT SELECT * FROM JoinTest2 SELECT * FROM JoinTest2 EXCEPT SELECT * FROM JoinTest1 |
INTERSECT
INTERSECT объединяет результаты двух запросов SELECT в единую результирующую таблицу.
Если результаты обоих запросов содержат строки с совпадающими значениями ячеек, то, операция INTERSECT помещает в результирующую таблицу только одну такую строку.
Если в результате одного из запросов имеются уникальные строки, не совпадающие ни с одной из строк результата другого запроса, то такие строки игнорируются операцией INTERSECT.
Операция INTERSECT требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.
1 2 3 |
SELECT * FROM JoinTest1 INTERSECT SELECT * FROM JoinTest2 |
Примеры
Показать статистику по количеству проданных единиц товара.
1 2 3 4 5 |
SELECT Products.ProdID, [Description], SUM(Qty) AS Qty, SUM(TotalPrice) AS TotalSold -- Ошибки нет. FROM Products INNER JOIN OrderDetails ON Products.ProdID = OrderDetails.ProdID GROUP BY Products.ProdID, [Description] |
Если в используемых таблицах, имеются столбцы с одинаковыми именами, то нужно явно указать к какой таблице относится данный столбец.
1 2 3 |
SELECT ProdID, [Description], Qty, TotalPrice FROM Products -- Ошибка! JOIN OrderDetails ON Products.ProdID = OrderDetails.ProdID |
Вывести общую суму продаж по сотрудникам.
1 2 3 4 5 6 7 8 |
SELECT FName, LName, MName, SUM(TotalPrice) AS [Total Sold] FROM Employees -- Алиас [Total Sold] JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID GROUP BY Employees.FName, Employees.LName, Employees.MName |
Вывести общую суму продаж по каждому из сотрудников
1 2 3 4 5 6 7 8 |
SELECT FName, LName, MName, SUM(TotalPrice) AS [Total Sold] FROM Employees -- Алиас [Total Sold] LEFT JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID GROUP BY Employees.FName, Employees.LName, Employees.MName |
Вывести план подчинения сотрудников (Кто кому подчиняется)
1 2 3 4 |
SELECT Emp1.FName, Emp1.MName, Emp1.LName, Emp2.FName, Emp2.MName, Emp2.LName FROM Employees Emp1 -- Алиас Emp1 JOIN Employees Emp2 -- Алиас Emp2 ON Emp1.EmployeeID = Emp2.ManagerEmpID |