Right join inner join: SQL INNER JOIN Keyword

Разница между внутренним и правым соединением в SQL Server

Введение

В этой статье я собираюсь объяснить разницу между внутренним и правым соединением на примерах. Это один из самых распространенных вопросов на собеседовании по SQL Server.

 

Здесь мы будем использовать SQL Server 2017, или вы можете использовать SQL Server 2008 или более позднюю версию.

 

Прочтите мои предыдущие статьи о присоединениях к SQL Server 2017 , используя приведенные ниже ссылки, прежде чем читать эту статью, 

  • Соединения в SQL Server 2017
  • Самостоятельное присоединение в SQL Server 2017
  • Расширенные соединения в SQL Server 2017
  • Присоединение к трем или более таблицам в SQL Server 2017
  • Разница между Union и Union All в SQL Server 2017
  • Найдите N-ю самую высокую зарплату в SQL Server 2017
  • Разница между внутренним соединением и левым соединением в SQL Server

Определение объединений

 

Используется для выборки/получения данных из двух или более связанных таблиц из базы данных. Как правило, таблицы связаны друг с другом с помощью ограничений внешнего ключа.

 

Предварительные условия

 

SQL Server 2017 или вы можете использовать SQL Server 2008 или более позднюю версию.

 

Теперь сначала мы создадим базу данных и две таблицы, чтобы применить соединения для понимания. Шаг 1. Создание базы данных

  1. Создать базу данных chittadb   

Теперь выберите запрос сценария, затем нажмите F5 или нажмите кнопку «Выполнить», чтобы выполнить указанный выше сценарий.

 

Вы должны увидеть сообщение «Команды успешно выполнены». Это означает, что ваша новая база данных создана.

 

Шаг 2. Создайте первую таблицу

 

Откройте SQL Server и используйте следующий скрипт для создания таблицы «tbl_Department».

  1. создать таблицу tbl_Department  
  2. (  
  3. DeptId int первичный ключ не нулевой идентификатор (1,1),  
  4. Имя отдела nvarchar(50),  
  5. Глава отдела nvarchar(50),  
  6. Местоположение nvarchar(100)  
  7. )  

Выполните приведенный выше запрос, чтобы создать «tbl_Department».

 

Вы должны увидеть сообщение «Команды успешно выполнены».

 

Теперь данные вставлены в таблицу.

  1. Вставить в tbl_Department значения ( ‘IT’, ‘Читта’, ‘Ченнаи’)  
  2. Вставить в значения tbl_Department («Зарплата», «Ахил», «Одиша»)  
  3. Вставить в значения tbl_Department (‘HR’, ‘Ram’, ‘Pune’)  
  4. Вставить в tbl_Department значения ( ‘Табель учета рабочего времени’, ‘Каннан’, ‘Ченнай’)  

Выполните приведенный выше запрос, вы должны увидеть сообщение «Команды успешно выполнены».

 

Теперь извлеките все данные из таблицы «tbl_Department».

  1. выберите * из tbl_Department  

вывод

 

 

 

Шаг 3. Создайте вторую таблицу

, следуя инструкции «Server blE

9004».

  1. Создать таблицу tbl_Employee  
  2. (  
  3.      EmpID int первичный ключ не нулевой идентификатор (1,1),  
  4.      Имя nvarchar(50),  
  5.      Пол nvarchar(50),  
  6.      страна nvarchar(20),  
  7.      Зарплата,  
  8.      DepartmentId int ссылки на внешние ключи tbl_Department(DeptId)  
  9. )  

Выполните приведенный выше запрос, чтобы создать «tbl_Employee».

 

Вы должны увидеть сообщение «Команды успешно выполнены».

 

