Left join inner join: Понимание джойнов сломано. Это точно не пересечение кругов, честно / Хабр
Содержание
SQL: JOIN против LEFT OUTER JOIN?
спросил
Изменено
1 год, 11 месяцев назад
Просмотрено
7к раз
У меня есть несколько похожих 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
Как указано выше:
СОЕДИНЕНИЕ является синонимом ВНУТРЕННЕГО СОЕДИНЕНИЯ. Это определенно отличается от всех
типы ВНЕШНИХ СОЕДИНЕНИЙ
Итак, возникает вопрос: «Когда следует использовать внешнее соединение?»
Вот хорошая статья с несколькими отличными диаграммами:
Краткий ответ на ваш вопрос:
- Предпочитайте СОЕДИНЕНИЕ (также известное как «ВНУТРЕННЕЕ СОЕДИНЕНИЕ»), чтобы связать две связанные таблицы. На практике вы будете использовать 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 . Он может сопоставлять любые данные между двумя таблицами, если вы не используете ПО пункт.
Это может вызвать проблемы с производительностью, а также сопоставить нежелательные данные.
Если вы хотите увидеть различия, вы можете использовать «планы выполнения» .
например, для примера я использовал базу данных Microsoft AdventureWorks.
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ:
ЛЕВОЕ СОЕДИНЕНИЕ:
Если вы используете предложение ON, как вы написали, есть вероятность зацикливания.
Пример «планы выполнения» приведен ниже.
Вы можете получить доступ к правильному отображению и данным, используя дополнение ON .
выбрать идентификатор, имя от u_users клиенты левое внешнее соединение t_orders заказы на customers.id = orders.userid где orders.status=='ожидание оплаты'
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Разница между внутренним соединением и левым соединением в 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 2017 или вы можете использовать SQL Server 2008 или более позднюю версию.
Теперь сначала мы создадим базу данных и две таблицы, чтобы применить соединения для понимания.
Создание базы данных и двух таблиц
Шаг 1. Создайте базу данных
Откройте SQL Server и используйте следующий скрипт для создания базы данных «chittadb».
- Создать базу данных chittadb
Теперь выберите запрос сценария, затем нажмите F5 или нажмите кнопку «Выполнить», чтобы выполнить указанный выше сценарий.
Вы должны увидеть сообщение «Команды выполнены успешно». Это означает, что ваша новая база данных создана.
Шаг 2. Создайте первую таблицу
Откройте SQL Server и используйте следующий скрипт для создания таблицы «tbl_Department».
- создать таблицу tbl_Department
- (
- DeptId int первичный ключ не нулевой идентификатор (1,1),
- Имя отдела nvarchar(50),
- Глава отдела nvarchar(50),
- Местоположение nvarchar(100)
- )
Выполните приведенный выше запрос, чтобы создать «tbl_Department».
Вы должны увидеть сообщение «Команды успешно выполнены».
Теперь данные вставлены в таблицу.
- Вставить в значения tbl_Department (‘IT’, ‘Читта’, ‘Ченнаи’)
- Вставить в значения tbl_Department (‘Зарплата’, ‘Ахил’, ‘Одиша’)
- Вставить в значения tbl_Department (‘HR’, ‘Ram’, ‘Pune’)
- Вставить в значения tbl_Department (‘Timesheet’, ‘Kannan’, ‘Chennai’)
Выполните приведенный выше запрос, вы должны увидеть сообщение «Команды успешно выполнены».
Теперь извлеките все данные из таблицы «tbl_Department».
- выберите * из tbl_Department
вывод
Шаг 3. Создайте вторую таблицу
Откройте SQL Server и используйте следующий сценарий. создать таблицу «tbl_Employee».
- Создать таблицу tbl_Employee
- (
- EmpID int первичный ключ не нулевой идентификатор (1,1),
- Имя nvarchar(50),
- Пол nvarchar(50),
- страна nvarchar(20),
- Зарплата,
- DepartmentId int ссылки на внешние ключи tbl_Department(DeptId)
- )
Выполните приведенный выше запрос, чтобы создать «tbl_Employee».
Вы должны увидеть сообщение «Команды выполнены успешно».
Теперь данные вставлены в таблицу.
- Вставить в значения tbl_Employee (‘Jitu’, ‘Мужчина’, ‘Индия’, 4000, 1)
- Вставить в значения tbl_Employee (‘Рани’, ‘Женщина’, ‘Индия’, 5000, 3)
- Вставить в значения tbl_Employee (‘Rohit’, ‘Мужчина’, ‘Индия’, 5500, 1)
- Вставить в значения tbl_Employee (‘Дибас’, ‘Мужчина’, ‘Индия’, 6500, 2)
- Вставить в значения tbl_Employee (‘Gajendra’, ‘Мужчина’, ‘Индия’, 3800, 2)
- Вставить в значения tbl_Employee (‘Раджа’, ‘Мужчина’, ‘Индия’, 9000, 1)
- Вставить в значения tbl_Employee (‘Джени’, ‘Женщина’, ‘Индия’, 5800, 3)
- Вставить в значения tbl_Employee (‘Чандин’, ‘Женщина’, ‘Индия’, 8500, 1)
- Вставить в значения tbl_Employee (‘pintu’, ‘Мужчина’, ‘Индия’, 9500, NULL)
- Вставить в значения tbl_Employee (‘Subrat’, ‘Мужчина’, ‘Индия’, 9800, NULL)
Выполните приведенный выше запрос, вы должны увидеть сообщение «Команды выполнены успешно».
Теперь извлеките все данные из таблицы «tbl_Employee».
- выберите * из tbl_Employee
Вывод
Общая формула для соединений
- хотите отобразить)
- ОТ LeftTableName
- JOIN_TYPE RightTableName
- ВКЛ JoinCondition
INNER JOIN
Внутреннее соединение возвращает только совпадающие строки между обеими таблицами, несовпадающие строки удаляются.
Пример
Напишите запрос для получения имени, пола, страны, зарплаты и названия отдела из таблиц tbl_Employee и tbl_Department.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Запрос
- ВЫБЕРИТЕ Имя, Пол,Страна, Оклад, Название Отдел
- ОТ tbl_Employee
- ВНУТРЕННЕЕ СОЕДИНЕНИЕ tbl_Department
- ON tbl_Employee. DepartmentId = tbl_Department.DeptId
ИЛИ
- ВЫБЕРИТЕ Имя, Пол, Страна, Заработная плата, Название отдела
- ОТ tbl_Employee
- ПРИСОЕДИНИТЬСЯ tbl_Department
- ON tbl_Employee.DepartmentId = tbl_Department.DeptId
Примечание
СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ — это одно и то же. Всегда лучше использовать INNER JOIN.
ИЛИ
- выберите emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName
- из tbl_Employee emp
- внутреннее объединение tbl_Department dept
- на emp.DepartmentId=dept.DeptId
Выход
ЛЕВОЕ СОЕДИНЕНИЕ или ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
Левое соединение или Левое внешнее соединение возвращает только совпадающие строки между обеими таблицами, а также несовпадающие строки из левой таблицы.
Пример
Напишите запрос для получения имени, пола, страны, зарплаты и названия отдела из таблиц tbl_Employee и tbl_Department.
LEFT JOIN или LEFT OUTER JOIN Запрос
- ВЫБЕРИТЕ Имя, Пол,страна, Оклад, Название отдела
- ОТ tbl_Employee
- ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ tbl_Department
- ON tbl_Employee.DepartmentId = tbl_Department.DeptId
ИЛИ
- ВЫБЕРИТЕ Имя, Пол, Страна, Заработная плата, Название отдела
- ОТ tbl_Employee
- ЛЕВОЕ СОЕДИНЕНИЕ tbl_Department
- ON tbl_Employee.DepartmentId = tbl_Department.DeptId
Примечание
Можно использовать ЛЕВОЕ СОЕДИНЕНИЕ или ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ. Ключевое слово OUTER не является обязательным.
ИЛИ
- выберите emp.