Msdn join sql: MS SQL Server и T-SQL

соединений в SQL Server, внутреннее соединение, перекрестное соединение, левое внешнее соединение, соединение Equi, правое внешнее соединение, полное внешнее соединение Сервер и пример различных типов соединений (внешнее соединение SQL LEFT, внешнее соединение SQL RIGHT, внешнее соединение SQL FULL, образец перекрестного соединения SQL, образец внутреннего соединения SQL, пример самостоятельного соединения) и использование соединений в SQL Server.

Описание :

В SQL соединения используются для получения данных из двух или более таблиц на основе связи между некоторыми столбцами в таблицах. В большинстве случаев мы будем использовать первичный ключ первой таблицы и внешний ключ вторичной таблицы для получения данных из таблиц. Используя эту связь, мы можем уменьшить дублирование данных в каждой таблице.

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

Создайте одну таблицу с первичным ключом и дайте имя «UserDetails»

Идентификатор пользователя

Имя пользователя

Имя

Фамилия

     1

СурешДасари

Суреш

Дасари

     2

ПрашантиДонти

Прашанти

Донти

     3

Махеш Дасари

Махеш

Дасари

Здесь UserID является первичным ключом в таблице UserDetails

После этого создайте другую таблицу с внешним ключом и назовите ее как OrderDetails

OrderID

Заказ №

Идентификатор пользователя

     1

543224

1

     2

213424

2

     3

977776

3

     4

323233

3

     5

998756

1

Здесь OrderID — первичный ключ, а UserID — внешний ключ в таблице OrderDetails.

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

Типы соединений

             1) Внутренние соединения

             2) Внешние соединения

9001 0              3) Self Join

Inner Join

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

Синтаксис для внутреннего соединения

ВЫБРАТЬ t1.имя_столбца,t2.имя_столбца

ОТ table_name1 t1

ВНУТРЕННЕЕ СОЕДИНЕНИЕ table_name2 t2

ON t1.имя_столбца=t2.имя_столбца

Теперь проверьте приведенный ниже запрос для внутреннего соединения

Пример

SELECT u. UserName, u.LastName, o.OrderNo 900 09

ОТ UserDetails u

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Детали заказа o

ON u.UserID=o.UserID

Как только мы запустим этот запрос, наш вывод будет таким:

Имя пользователя

Фамилия

Номер заказа

     СурешДасари

Дасари

543224

     Прасантидонти  

Донти

213424

     Махеш Дасари

Дасари

977776

     Махеш Дасари

Дасари

323233

     СурешДасари

Дасари

998756

Мы можем написать наш внутренний запрос на соединение таким образом, и он даст тот же результат

ВЫБЕРИТЕ u. UserName, u.LastName, o.OrderNo

ОТ UserDetails u

ПРИСОЕДИНЯЙТЕСЬ Детали заказа o

ON u.UserID=o.UserID

Основываясь на приведенном выше результате, мы можем сказать, что ключевое слово INNER JOIN возвращает строки, когда в обеих таблицах есть хотя бы одно совпадение. Если в «UserDetails» есть строки, которым нет совпадений в «OrderDetails», эти строки НЕ будут перечислены.

Во внутреннем соединении у нас есть разные типы соединений, это

           1) Equi Join

2         2) Natural Join

            3) Cross Join

Equi Join

 Equi join используется для отображения всех сопоставленные записи из объединенных таблиц, а также отображают избыточные значения. В этом объединении нам нужно использовать знак *, чтобы присоединиться к таблице.

Синтаксис для Equi Join

ВЫБРАТЬ * ИЗ table_name1 t1

ВНУТРЕННЕЕ СОЕДИНЕНИЕ table_name2 t2

ON t1. имя_столбца=t2.имя_столбца

Теперь проверьте приведенный ниже запрос для Equi join

Пример

SELECT *

ОТ UserDetails u

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Детали заказа o

ON u.UserID=o.UserID

Как только мы запустим вышеуказанный запрос, наш вывод будет таким:

Идентификатор пользователя

Имя пользователя

Имя

Фамилия

ID заказа

Номер заказа

Идентификатор пользователя

   1

Суреш Дасари

Суреш

Дасари

     1

543224

     1

   2

 Прасантидонти

Прашанти

Донти

     2

213424

     2

   3

Махеш Дасари