Теперь данные вставлены в таблицу.

  1. Вставить в tbl_Employee значения ( ‘Джиту’, ‘Мужчина’,’Индия’,4000, 1)  
  2. Вставить в значения tbl_Employee (‘Рани’, ‘Женщина’, ‘Индия’, 5000, 3)  
  3. Вставить в значения tbl_Employee (‘Rohit’, ‘Мужчина’, ‘Индия’, 5500, 1)  
  4. Вставить в значения tbl_Employee (‘Дибас’, ‘Мужчина’, ‘Индия’, 6500, 2)  
  5. Вставить в значения tbl_Employee (‘Gajendra’, ‘Мужчина’, ‘Индия’, 3800, 2)  
  6. Вставить в значения tbl_Employee (‘Раджа’, ‘Мужчина’, ‘Индия’, 9000, 1)  
  7. Вставить в значения tbl_Employee (‘Джени’, ‘Женщина’, ‘Индия’, 5800, 3)  
  8. Вставить в значения tbl_Employee (‘Чандин’, ‘Женщина’, ‘Индия’, 8500, 1)  
  9. Вставить в значения tbl_Employee (‘pintu’, ‘Мужчина’, ‘Индия’, 9500, NULL)  
  10. Вставить в значения tbl_Employee (‘Subrat’, ‘Мужчина’, ‘Индия’, 9800, NULL)  

Выполните приведенный выше запрос, вы должны увидеть сообщение «Команды успешно выполнены».

 

Теперь извлеките все данные из таблицы «tbl_Employee».

  1. выберите * из tbl_Employee  

Выход

Общая формула для соединений

  1. Выбрать список столбцов (какая -то столбец вы хотите отобразить)
  2. ОТ           LeftTableName   
  3. JOIN_TYPE  RightTableName   
  4. ВКЛ                 JoinCondition  

 INNER JOIN

 

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

 

Пример

 

Напишите запрос для получения имени, пола, страны, зарплаты и названия отдела из таблиц tbl_Employee и tbl_Department.

 

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Запрос

  1. ВЫБЕРИТЕ Имя, Пол,страна, Оклад, Название отдела   
  2. ОТ tbl_Employee  
  3. ВНУТРЕННЕЕ СОЕДИНЕНИЕ tbl_Department  
  4. ON tbl_Employee. DepartmentId = tbl_Department.DeptId  

ИЛИ

  1. ВЫБЕРИТЕ Имя, Пол, страну, Зарплату, Название отдела   
  2. ОТ tbl_Employee  
  3.  ПРИСОЕДИНИТЬСЯ tbl_Department  
  4. ON tbl_Employee.DepartmentId = tbl_Department.DeptId  

Примечание

СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ означает, что оба они одинаковы. Всегда лучше использовать INNER JOIN.

 

ИЛИ

  1. выберите emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName   
  2.     из tbl_Employee emp   
  3.     внутреннее объединение tbl_Department dept  
  4.     на emp.DepartmentId=dept.DeptId  

Выход

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

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

 

Пример

 

Напишите запрос для получения имени, пола, страны, зарплаты и названия отдела из таблиц tbl_Employee и tbl_Department.

 

ПРАВОЕ СОЕДИНЕНИЕ или ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Запрос

  1. ВЫБЕРИТЕ Имя, Пол, страну, Заработную плату, Название отдела   
  2. ОТ tbl_Employee  
  3. ПРАВОЕ СОЕДИНЕНИЕ tbl_Department  
  4. ON tbl_Employee.DepartmentId = tbl_Department.DeptId  

ИЛИ

  1. ВЫБЕРИТЕ Имя, Пол, страну, Зарплату, Название отдела   
  2. ОТ tbl_Employee  
  3. ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tbl_Department  
  4. ON tbl_Employee.DepartmentId = tbl_Department.DeptId  

Примечание

Вы можете использовать RIGHT JOIN или RIGHT OUTER JOIN. Ключевое слово OUTER не является обязательным.

ИЛИ

  1. выберите emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName   
  2.     из tbl_Employee emp   
  3.     RIGHT JOIN tbl_Department dept  
  4.     на emp.DepartmentId=dept.DeptId  

Выход

 

 

 

В чем разница между INNER JOIN и RIGHT JOIN?

 

INNER JOIN

 

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

 

 

 

ПРАВОЕ СОЕДИНЕНИЕ

 

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

 

 

В чем разница между INNER JOIN и JOIN

Нет никакой разницы между внутренним соединением и соединением, они абсолютно одинаковы. Точно так же нет разницы между

  • ЛЕВОЕ СОЕДИНЕНИЕ и ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
  • ПРАВОЕ СОЕДИНЕНИЕ и ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
  • ПОЛНОЕ СОЕДИНЕНИЕ и ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ

Заключение

 

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

SQL: СОЕДИНИТЬСЯ против ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ?

спросил

Изменено
1 год, 5 месяцев назад

