Sql select join примеры: Оператор SQL LEFT JOIN: синтаксис, примеры

SQL-Урок 11. Расширенное объединение таблиц (OUTER JOIN)

ВВЕРХ


В предыдущем разделе мы рассмотрели самые простые способы объединения таблиц — с помощью предложений WHERE и INNER JOIN. Эти объединения называются внутренними объединениями или объединениями по эквивалентности. Однако SQL имеет в своем арсенале гораздо больше возможностей объединить таблицы, а именно существуют также и другие виды объединений: внешние объединения, природные объединения и самообъединения. Но для начала рассмотрим, каким образом мы можем присваивать таблицам псевдонимы, поскольку в дальнейшем, мы будем вынуждены использовать полные названия полей (Таблиця.Поле), которыми без сокращений будет очень трудно оперировать из-за их большой длины.

1. Использование псевдонимов таблиц

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

SELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name

Мы отобразили общую сумму реализованного товара по каждому продавцу. В нашем SQL запросе мы использовали такие псевдонимы: для расчетного поля SUM (Amount) псевдоним Sum1 для таблицы Sellers псевдоним S и для Sumproduct псевдоним SP.
Заметим, что псевдонимы таблиц могут быть применены и в других предложениях, как ORDER BY, GROUP BY и других.

2. Самообъединения

Рассмотрим пример. Предположим, нам нужно узнать адрес продавцов, торгующих в той же стране, что и John Smith. Для этого создадим такой запрос:

SELECT City, Country, Seller_name

FROM Sellers

WHERE Country = (SELECT Country FROM Sellers WHERE Seller_name = ‘John Smith’)

Также, эту задачу мы можем решить и через самообъединения, прописав следующий код:

SELECT S1.Address, S1.City, S1.Country, S1.Seller_name

FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = ‘John Smith’

Для решения этой задачи использовались псевдонимы. Первый раз для таблицы Sellers присвоили псевдоним S1, второй раз — псевдоним S2. После этого эти псевдонимы можно применять в качестве имен таблиц. В операторе WHERE мы с названием каждого поля добавляем префикс S1, для того, чтобы СУБД понимала поля которой таблицы нужно выводить (поскольку мы из одной таблицы сделали две виртуальные). Предложение WHERE сначала объединяет таблицы, а затем фильтрует данные второй таблицы по полю Seller_name, чтобы вернуть только необходимые значения.

Самообъединения часто используют для замены подзапросов, которые выбирают данные из той же таблицы, что и внешний оператор SELECT. Хотя конечный результат получается тем самым, многие СУБД обрабатывают объединения гораздо быстрее подзапросов. Стоит поэкспериментировать, чтобы определить, какой запрос работает быстрее.

3. Естественное объединение

Естественное объединение — это объединение, в котором вы выбираете только те столбцы, которые не повторяются. Обычно это делается с помощью записи ( SELECT *) для одной таблицы и указанием перечня полей — для остальных таблиц. Например:

SELECT SP.*, S.Country

FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City

В этом примере метасимвол (*)
используется только для первой таблицы. Все остальные столбцы указаны явно, поэтому дубликаты столбцов не выбираются.

4. Внешнее объединение (OUTER JOIN)

Обычно при объединении связывают строки одной таблицы с соответствующими строками другой, однако в некоторых случаях может потребоваться включать в результат строки, не имеющие связанных строк в другой таблице (т.е. выбираются совершенно все строки из одной таблицы и добавляются только связанные строки из другой). Объединение такого типа называется внешним. Для этого используются ключевые слова OUTER JOIN … ON … с приставкой LEFT или RIGHT. Рассмотрим пример, предварительно добавив в таблицу Sellers нового продавца — Semuel Piter, который не имеет продаж:

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers LEFT OUTER JOIN Sumproduct ON Sellers.City=Sumproduct.City
GROUP BY Seller_name

Данным запросом мы вытащили перечень всех продавцов в базе и подсчитали для них общее количество проданного товара за все месяцы. Видим что по новому продавцу Semuel Piter отсутствуют продажи. Если бы мы использовали внутреннее объединение, то нового продавца мы бы не увидели, поскольку он не имеет записей в таблице Sumproduct. Мы можем изменять направление объединения не только прописывая
LEFT или RIGHT, но и просто меняя порядок таблиц (т. е. две записи будут давать одинаковый результат: Sellers LEFT OUTER JOIN Sumproduct та Sumproduct RIGHT OUTER JOIN Sellers).

Также некоторые СУБД позволяют осуществлять внешнее объединение по упрощенной записи, используя знаки * = и = * , что соответствует LEFT OUTER JOIN и RIGHT OUTER JOIN соответственно. Таким образом предыдущий запрос можно было бы переписать так:

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers. City *= Sumproduct.City

