JOINs

Приветствую всех, сегодня поговорим о объединение данных в таблице.

Внутреннее объединение-INNER JOIN

INNER JOIN (внутреннее объединение) — объединение, при котором в запросе все записи из таблицы на левой и правой стороне операции INNER JOIN добавляются в результирующий набор записей, при соответствии условию значений в связанных полях.

Производим выборку всех данных из объеденения таблиц JoinTest1 и JoinTest2 по связующим полям id_jt1 и id_jt2.

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.

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.

SELECT * FROM JoinTest2	
   RIGHT OUTER JOIN JoinTest1 -- Правая таблица JoinTest2
ON id_jt1 = id_jt2;
GO

Полное Внешнее Объединение-FULL OUTER JOIN

FULL OUTER JOIN (полное объединение) внешнее объединение, при котором в запросе
все записи из таблицы на левой и правой стороне операции FULL JOIN добавляются в
результирующий набор записей, при соответствии условию значений в связанных полях, а
так же:

  • значения из правой таблицы, не имеющие соответствий в левой таблице;
  • значения из левой таблицы, не имеющие соответствий в правой таблице.
SELECT * 
FROM JoinTest2
FULL OUTER JOIN JoinTest1	 --FULL JOIN
ON id_jt1 = id_jt2;
GO

 

Перекрестное Объединение-CROSS JOIN

CROSS JOIN (перекрестное объединение) — выполняет декартово произведение таблиц, вовлеченных в объединение. В CROSS JOIN не используется конструкция ON

Производим выборку всех данных из результирующего набора данных перекрестного  объеденения таблиц JoinTest1 и JoinTest2.

SELECT * FROM JoinTest1
   CROSS JOIN JoinTest2 -- CROSS JOIN
-- ON - не используется 
GO

 

UNION

UNION объединяет результаты двух запросов SELECT в единую результирующую таблицу.

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

Операция UNION требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.

SELECT * FROM JoinTest1 
UNION 
SELECT * FROM JoinTest2

UNION ALL

UNION ALL объединяет результаты двух запросов SELECT в единую результирующую таблицу.

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

Операция UNION ALL требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.

SELECT * FROM JoinTest1 
UNION ALL
SELECT * FROM JoinTest2

EXCEPT

Операция EXCEPT исключает результаты правого запроса.

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

SELECT * FROM JoinTest1 
EXCEPT
SELECT * FROM JoinTest2 

SELECT * FROM JoinTest2 
EXCEPT 
SELECT * FROM JoinTest1

INTERSECT

INTERSECT объединяет результаты двух запросов SELECT в единую результирующую таблицу.

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

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

Операция INTERSECT требует использования таких запросов, каждый из которых возвращает выборку в табличном представлении, при этом, типы и количество столбцов должны совпадать.

SELECT * FROM JoinTest1 
INTERSECT
SELECT * FROM JoinTest2 

Примеры

Показать статистику по количеству проданных единиц товара.

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]

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

SELECT ProdID, [Description], Qty, TotalPrice FROM Products  -- Ошибка!
			   JOIN OrderDetails
			   ON Products.ProdID = OrderDetails.ProdID

Вывести общую суму продаж по сотрудникам.

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

Вывести общую суму продаж по каждому из сотрудников

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

Вывести план подчинения сотрудников (Кто кому подчиняется)

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

 

 

 

 

Обновлено: 20.08.2018 — 16:19

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.