Махеш

Дасари

     3

977776

     3

   3

Махеш Дасари

Махеш

Дасари

     4

323233

     3

   1

Суреш Дасари

Суреш

Дасари

     5

998756

     1

В эквивалентном соединении нам нужно использовать только сравнения равенства в отношении соединения. Если мы используем другие операторы, такие как (<,>) для нашего условия сравнения, то наши соединения не подходят для эквивалентного соединения.

Естественные соединения

Естественное соединение такое же, как наше соединение Equi, но с той лишь разницей, что оно ограничивает отображение избыточных значений.

Синтаксис для естественного соединения

SELECT * FROM table_name1 t1

ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ table_name2 t2

Пример

ВЫБЕРИТЕ *

ИЗ Деталей пользователя

ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ Детали заказа

Примечание : эти ЕСТЕСТВЕННЫЕ соединения не будут работать в нашем SQL Server (поддерживается только в Oracle ), это вызовет синтаксическую ошибку. Если вы заметили выше, что код «NATURAL» не выделен, что указывает на то, что он не распознан как ключевое слово.

Перекрестное соединение

Перекрестное соединение, производящее декартово произведение таблиц, участвующих в соединении. Размер декартова произведения равен количеству строк в первой таблице, умноженному на количество строк во второй таблице.

Синтаксис для перекрестного соединения

SELECT * FROM table_name1

ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ table_name2

 Или мы можем написать это по-другому также

SELECT * FROM table_name1,table_name2

Теперь проверьте приведенный ниже запрос для перекрестного соединения

Пример

SELECT * FROM UserDetails

ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ Детали заказа

Или

ВЫБЕРИТЕ * ИЗ UserDetails, OrderDetails

Как только мы запустим этот запрос, наш вывод будет таким:

UserID

Имя пользователя

Имя

Фамилия

Идентификатор заказа

Номер заказа

Идентификатор пользователя

1

СурешДасари

Суреш

Дасари

1

543224

1

1

СурешДасари

Суреш

Дасари

2

213424

2

1

СурешДасари

Суреш

Дасари

3

977776

3

1

СурешДасари

Суреш

Дасари

4

323233

3

1

СурешДасари

Суреш

Дасари

5

998756

1

2

ПрашантиДонти

Прашанти

Донти

1

543224

1

2

ПрашантиДонти

Прашанти

Донти

2

213424

2

2

ПрашантиДонти

Прашанти

Донти

3

977776

3

2

ПрашантиДонти

Прашанти

Донти

4

323233

3

2

ПрашантиДонти

Прашанти

Донти

5

998756

1

3

Махеш Дасари

Махеш

Дасари

1

543224

1

3

Махеш Дасари

Махеш

Дасари

2

213424

2

3

Махеш Дасари

Махеш

Дасари

3

977776

3

3

Махеш Дасари

Махеш

Дасари

4

323233

3

3

Махеш Дасари

Махеш

Дасари

5

998756

1

Внешнее соединение

Соединение, которое возвращает все строки, удовлетворяющие условию, и несопоставленные строки в объединенной таблице, является внешним соединением.

У нас есть три типа внешних соединений

             Левое внешнее соединение

              Правое внешнее соединение

              Полное внешнее соединение

90 010 Левое внешнее соединение

Левое внешнее соединение отображает все строки из первой таблицы и соответствующие строки из второй таблицы.

Синтаксис для левого внешнего соединения

SELECT Column_List FROM table_name1 t1

ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ имя_таблицы2 t2

ON t1.имя_столбца=t2.имя_столбца

Теперь проверьте приведенный ниже запрос для левого внешнего соединения

Пример

009

ОТ UserDetails u

ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Детали заказа o

ON u.UserID=o.UserID

Как только мы запустим этот запрос, наш вывод будет таким:

Идентификатор пользователя

Имя пользователя

Номер заказа

1

СурешДасари

543224

1

СурешДасари

998756

2

ПрашантиДонти

213424

3

Махеш Дасари

977776

3

Махеш Дасари

323233

Правое внешнее соединение

Правое внешнее соединение отображает все строки из второй таблицы и соответствующие строки из первой таблицы.

Синтаксис для правого внешнего соединения

ВЫБРАТЬ Column_List ИЗ table_name1 t1

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ table_name2 t2

ON t1.имя_столбца=t2.имя_столбца

