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-летним опытом.