К сожалению Access не поддерживает сокращенную запись для внешнего объединения.

5. Полное внешнее объединение (FULL OUTER JOIN)

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

SELECT Seller_name, Product
FROM Sellers FULL OUTER JOIN Sumproduct ON Sellers.City=Sumproduct.City

Опять же, полное внешнее объединение не поддерживают такие СУБД: Access, MySQL, SQL Server и Sybase. Как обойти эту несправедливость, мы рассмотрим в следующем разделе.

Статьи по теме:

  • SQL-Урок 10. Объединение таблиц (INNER JOIN)
  • SQL-Урок 12. Комбинированные запросы (UNION)
  • старомодные JOINы @ 900913 — Цифровое наше всё

    Как лучше писать много-табличные запросы: просто перечисляя таблицы в SELECT через запятую, или же использовать JOIN?

    • Программы
    • MariaDB / MySQL
    • PostgreSQL
    • DataBase
    • Microsoft
    • Образование

    Перевод заметки Bad Habits to Kick : Using old-style JOINs.

    Уверен, многие ветераны SQL знают, что есть способ лучше, чем соединять таблицы в стиле ANSI-89 (через запятую):

    SELECT o.OrderID, od.ProductID
      FROM dbo.Orders AS o, dbo.OrderDetails AS od
      WHERE o.OrderDate >= '20091001'
      AND o.OrderID = od.ProductID;

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

    SELECT o.OrderID, od.ProductID
      FROM dbo.Orders AS o
      INNER JOIN dbo.OrderDetails AS od
        ON o.OrderID = od.ProductID
      WHERE o.OrderDate >= '20091001';

    Да, термин «проще» звучит субъективно, но по опыту данный подход экономит время при дальнейшей
    модификаций и поддержке кода запросов.

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

    Версия данного синтаксиса с OUTER JOIN (через *= и =*) во многих SQL серверах упразднена,
    так что это ещё одна причина избегать использования данного синтаксиса (через перечисление таблиц в SELECT).
    Многие помнят, как работают данные условия, но пометка «устаревшее» или отсутствие синтаксиса *= и =*
    всё же важный фактор. Опять же, лучше ключевыми словами описывать условия соединения во избежание двусмысленности:

    SELECT p.ProductName, p.ProductID
      FROM dbo.Products AS p
      LEFT OUTER JOIN dbo.OrderDetails AS od
        ON p.ProductID = od.ProductID
      WHERE od.ProductID IS NULL;

    Также есть задокументированные случаи, когда старомодные внешние соединения (аналоги * OUTER JOIN)
    выдавали неверные результаты в зависимости от порядка исполнения фильтрующих условий.
    Да, они сейчас объявлены устаревшими, где-то упразднены, но данный факт всё же показывает, что лучше не использовать
    старомодные соединения.

    Если вам ещё не достаточно причин отказаться от старых соединений… Вот ещё большая проблема в использовании
    неявного синтаксиса, когда условия соединения описываются там же, где и условия фильтрации.
    А что если вы просто забыли в списке прочих критериев указать критерий объединения?
    Вы неумышленно получаете CROSS JOIN (Декартово Произведение нескольких таблиц). Рассмотрим эту ситуацию на первом примере:

    SELECT o.OrderID, od.ProductID
      FROM dbo.Orders AS o, dbo.OrderDetails AS od
      WHERE o.OrderDate >= '20091001';

    Для каждого заказа из Orders с 1-го октября 2009-го года вы получите копию каждой строки
    из таблицы OrderDetails за всё время. Вы потеряли критерий соединения, поэтому для каждой строки из
    левой таблицы вы присоедините все строки из правой таблицы. Да, БД оптимизирует по критерию фильтрации, поэтому
    из левой таблицы вы возьмёте только лишь все заказы с октября 2009-го…

    Это может быть ужасная ошибка на боевом сервере – память от такого соединения быстро закончится, а сам сервер на некоторое
    время превратится в «тыкву».

    С другой стороны, вы могли узнать об этой ошибке ещё на моменте первого написания / тестирования данного кода.
    Если использовать явное указание соединения таблиц через INNER JOIN, база данных от вас потребует условие,
    так как синтаксис INNER JOIN требует указания условия соединения ON.

    Конечно, вы всё ещё можете «выстрелить себе в ногу», указав, например ON o.OrderID = o.OrderID.
    Но согласитесь, хорошо, когда синтаксис уменьшает количество вариантов ошибиться!

    Моя основная цель – помочь людям избавиться от вредных привычек, которые Майкрософт им прививает, публикуя
    примеры кода, использующие данный синтаксис. Это не проблема для ветеранов SQL (кроме тех, что не желают развиваться),
    тех, кто понимает, как соединения работают, и знает историю ANSI-89 и ANSI-92. Однако, новички в SQL могут
    встретить этот синтаксис в книжках или заметках в интернете.

    Введение и обзор предложения SQL Join

    Предложение SQL Join является одним из основных компонентов оператора Select, который используется для извлечения данных из SQL Server.

    Ключевое слово Select запускает оператор. За ним часто следует звездочка (*), также известная как знак, как его называют некоторые администраторы баз данных.

    Примечание. Для автоматического преобразования подстановочных знаков в явные столбцы см. раздел Как предотвратить проблемы с производительностью и ошибки из-за использования подстановочных знаков в операторах SELECT

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

    Начнем с определения. Объединение — это процесс получения данных из нескольких таблиц и помещения их в одно сгенерированное представление. Таким образом, предложение SQL Join в операторе Select объединяет столбцы из одной или нескольких таблиц в реляционной базе данных и возвращает набор данных.

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

    • Внутреннее соединение — это значение по умолчанию. Если мы не укажем тип соединения, по умолчанию оно будет внутренним соединением. Это означает, что если мы объединяем две таблицы в общем столбце, возвращаем только те данные, которые совпадают в обеих таблицах.
    • Левое соединение — этот тип соединения означает, что возвращаются все данные в левой таблице и только данные, соответствующие левой таблице, в правой таблице.
    • Правое соединение — этот тип соединения противоположен предыдущему. Это просто означает возврат данных из правой таблицы и только тех данных, которые соответствуют левой таблице.

    Выбор с помощью внутреннего соединения

    Давайте перейдем к SQL Server Management Studio (SSMS) и посмотрим, как мы можем работать с предложением SQL Join на реальных примерах. Ниже приведен пример объединения таблиц в общий столбец. В нашем образце базы данных AdventureWorks2012 у нас есть таблица «Product», в которой есть столбец «ProductID», а в таблице «SalesOrderDetail» у нас также есть столбец «ProductID». Итак, если мы хотим узнать общий объем продаж и скидки для каждого продукта и получить название, мы должны объединить эти два показателя в этом общем столбце:

    1

    2

    3

    4

    5

    6

    7

    8

    9 9 0003

    10

    ИСПОЛЬЗОВАТЬ AdventureWorks2012;

    GO

    SELECT p. Name AS ProductName,

    NonDiscountSales = (OrderQty * UnitPrice),

    Скидки = ((OrderQty * UnitPrice) * UnitPriceDiscount)

    FROM Production.Product AS p 90 003

    ПРИСОЕДИНЯЙТЕСЬ к Sales.SalesOrderDetail AS дерн

    ON p.ProductID = sod.ProductID

    ORDER BY ProductName DESC;

    ГО

    Обратите внимание, что если вы просто укажете Join отдельно, без ключевого слова Inner в предложении SQL Join, оно все равно будет внутренним соединением. Вы можете, конечно, поместить ключевое слово Inner для ясности, но если нет соединения левого и правого тегов, по умолчанию будет просто внутреннее соединение:

    Выбор с помощью левого соединения

    Теперь давайте взглянем на левое внешнее соединение, которое дает нам все из левой таблицы и только те записи, которые совпадают в правой таблице. В нашем примере приведенный ниже запрос даст нам людей, которые не совершали покупок:

    SELECT *

    FROM Person. Person p

    LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID

    Левое соединение возвращает все записи, даже если они не существуют, и помещает значение Null, если оно не существует:

    Набор результатов показывает, что возвращено 19972 записи, и у нас есть куча нулей в столбце «BusinessEntityID». Строки с нулевыми значениями — это люди, которые не совершали покупок.

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

    SELECT *

    FROM Person.Person p

         LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc. BusinessEntityID

         JOIN Sales.CreditCard cc ON pcc.Credit CardID = cc.CreditCardID;

    На этот раз запрос возвращает 19 118 записей вместо предыдущих 19 972:

    Вот как SQL Join с левым тегом может нам помочь. Если мы хотим включить записи и иметь полный подсчет людей, даже если они не совершали покупок, просто присоединитесь ко второму пункту:

    SELECT *

    FROM Person.Person p

         LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID

         LEFT JOIN Sales.CreditCard cc ON pcc .CreditCardID = cc.CreditCardID;

    Мы видим, что все, кто не совершил покупку, имеют нулевую запись для таблиц «CreditCard» и «PersonCreditCard», так как мы присоединились к ним:

    Кроме того, мы можем выделить всех тех людей, которые не совершили покупку, еще больше расширив предложение SQL Join и выполнив поиск нулевых значений с предложением Where:

    SELECT *

    FROM Person. Person p

         LEFT JOIN Sales.PersonCreditCard pcc ON p.BusinessEntityID = pcc.BusinessEntityID

         LEFT JOIN Sales.CreditCard cc ON pcc .CreditCardID = cc.CreditCardID

    ГДЕ pcc.BusinessEntityID IS NULL;

    Если мы запустим это, мы получим 854 записи или, как упоминалось выше, всех, кто не совершил покупку:

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

    Выбор с помощью правого соединения

    Теперь предложение SQL Join с правым соединением является полной противоположностью левого соединения. Они в основном делают одно и то же. Левое — это право, а право — это лево, и тот же эффект можно получить, просто переворачивая столы. Правильные соединения никоим образом не устарели, они просто не слишком распространены. Ради согласованности обычно используется левое соединение вместо правого.

    Заключение и общая практика

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

    В дополнение к этому вы также увидите внешние и перекрестные типы соединений. Внешнее соединение имеет 3 разных типа:

    1. Левое внешнее соединение — извлекает записи, если они есть в левой таблице
    2. Правое внешнее соединение — извлекает записи, если они есть в правой таблице
    3. Полное внешнее соединение — извлекает записи, если они есть в любой из двух таблиц
    1. Перекрестное соединение — как следует из названия, делает [n X m], которое соединяет все со всем. Подобно сценарию, в котором мы просто перечисляем таблицы для объединения (в предложении From оператора Select), используя запятые для их разделения.

    Обратите внимание:

    • Если вы просто укажете Присоединение, то по умолчанию это Внутреннее соединение.
    • Внешнее соединение должно быть левым/правым/полным. Вы не можете просто сказать Outer join и оставить его там
    • Вы можете отбросить ключевое слово Outer и просто сказать «Левое соединение», «Правое соединение» или «Полное соединение».

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

    Я надеюсь, что эта статья была информативной для вас, и я благодарю вас за чтение.

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

    Боян Петрович

    Боян ака «Бокси», выпускник AP в области ИТ-технологий, специализирующийся на сетях и электронных технологиях Копенгагенской школы дизайна и технологий, является аналитиком программного обеспечения с опытом работы в области качества. гарантия, поддержка программного обеспечения, пропаганда продукта и вовлечение пользователей.

    Он много писал как для SQL Shack, так и для ApexSQL Solution Center по различным темам, от клиентских технологий, таких как разрешение 4K и тематика, обработка ошибок до стратегий индексирования и мониторинга производительности.

    Боян работает в ApexSQL в Нише, Сербия, как неотъемлемая часть команды, занимающейся проектированием, разработкой и тестированием следующего поколения инструментов баз данных, включая MySQL и SQL Server, а также как автономных инструментов, так и интеграций в Visual Studio, SSMS. и VSCode.

    Подробнее о Бояне на LinkedIn

    Просмотреть все сообщения Бояна Петровича

    Последние сообщения Бояна Петровича (посмотреть все)

    SQL Joins | Внутреннее, левое, правое и полное соединение

    Содержание

    Для управления данными, хранящимися в СУБД, или потоковой обработки в реляционной системе управления потоками данных программисты используют предметно-ориентированный язык SQL (язык структурированных запросов). Среди многих полезных функций SQL есть SQL Joins . Сопоставляя значения, общие для обеих таблиц, JOIN позволяет вам комбинировать поля из двух таблиц. У нас есть соединений в SQL для реализации соединений для объединения данных из двух или более таблиц в базе данных.

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

    Содержание

    • Соединения SQL
    • Типы соединений SQL
      • Внутреннее соединение 90 020
      • Левое соединение
      • Правое соединение
      • Полное соединение
    • SQL JOIN и псевдонимы
    • Примеры
    • Заключение
    • Рекомендуемые статьи

    Соединения SQL

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

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

      Читайте также- Функции SQL: агрегатные и скалярные функции с примерами  ВЫБРАТЬ *COLUMN_NAMES* ИЗ TABLE1 ПРИСОЕДИНИТЬСЯ К TABLE2ON TABLE1. COMMON_COL =TABLE2.COMMOM_COL  

    ПРИМЕЧАНИЕ. По умолчанию предложение JOIN выполняет операцию внутреннего соединения таблиц.

    Взгляните на следующие две таблицы, которые мы будем использовать здесь для цитирования примеров в случае каждого присоединиться к SQL . Таблица 1: Таблица учителя 018 ТЕМА КОНТАКТЫ 1014 РАНДЖАНА ХАННА АНГЛИЙСКИЙ 953545 5433 1012 СОНАМ МАРЬЯ МАТЕМАТИКА 8736653542 1021 ВИШАЛ ПАТХАК ХИНДИ 9865356277 1015 МАНДЖУЛАТА СИНГХ ЭКОНОМИКА 8736363 721 1013 МРИНАЛИНИ СИНГХ ФИЗИКА 7865634243 1026 9 0069

    ПРЕТИ РАХЕЯ ХИМИЯ 9735662523 1019 MRIDUL BAJPAYEE СЧЕТА 7892125688 90 070 1020 MADHU SONKER БИОЛОГИЯ 9563819230

    Таблица 2: Стол отдела

    9037 3

    9007 0 ФИЗИКА

    900 70 СОНАМ МАРЬЯ

    DPT_ID ТЕМА ГОЛОВА
    501 НАИНА БАНСАЛ
    502 ХИМИЯ АНКУР СИНХА
    503 МАТЕМАТИКА
    504 АНГЛИЙСКИЙ КИРАН ДЖОШИ
    505 ХИНДИ ВИШАЛ ПАТХАК 900 69
    506 ЭКОНОМИКА КИРАН СРИВАСТАВА
    507 ИСТОРИЯ МИНАКШИ ПАЛ
    508 ГЕОГРАФИЯ ШРАВАН СИНГХ
    509 CIVICS ЛАЛИТА БХАРДВАДЖ
    510 СЧЕТА НИКХИЛ МЭТЬЮС
    511 БИОЛОГИЯ БИНА БАСУ
    512 ЛИНГВИСТИЧЕСКИЙ  МАНИША ДИКСИТ

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

    Пример:

      ВЫБЕРИТЕ * ИЗ ОТДЕЛА ПРИСОЕДИНИТЬСЯ К УЧИТЕЛЮ ОТДЕЛ.ТЕМА = УЧИТЕЛЬ.ТЕМА;  

    Вывод:

    ПРИМЕЧАНИЕ. Мы можем напрямую написать нужные имена столбцов в предложении FROM, если в списке нет общего столбца.

    Теперь, когда вы получили общее представление о том, что такое соединений в SQL и как работает запрос на соединение в SQL , давайте углубимся в различные типы соединений SQL .

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

    Как упоминалось ранее, в основном существует четыре типа присоединяется к SQL . Четыре типа соединений SQL были зачислены ниже:

    1. Внутреннее соединение
    2. Левое соединение
    3. Правое соединение
    4. Полное соединение

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

    Внутреннее соединение

    Внутреннее соединение используется для выбора всех строк из 2 или более таблиц в зависимости от выполнения условия совпадения столбцов. У нас есть предложение INNER JOIN в SQL для реализации внутреннего соединения двух таблиц. Он генерирует результирующий набор, состоящий из всех строк из обеих таблиц, где значение общего поля одинаково в обеих таблицах. Ниже приведен синтаксис для написания запроса INNER JOIN в SQL:

    Синтаксис:

     
    SELECT * FROM table_1 INNER JOIN table_2ON table_1.common_column = table_2.common_column;
    Или
    ВЫБЕРИТЕ table_1.column_1, table_1.column_2, …, table_2.column_1, table_2.column_2,… FROM table_1 INNER JOIN table_2ON table_1.common_column = table_2.common_column;  

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

    Пример 1:

    Теперь давайте попробуем выполнить запрос INNER JOIN для двух таблиц — таблицы TEACHER и таблицы DEPARTMENT.

      ВЫБЕРИТЕ * ОТ ОТДЕЛА ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ К УЧИТЕЛЮ ОТДЕЛ.ТЕМА = УЧИТЕЛЬ.ТЕМА;  

    Вывод:

    Пример 2:

      ВЫБЕРИТЕ УЧИТЕЛЯ.ИМЯ_УЧИТЕЛЯ, ИД ОТДЕЛА.ИДЕНТИФИКАТОР ОТДЕЛА, УЧИТЕЛЬ.ТЕМА ОТ УЧИТЕЛЯ, ВНУТРЕННЕГО ПРИСОЕДИНЯЙТЕСЬ К ОТДЕЛУ.  

    Вывод:

    Как видно из выходных снимков, используя * вместо имен столбцов, мы получаем все столбцы из обеих таблиц. В другом случае мы выбрали поле TEACHER_NAME из таблицы TEACHER, поле DPT_ID из таблицы DEPARTMENT и поле SUBJECT из любой из таблиц. Выбранные строки отображаются в том порядке, в котором они используются в операторе SELECT.

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

    При левом соединении возвращаются строки, соответствующие таблице с правой стороны соединения, вместе со всеми строками из таблицы с левой стороны соединения. У нас есть предложение LEFT JOIN для выполнения левого соединения двух таблиц в SQL. Набор результатов будет включать null для всех строк левой таблицы, для которых нет соответствующей строки в правой части. LEFT OUTER JOIN — это другое название LEFT JOIN . Давайте посмотрим на его синтаксис, приведенный ниже.

    Синтаксис:

      SELECT * FROM table_1 LEFT JOIN table_2ON table_1.common_column = table_2.common_column;
    Или
    ВЫБЕРИТЕ table_1.column_1, table_1.column_2, …, table_2.column_1, table_2.column_2,… FROM table_1 LEFT JOIN table_2ON table_1.common_column = table_2.common_column;  

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

    Взгляните на следующие примеры, чтобы лучше понять левое соединение в SQL .

    Пример 1:

      ВЫБЕРИТЕ * ОТ УЧИТЕЛЯВЛЕВО ПРИСОЕДИНЯЙТЕСЬ К ОТДЕЛУНА ОТДЕЛУ.ТЕМА = УЧИТЕЛЬ.ТЕМА;  

    Вывод:

    Здесь, поскольку мы указали таблицу TEACHER в левой части предложения LEFT JOIN, все записи из этой таблицы были выбраны. Для преподавателя SONAM MAURYA нет соответствующих сведений об отделе, поэтому поля таблицы DEPARTMENT оставлены пустыми (нулевыми) для TEACHER_NAME SONAM MAURYA.

    Теперь попробуем поместить таблицу DEPARTMENT в левую часть предложения LEFT JOIN.

    Пример 2:

      ВЫБЕРИТЕ * ОТ ОТДЕЛА СЛЕВА ПРИСОЕДИНЯЙТЕСЬ К УЧАСТНИКУ ОТДЕЛ.ТЕМА = УЧИТЕЛЬ. ТЕМА;  

    Вывод:

    Нет, как видно из выходного снимка, показаны все записи из таблицы DEPARTMENT. И записи таблицы DEPARTMENT, для которых нет соответствующих записей таблицы TEACHER, имеют значение NULL, которое также отображается с пустой ячейкой в ​​некоторых редакторах SQL.

    Пример 3:

      Select Depart.dpt_ID, учитель.teacher_id, департамент.subjectfom Department Left Depany Department.subject = учитель.subject;  

    Вывод:

    Итак, в этом примере мы имеем DEPARTMENT в левой части предложения LEFT JOIN, и мы написали DEPARTMENT.SUBJECT в предложении SELECT. Следовательно, все его записи DPT_ID и SUBJECT отображаются в результатах запроса. Теперь, если вы заметили, что в столбце SUBJECT таблицы TEACHER не так много записей, но, поскольку мы выбрали SUBJECT из таблицы DEPARTMENT, все предметы, присутствующие в таблице DEPARTMENT, можно увидеть в наборе результатов.

    Здесь, в этом примере, мы использовали TEACHER.SUBJECT вместо DEPARTMENT.SUBJECT с предложением SELECT. Следовательно, есть несколько пустых ячеек или ячеек со значением NULL в результирующем поле SUBJECT, которое было выбрано из таблицы TEACHER.

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

    Правое соединение прямо противоположно левому соединению по направлению. У нас есть предложение RIGHT JOIN для выполнения операции правильного соединения в SQL. Когда мы хотим, чтобы все записи из таблицы были справа от предложения RIGHT JOIN, мы просто используем правильный присоединиться к SQL . Для строк из правой таблицы, которые не имеют соответствующих значений в левой таблице, поля левой таблицы для этих записей пусты или пусты. Синтаксис использования предложения RIGHT JOIN в SQL приведен ниже.

    Синтаксис:

      SELECT * FROM table_1 RIGHT JOIN table_2ON table_1.common_column = table_2.common_column;
    Или
    ВЫБЕРИТЕ table_1. column_1, table_1.column_2, …, table_2.column_1, table_2.column_2,… FROM table_1 RIGHT JOIN table_2ON table_1.common_column = table_2.common_column;
      

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

    Пример 1:

      ВЫБЕРИТЕ * ИЗ DEPARTMENTRIGHT JOIN TEACHERON DEPARTMENT.SUBJECT = TEACHER.SUBJECT;  

    Вывод:

    Как видите, столбцы DPT_ID и HEAD таблицы DEPARTMENT имеют значения NULL для TEACHER_ID 1012. Это связано с тем, что все записи из правой таблицы, т. е. таблицы TEACHER, были включены. Этот результирующий набор аналогичен результату левого соединения с переставленными позициями для таблиц ( Пример-1 левого соединения).

    Пример 2:

      ВЫБЕРИТЕ * ИЗ ПРАВА УЧИТЕЛЯ ПРИСОЕДИНИТЬСЯ К ОТДЕЛУ НА УЧИТЕЛЯ. ТЕМА = ОТДЕЛ.ТЕМА;  

    Вывод:

    Поскольку таблица DEPARTMENT является правильной таблицей, все записи таблицы были отображены. Для строк таблицы DEPARTMENT, для которых нет соответствующих записей в таблице TEACHER, в столбцах таблицы TEACHER отображаются значения NULL.

    Пример 3

      ВЫБЕРИТЕ УЧИТЕЛЬ.ИДЕНТИФИКАТОР_ПРЕПОДАВАТЕЛЯ, ИДЕНТИФИКАТОР ОТДЕЛА.ИДЕНТИФИКАТОР ОТДЕЛА, УЧИТЕЛЬ.СУБЪЕКТ ОТ ОТДЕЛА ПРАВО ПРИСОЕДИНИТЬСЯ К ОТДЕЛУ УЧИТЕЛЬ.  

    Вывод:

    Теперь, когда вы поняли, как работает запрос соединения RIGHT в SQL , вы знаете, как генерируется вышеприведенный вывод. Давайте попробуем запустить еще один пример SQL-запроса RIGHT JOIN, в котором выбираются только некоторые столбцы из обеих таблиц, а таблица DEPARTMENT берется как правильная.

    Пример 4

    Выходные данные:

    В этом примере, поскольку был выбран столбец SUBJECT из таблицы DEPARTMENT, которая находится справа, отсутствуют значения NULL. Если бы мы выбрали столбец SUBJECT из таблицы TEACHER, в результирующем наборе было бы 5 значений NULL, соответствующих TEACHER_ID с NULL.

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

    Когда мы хотим интегрировать результаты как LEFT JOIN, так и RIGHT JOIN для получения набора результатов, мы используем полное соединение. Для реализации полного соединения в SQL у нас есть предложение FULL JOIN для двух таблиц. Все строки из обеих таблиц включены в набор результатов. Набор результатов будет содержать значения NULL для строк, в которых совпадений не было.

    Синтаксис для ПОЛНОГО СОЕДИНЕНИЯ в SQL приведен ниже:

      SELECT * FROM table_1 FULL JOIN table_2ON table_1.common_column = table_2.common_column;
    Или
    ВЫБЕРИТЕ table_1.column_1, table_1.column_2, …, table_2.column_1, table_2.column_2,… FROM table_1 FULL JOIN table_2ON table_1.common_column = table_2.common_column;  

    Для ясности попробуем выполнить запрос FULL JOIN для двух таблиц, TEACHER и DEPARTMENT.

    Пример 1:

     
    SELECT * FROM DEPARTMENTFULL JOIN TEACHERON DEPARTMENT.SUBJECT = TEACHER.SUBJECT  

    Вывод:

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

    Пример 2:

      ВЫБЕРИТЕ ПРЕПОДАВАТЕЛЯ.ИДЕНТИФИКАТОР_ПРЕПОДАВАТЕЛЯ, ИДЕНТИФИКАТОР ОТДЕЛА, УЧИТЕЛЬ.ПРЕПОДАВАТЕЛЬ ИЗ ОТДЕЛА. 0019 

    Вывод:

    В этом примере как следует из выходных данных, все записи из таблиц TEACHER и DEPARTMENT составляют результирующий набор. Но поскольку вместо DEPARTMENT.SUBJECT мы написали TEACHER.SUBJECT, отображались только те предметы, для которых дана запись TEACHER, а остальные ячейки SUBJECT показывают значения NULL.

    Другие названия полного соединения: полное внешнее соединение и внешнее соединение. Мы можем выполнять ту же функцию, что и при использовании предложения FULL JOIN, с помощью предложения OUTER JOIN.

    Соединения и псевдонимы SQL

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

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

    Синтаксис для псевдонима таблицы

      ВЫБРАТЬ столбец1, столбец2, столбец3, … ИЗ имя_таблицы AS имя_псевдонима;  

    Синтаксис для псевдонима столбца

      ВЫБЕРИТЕ столбец 1 КАК псевдоним_имя1, столбец2 КАК псевдоним_имя2 ИЗ имя_таблицы;  

    Пример псевдонима таблицы:

      ВЫБЕРИТЕ DPT_ID, ТЕМУ, НАЧАЛЬНИК ОТДЕЛА КАК DPT;  

    Вывод:

    Пример псевдонима столбца:

      ВЫБЕРИТЕ TEACHER_ID КАК ИДЕНТИФИКАТОР, КОНТАКТЫ КАК PH ОТ УЧИТЕЛЯ;  

    Результат:

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

    Синтаксис объединения с псевдонимом:

      ВЫБРАТЬ table1_alias.column1 AS column1_alias, table2_alias.column2_alias, …..FROM table1 AS table1_aliasJOIN table2 AS table2_aliasON table 1_alias.matching_column = table2_alias.matching_column  

    Пример Присоединиться с псевдонимом:

      ВЫБРАТЬ TCH.TEACHER_ID AS TID, DT.DPT_ID AS DID FROM DEPARTMENT AS DTOUTER ПРИСОЕДИНИТЬСЯ К УЧИТЕЛЮ AS TCHON DT.SUBJECT = TCH.SUBJECT  

    Вывод:                 900 08

    Как видно из приведенного выше примера, у нас есть используемые псевдонимы столбцов и таблиц в одном запросе JOIN. Мы выбрали столбец TEACHER_ID из TEACHER и назвали его TID, DPT_ID из DEPARTMENT и назвали его DID. Теперь мы также использовали два псевдонима для двух таблиц, по одному для каждой: TCH — это псевдоним для таблицы TEACHER, а DT — это псевдоним для таблицы DEPARTMENT.

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

    Использование псевдонимов имеет следующие преимущества:

    • Написание запросов, в которых нам необходимо писать имена таблиц или столбцов дважды или более раз, экономит время и становится менее утомительной
    • Псевдонимы используются для повышения удобочитаемости запроса.
    • Псевдонимы можно использовать для предоставления удобных имен таблицам или столбцам в запросе.
    • Использование псевдонимов таблиц позволяет сделать запрос менее запутанным.
    • Псевдонимы столбцов можно использовать для создания подходящего имени для столбца в запросе.
    • Запросы JOIN становятся менее длинными при использовании псевдонимов таблиц.

    Примеры

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

    Например, давайте создадим еще одну таблицу PROGRAM:

    Пример 1: ПРИСОЕДИНЕНИЕ ОТДЕЛА И ПРОГРАММЫ, ГДЕ DPT_ID И DPT_NAME ЯВЛЯЮТСЯ СООТВЕТСТВУЮЩИМИ СТОЛБЦАМИ

      SELECT * FROM DEPARTMENTJOIN PROGRAMON DEPARTMENT.DPT_ID = PROGRAM.DPT_NAME;  

    Вывод:

    Пример 2: ОБЪЕДИНЕНИЕ ТРЕХ ТАБЛИЦ – ПРЕПОДАВАТЕЛЬ, ОТДЕЛЕНИЕ И ПРОГРАММА

      ВЫБЕРИТЕ TEACHER_ID, TEACHER. TEACHER_NAME, FUNC_NAME ИЗ ОТДЕЛА D ПРИСОЕДИНЯЙТЕСЬ К ПРОГРАММЕ PON D.DPT_ID = P. DPT_NAME ПРИСОЕДИНЯЙТЕСЬ К УЧИТЕЛЮ D.SUBJECT = TEACHER.SUBJECT;  

    Выход:

    Таблица TEACHER не имеет прямой связи с таблицей PROGRAM, так как нет соответствующих столбцов. Но и таблица TEACHER, и таблица PROGRAM связаны с таблицей DEPARTMENT через столбец SUBJECT и столбец DPT_ID соответственно.

    В этом примере показан еще один интересный способ создания псевдонимов. Вместо использования предложения AS мы прямо дали временные имена таблицам DEPARTMENT и PROGRAM как D и P соответственно для написания запроса.

    Необходимо было прикрепить имя таблицы вместе со столбцом TEACHER_NAME, так как в таблице PROGRAM также есть столбец TEACHER_NAME, и это могло привести к неоднозначности. Поскольку TEACHER_ID и FUNC_NAME — это два разных столбца, которые принадлежат исключительно таблицам TEACHER и PROGRAM, нам не нужно записывать имена таблиц вместе с этими столбцами.

    Пример 3: ПРИСОЕДИНЯЙТЕСЬ К УЧИТЕЛЮ И ОТДЕЛУ, СООТВЕТСТВУЯ ИМЯ УЧИТЕЛЯ И ГОЛОВНОЙ КОЛОННЕ

      ВЫБЕРИТЕ TEACHER_ID, T.TEACHER_NAME, DPT_ID, D.SUBJECTFROM УЧИТЕЛЬ ПРИСОЕДИНЯЕТСЯ К ОТДЕЛУ КАК DON T.TEACHER_NAME = D.HEAD ;  

    Вывод:

    Здесь показаны только те записи из обеих таблиц, для которых значение поля TEACHER_NAME равно значению поля HEAD.

    Пример 3: ПРИСОЕДИНЯЙТЕСЬ К ТРЕМ ТАБЛИЦАМ И ИСПОЛЬЗУЙТЕ УСЛОВИЕ WHERE

      ВЫБЕРИТЕ TEACHER_ID, T.TEACHER_NAME, FUNC_NAMEFROM DEPARTMENT D JOIN PROGRAM PON D.DPT_ID = P.DPT_NAME ПРИСОЕДИНЯЙТЕСЬ К УЧИТЕЛЮ TON D.SUBJECT = T.SUBJECTWHERE T.TEACHER_NAME НРАВИТСЯ "%A";  

    Помимо использования JOIN и псевдонимов, мы также отфильтровали набор результатов, используя ограничение. Мы использовали предложение WHERE, чтобы отфильтровать записи из трех таблиц, чтобы имя учителя заканчивалось на «А».