Теперь проверьте следующий запрос для правого внешнего соединения

Пример

009

ОТ UserDetails u

ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Детали заказа o

ON u.UserID=o.UserID

Как только мы запустим этот запрос, наш вывод будет таким:

UserID

Имя пользователя

Номер заказа

1

СурешДасари

543224

2

ПрашантиДонти

213424

3

Махеш Дасари

977776

3

Махеш Дасари

323233

1

СурешДасари

998756

Полное внешнее соединение

Полное внешнее соединение отображает все совпадающие и не совпадающие строки обеих таблиц.

Синтаксис для полного внешнего соединения

SELECT Column_List FROM table_name1 t1

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ table_name2 t2

ON t1.имя_столбца=t2.имя_столбца

Теперь проверьте приведенный ниже запрос для полного внешнего соединения

Пример

009

ОТ UserDetails u

ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Детали заказа o

ON u.UserID=o.UserID

Как только мы запустим этот запрос, наш вывод будет таким:

UserID

Имя пользователя

Имя

Фамилия

ID заказа

Номер заказа

ID пользователя

1

СурешДасари

Суреш

Дасари

1

543224

1

1

СурешДасари

Суреш

Дасари

5

998756

1

2

ПрашантиДонти

Прашанти

Донти

2

213424

2

3

Махеш Дасари

Махеш

Дасари

3

977776

3

3

Махеш Дасари

Махеш

Дасари

4

323233

3

Самостоятельное соединение

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

Для реализации самообъединения первой таблицы параметров и присвоения имени « EmployeeDetails »

EmpID

EmpName

EmpMgrID

1

Суреш

2

2

Прашанти

4

3

Махеш

2

4

Сай

1

5

Нагараджу

1

6

Махендра

3

7

Санджай

3

Теперь я хочу получить имена менеджеров конкретного сотрудника, для этого нам нужно написать такой запрос

выберите e2. EmpName, e1.EmpName как «Менеджер»

из EmployeeDetails e1

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сведения о сотруднике e2

на e1.EmpID=e2.EmpMgrID

Здесь, если вы наблюдаете приведенный выше запрос, таблица EmployeeDetails соединилась сама с собой, используя псевдонимы таблиц e1 и e2.

После этого выполнения наш вывод запроса будет таким:

EmpName

Ясли

Сай

Суреш

Нагараджу

Суреш

Суреш

Прашанти

Махеш

Прашанти

Махендра

Махеш

Санджай

Махеш

Прашанти

Сай

 

Обзор объединения обновлений SQL Server

В этой статье рассматривается оператор SQL Server Update Join в T-SQL для SQL Server.

Введение

Мы используем оператор Update в SQL Server для обновления существующей строки в таблице. Мы можем обновить все записи или несколько записей на основе критериев, указанных в предложении where. Обычно мы обновляем одну таблицу с помощью инструкции SQL Update.

В реляционной базе данных рекомендуется использовать нормализацию при проектировании базы данных. При нормализации базы данных мы используем несколько таблиц и определяем связь между ними. Мы можем извлекать записи из нескольких таблиц с помощью SQL Joins.

Теперь возникает вопрос: можем ли мы обновить несколько таблиц с помощью SQL Server Update Join? Давайте рассмотрим в этой статье.

Давайте создадим таблицу клиентов и вставим в нее несколько записей.

Подготовка среды для демонстрации

Создайте таблицу Customers и вставьте в нее несколько записей:

1

2

3

4

5

6

7

8

CREATE TABLE [dbo]. [Customers]

([id]           [INT] identity(1,1),

[CustomerName] [VARCHAR](30) NULL,

[OrderCount]   [INT] NULL 900 09

)

ВКЛ [ПЕРВИЧНЫЙ];

GO

Вставить в Customers ([CustomerName],[OrderCount]) значения(‘Raj’,NULL),(‘Kusum’,NULL),(‘Akshita’,NULL),(‘John’,NULL), («Дэн», NULL)

Создайте таблицу Orders и вставьте в нее несколько записей:

1

2

3

4

5

6

7

8

9 9 0009

CREATE TABLE [dbo].[Orders]

([Order_ID]      [INT] IDENTITY(1, 1) NOT NULL,

[CustomerID]    [INT] NOT NULL,

[OrderQuantity] [INT] NOT NULL ,

[OrderAmount]   [INT] NOT NULL,

CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED([Order_ID] ASC)

)