Просмотрено
5к раз

У меня есть несколько похожих SQL-запросов, в одном из которых используется JOIN , а в другом LEFT OUTER JOIN . Я поиграл с SQL и обнаружил, что возвращаются те же результаты. Кодовая база использует JOIN и LEFT OUTER JOIN взаимозаменяемо. Пока LEFT JOIN кажется взаимозаменяемым с LEFT OUTER JOIN , я не могу найти информацию только о JOIN . Это хорошая практика?

Ex Query1 с использованием JOIN

 SQL
ВЫБРАТЬ
   я бы,
   имя
ОТ
   u_users клиенты
ПРИСОЕДИНИТЬСЯ
   t_orders заказы
ONorders.status=='ОЖИДАНИЕ ОПЛАТЫ'
 

Пример. Query2 с использованием LEFT OUTER JOIN

 SQL
ВЫБРАТЬ
   я бы,
   имя
ОТ
   u_users клиенты
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
   t_orders заказы
ONorders.status=='ОЖИДАНИЕ ОПЛАТЫ'
 
  • sql
  • присоединиться
  • левое соединение

4

Как указано выше:

СОЕДИНЕНИЕ является синонимом ВНУТРЕННЕГО СОЕДИНЕНИЯ. Это определенно отличается от всех
типы ВНЕШНИХ СОЕДИНЕНИЙ

Итак, вопрос: «Когда следует использовать внешнее соединение?»

Вот хорошая статья с несколькими отличными диаграммами:

https://www. sqlshack.com/sql-outer-join-overview-and-examples/

Краткий ответ на ваш вопрос:

  • Предпочитайте СОЕДИНЕНИЕ (также известное как «ВНУТРЕННЕЕ СОЕДИНЕНИЕ»), чтобы связать две связанные таблицы. На практике вы будете использовать INNER JOIN большую часть времени.
  • INNER JOIN — это пересечение двух таблиц. Он представлен «зеленым» участком в середине диаграммы Венна выше.
  • Используйте «Внешнее соединение», если вам нужны левая, правая или обе внешние области.
  • В вашем примере результирующий набор один и тот же: два выражения эквивалентны.
  • ТАКЖЕ: обязательно ознакомьтесь с «Show Plan» (или эквивалентом) для вашей СУБД: https://www.sqlshack.com/execution-plans-in-sql-server/

‘Надеюсь, это поможет…

1

Сначала теория:

Соединение является подмножеством левого соединения (при прочих равных условиях). При некоторых обстоятельствах они идентичны

Разница в том, что левое соединение будет включать все кортежи в левом отношении (даже если они не соответствуют предикату соединения), в то время как соединение будет включать только кортежи левого отношения. стороны, которые соответствуют сказуемому.

Например, предположим, что мы должны установить отношения R и S.

Допустим, мы должны выполнить R JOIN S (и R LEFT JOIN S) для некоторого предиката p

J = R JOIN S для (p)

Теперь идентифицируем кортежи R, которых нет в J.

Наконец, добавьте эти кортежи в J (заполнив любой атрибут в J, не входящий в R, нулем)

Результатом является левое соединение:

R LEFT JOIN S (p)

Таким образом, когда все кортежи левой части отношения находятся в СОЕДИНЕНИИ, этот результат будет идентичен левому соединению.

вернуться к вам проблема:

Ваш JOIN, скорее всего, будет включать все кортежи от Users. Таким образом, запрос будет таким же, если вы используете JOIN или LEFT JOIN.

Эти два значения полностью эквивалентны, поскольку предложение WHERE превращает LEFT JOIN в INNER JOIN .

При фильтрации всех, кроме первой таблицы в LEFT JOIN условие обычно должно быть в предложении ON . Предположительно, у вас также есть допустимое условие соединения, соединяющее две таблицы:

 SELEC идентификатор, имя
ОТ u_users u ЛЕВОЕ ПРИСОЕДИНЕНИЕ
     t_orders о
     ON o.user_id = u.user_id AND o.status = 'ОЖИДАНИЕ ОПЛАТЫ';
 

Эта версия отличается от версии INNER JOIN , поскольку эта версия возвращает всех пользователей, даже тех, у кого нет ожидающих платежей.

2

Оба одинаковые, здесь нет никакой разницы.

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