ВКЛ [ПЕРВИЧНЫЙ];

ГО

Эта таблица должна иметь ограничение внешнего ключа для столбца [CustomerID] таблицы Customers:

1

2

3

4

5

6

7

8

9 9 0009

ALTER TABLE [dbo]. [Orders]  WITH CHECK ADD CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([CustomerID])

REFERENCES [dbo].[Customers] ([Customerid])

GO

 

ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers]

GO

Вставить в [dbo].[Заказы] (CustomerID, OrderQuantity, OrderAmount) значения (1 100 5000)

Вставить в [dbo].[Orders] (CustomerID, OrderQuantity, OrderAmount) значения (2 150 6879)

Вставить в [dbo].[Orders] (CustomerID , OrderQuantity, OrderAmount) значения (3 189 7895)

Оператор обновления SQL

У нас есть среда, готовая к демонстрации. Прежде чем мы углубимся в обновление нескольких таблиц с помощью SQL Server Update Join, давайте рассмотрим основную форму оператора SQL Update.

Предположим, мы хотим обновить столбцы [OrderQuantity] и [OrderAmount] таблицы заказов. Сначала мы используем оператор SELECT для просмотра записи:

ВЫБОР *

ОТ dbo. orders

ГДЕ CustomerID = 2;

Мы можем использовать следующую инструкцию SQL Update для обновления таблицы Orders. Здесь мы используем псевдоним SQL для таблицы Orders. Здесь мы заменили оператор Select оператором Update без особых изменений в запросе:

Обновление O установить [OrderQuantity] = 200, [OrderAmount] = 7896

ИЗ dbo.orders O

ГДЕ CustomerID = 2;

Мы можем выполнить оператор Select и проверить изменения:

Оператор SQL UPDATE с SQL JOIN

Теперь давайте воспользуемся SQL Join для извлечения записи из обеих таблиц. Мы используем столбец [CustomerID] для объединения обеих таблиц:

1

2

3

4

5

6

SELECT C.CustomerName,

       C.OrderCount,

       O.OrderAmount,

       O. OrderQuantity

FROM Customers C

     JOIN Orders O ON C.Customerid = O.CustomerID;

В выводе мы видим только три записи. Внутреннее соединение извлекает записи, существующие в обеих таблицах. CustomerID 1, 2, 3 существует в обеих таблицах и доступен в результате соединения SQL:

Мы можем видеть значения NULL в столбце [OrderCount] таблицы Customers. Предположим, мы хотим обновить этот столбец с помощью [OrderQuantity] таблицы заказов. Мы можем использовать следующий синтаксис для инструкции SQL Server Update Join:

1

2

3

4

5

6

7

8

9 9 0009

10

ОБНОВЛЕНИЕ

    Tablealias

SET

    A.c1 = B.C1

        …  

FROM

    tableA A 900 09

    [ВНУТРЕННИЙ | LEFT] JOIN tableA B ON join_predicate

WHERE

    where_predicate;

  • Указываем базовую таблицу, в которой мы хотим обновить записи. Мы также можем использовать псевдоним SQL Join вместо имени таблицы.
  • Указываем столбец и значение столбца, который мы хотим обновить. Мы используем оператор Set для указания значений
  • Используйте оператор SQL Join и укажите имя таблицы с условиями соединения. Мы можем использовать внутреннее соединение или левое соединение в этом предикате.
  • Добавьте предложение Where, чтобы обновлять только определенные строки. Это необязательный аргумент

Следующий запрос обновляет таблицу клиентов (инструкция Update C) с помощью оператора Set (SET C.OrderCount = O.OrderQuantity) с использованием таблицы соединения клиентов и заказов (Customers C JOIN Orders O ON C.Customerid = O.CustomerID):

UPDATE C

  SET

      C.OrderCount = O.OrderQuantity

FROM Customers C

     JOIN Orders O ON C.Customerid = O.CustomerID;

Он возвращает вывод о том, что затронуты три строки:

Выполните оператор Select join и проверьте записи. Мы видим, что он показывает аналогичные значения в столбцах [OrderCount] и [OrderQuantity]:

Предположим, в новом финансовом году мы архивируем старые записи клиентов и начинаем с нуля в столбцах [OrderQuantity] таблицы заказов. Мы можем выполнить следующую инструкцию SQL Server Update Join, и она обновит столбцы [OrderQuantity] таблицы заказов:

UPDATE O

  SET

      O.OrderQuantity = 0

FROM Customers C

     ПРИСОЕДИНЯЙТЕСЬ к заказам O ON C.Customerid = O.CustomerID;

Мы не можем обновить несколько таблиц вместе, используя SQL Server Update Join. Если мы попытаемся обновить несколько столбцов, принадлежащих разным таблицам, мы получим следующее сообщение об ошибке:

Не удалось связать составной идентификатор «O.OrderAmount».

1

2

3

4

5

6

7

ОБНОВЛЕНИЕ С

  SET

      C. OrderCount = 0,

    O.OrderAmount = 0,

      O.OrderQuantity = 0

FROM Customers C

     JOIN Orders O ON C.Customerid = O.CustomerID;

В этом случае мы можем использовать несколько операторов обновления. Например, следующий запрос обновляет столбец [OrderCount] таблицы клиентов:

UPDATE C

  SET

      C.OrderCount = 0

FROM Customers C

     JOIN Orders O ON C.Customerid = O.CustomerID;

Операторы Next Update обновляют значения столбцов [OrderAmount] и [OrderQuantity] на ноль в таблице Orders:

1

2

3

4

5

6

ОБНОВЛЕНИЕ О

  SET

      O.OrderAmount = 0,

      O.OrderQuantity = 0

FROM Customers C

     JOIN Orders O ON C.Customerid = O . Идентификатор клиента;

Обновление SQL Server с левым соединением

В предыдущих примерах мы использовали внутреннее соединение для получения записей, в которых одинаковый идентификатор клиента существует как в таблице «Клиенты», так и в таблице «Заказы». Мы можем использовать левое соединение, чтобы получить совпадающую строку вместе с несопоставленной строкой из левой таблицы.

Следующий оператор Select показывает выходные данные оператора Select с левым соединением:

1

2

3

4

5

6

SELECT C.CustomerName,

       C.OrderCount,

       O.OrderAmount,

       O.OrderQuantity

FROM Customers c

осталось заказов JOIN O ON O.Customerid = C.CustomerID;

Здесь, в выводе, мы видим Клиента Джона и Дэна. Значения столбцов [OrderCount], [OrderAmount] и [OrderQuantity] равны NULL для следующих клиентов:

Мы также можем использовать оператор Update с левым соединением, и он обновляет записи со значениями NULL. Как подчеркивалось ранее, мы не можем использовать один оператор Update для обновления нескольких столбцов из разных таблиц.

Следующий оператор обновления обновляет значение [OrderCount] как нулевое для клиентов, имеющих значение столбца [OrderCount] NULL:

1

2

3

4

5

6

UPDATE C

  SET

      C.OrderCount = 0

FROM Customers C

     right JOIN Orders O ON C.Customerid = O.CustomerID

   где Ordercount IS NULL

На следующем изображении мы видим фактический план выполнения приведенного выше оператора обновления SQL. Он использует оператор обновления кластеризованного индекса для обновления записей в таблице клиентов:

Следующий оператор обновления обновляет значения [OrderAmount] и [OrderQuantity] как нулевые для клиентов, имеющих значение столбца [OrderAmount] NULL:

1

2

3

4

5

6

7

ОБНОВЛЕНИЕ O

  SET

      O. OrderAmount = 0,

      O.OrderQuantity = 0

FROM Customers C

     left JOIN Orders O ON C.Customerid = O.CustomerID

   где OrderAmount IS NULL

Точно так же мы можем использовать следующий запрос с Right Join в операторе SQL Server Update Join:

1

2

3

4

5

6

ОБНОВЛЕНИЕ C

  SET

      C.OrderCount = 0

ОТ Клиентов C

      Заказы Right JOIN O ON C.Customerid = O.CustomerID

   где Ordercount IS NULL

Заключение

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

  • Автор
  • Последние сообщения

Раджендра Гупта

Привет! Я Раджендра Гупта, специалист по базам данных и архитектор, помогаю организациям быстро и эффективно внедрять решения Microsoft SQL Server, Azure, Couchbase, AWS, устранять связанные проблемы и настраивать производительность с более чем 14-летним опытом.