Sql select join примеры: JOIN (SQL) — что это за оператор, примеры использования

Содержание

Left join (SQL) — пример, подробное описание, ошибки использования

В любой реальной реляционной базе данных вся информация распределяется по отдельным таблицам. Многие из таблиц имеют зафиксированные в схеме установленные связи друг с другом. Однако с помощью запросов Sql вполне реально проложить связь между данными, не заложенную в схеме. Это осуществляется путем выполнения операции соединения join, которая позволяет выстроить отношения между любым количеством таблиц и соединить даже, казалось бы, разрозненные данные.

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

Подготовка необходимых таблиц

Допустим, в нашей базе данных имеется информация о людях и их недвижимом имуществе. Основная информация основывается на трех таблицах: Peoples (люди), Realty (недвижимость), Realty_peoples (таблица с отношениями, кому из людей какая недвижимость принадлежит). Предположим, в таблицах хранятся следующие данные по людям:

Peoples

id

L_name

F_name

Middle_name

Birthday

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

4

Аннина

Любовь

Павловна

31. 12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

6

Герасимовский

Олег

Альбертович

29.01.1985

7

Сухановский

Юрий

Андреевич

25.09.1976

8

Сухановская

Юлия

Юрьевна

01.10.2001

По недвижимости:

Realty

id

address

1

г. Архангельск, ул. Воронина, д. 7, кв.6

2

г. Архангельск, ул. Северодвинская, д. 84, кв. 9, комн. 5

3

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

4

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

5

г. Архангельск, пл. Терехина, д. 89, кв. 13

По отношениям люди — недвижимость:

Realty_peoples

id_peoples

id_realty

type

7

3

Общая совместная собственность

8

3

Общая совместная собственность

3

5

Собственность

7

1

Собственность

5

4

Общая долевая собственность

6

4

Общая долевая собственность

Left join (Sql) – описание

Левое соединение имеет следующий синтаксис:

Table_A LEFT JOIN table_B [{ON предикат} | {USING список_столбцов}]

И схематично выглядит так:

И переводится данное выражение как «Выбрать все без исключения строки из таблицы А, а из таблицы В вывести только совпадающие по предикату строки. Если в таблице В не нашлось пары для строк таблицы А, то заполнить результирующие столбцы Null — значениями».

Чаще всего при выполнении левого соединения указывается ON, USING используют, лишь когда названия столбцов, по которым планируется выполнить соединение, совпадают.

Left join — примеры использования

С помощью левого соединения мы можем посмотреть, у всех ли людей из списка Peoples имеется недвижимость. Для этого выполним следующий в left join sql пример запроса:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type

FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples;

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

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

1

Иванова

Дарья

Борисовна

16. 07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29. 01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

1

Собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Как видим, у Ивановой Дарьи, Пугина Владислава и Анниной Любови нет зарегистрированных прав на недвижимость.

А что бы мы получили, используя внутреннее соединение Inner join? Как известно, оно исключает несовпадающие строки, поэтому три человека из нашей итоговой выборки просто бы выпали:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29. 01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

1

Собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Казалось бы, второй вариант так же отвечает условиям нашей задачи. Однако, если мы дальше начнем присоединять еще и еще таблицы, три человека из результата уже безвозвратно исчезнут. Поэтому на практике при объединении множества таблиц намного чаще используются соединения Left и Right, чем Inner join.

Продолжим рассматривать с left join sql примеры. Присоединим таблицу с адресами наших объектов недвижимости:

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type, Realty.address

FROM Peoples

LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples

LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty

Теперь мы получим не только вид права, но и адреса объектов недвижимости:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

address

1

Иванова

Дарья

Борисовна

16. 07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30.04.1964

5

Собственность

г. Архангельск, пл. Терехина, д. 89, кв. 13

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14. 03.1992

4

Общая долевая собственность

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

Архангельская область, г. Новодвинск, ул. Пролетарская, д. 16, кв. 137

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

7

Сухановский

Юрий

Андреевич

25. 09.1976

1

Собственность

г. Архангельск, ул. Воронина, д. 7, кв.6

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Архангельская область, г. Северодвинск, ул. Ленина, д. 134, кв. 85

Left join — типичные ошибки использования: неверный порядок таблиц

Основных ошибок, допускаемых при левом внешнем соединении таблиц, две:

  1. Неверно выбран порядок таблиц, из-за которого были потеряны данные.
  2. Ошибки при использовании Where в запросе с объединенными таблицами.

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

Если бы мы переставили таблицы в запросе местами, и начали бы с «… From Realty left join Peoples…» то ни одну недвижимость мы бы не потеряли, чего не скажешь о людях.

Однако не стоит, испугавшись левого соединения, переходить на полное внешнее, которое включит в результате и совпадающие, и не совпадающие строки.

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

Left join — типичные ошибки использования: правильность запроса при задании условий в Where

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

Вернемся к запросу, когда мы с помощью левого соединения получили данные по всем людям и имеющейся у них недвижимости. Вспомните следующий с применением left join sql пример:

FROM Peoples LEFT JOIN Realty_peoples ON Peoples. id = Realty_peoples.id_peoples;

Допустим, мы хотим уточнить запрос и не выводить данные, где тип права – «Собственность». Если мы просто допишем, применяя left join sql, пример следующим условием:

Where type <> «Собственность»

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

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29. 01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25.09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Чтобы предупредить появление ошибок по этой причине, лучше всего задать условие отбора сразу при соединении. Предлагаем рассмотреть следующий с left join sql пример.

SELECT Peoples.*, Realty_peoples.id_realty, Realty_peoples.type

FROM Peoples

LEFT JOIN Realty_peoples ON (Peoples. id = Realty_peoples.id_peoples AND type <> «Собственность»)

Результат будет следующим:

Запрос1

id

L_name

F_name

Middle_name

Birthday

id_realty

type

1

Иванова

Дарья

Борисовна

16.07.2000

2

Пугин

Владислав

Николаевич

29.01.1986

3

Евгеньин

Александр

Федерович

30. 04.1964

4

Аннина

Любовь

Павловна

31.12.1989

5

Герасимовская

Надежда

Павловна

14.03.1992

4

Общая долевая собственность

6

Герасимовский

Олег

Альбертович

29.01.1985

4

Общая долевая собственность

7

Сухановский

Юрий

Андреевич

25. 09.1976

3

Общая совместная собственность

8

Сухановская

Юлия

Юрьевна

01.10.2001

3

Общая совместная собственность

Таким образом, выполнив простой с left join sql пример, мы получили список из всех людей, выведя дополнительно, у кого из них недвижимость в долевой/совместной собственности.

В качестве вывода хотелось бы еще раз подчеркнуть, что к выборке любой информации из базы данных нужно отнестись ответственно. Многие нюансы открыл перед нами с применением left join sql простой пример, объяснение которым одно – перед тем как приступить к составлению даже элементарного запроса, необходимо тщательно разобраться, что именно мы хотим получить в итоге. Удачи!

SQL запрос | Community Creatio

Есть потребность выводить в реестр Контрагентов юридическое наименование и ИНН. Я в запросе для контрагента делаю следующее:
SELECT
[tbl_Account].[ID] AS [ID],
[tbl_Account].[Name] AS [Name],
[tbl_Account].[OfficialAccountName] AS [OfficialAccountName],
[tbl_Account].[AnnualRevenue] AS [AnnualRevenue],
[tbl_Account].[EmployeesNumber] AS [EmployeesNumber],
[tbl_Account].[Address] AS [Address],
[tbl_Account].[AddressTypeID] AS [AddressTypeID],
[tbl_Account].[Communication1] AS [Communication1],
[tbl_Account].[Communication1TypeID] AS [Communication1TypeID],
[tbl_Account].[Communication2] AS [Communication2],
[tbl_Account].[Communication2TypeID] AS [Communication2TypeID],
[tbl_Account].[Communication3] AS [Communication3],
[tbl_Account].[Communication3TypeID] AS [Communication3TypeID],
[tbl_Account].[Communication4] AS [Communication4],
[tbl_Account].[Communication4TypeID] AS [Communication4TypeID],
[tbl_Account].[Communication5] AS [Communication5],
[tbl_Account].[Communication5TypeID] AS [Communication5TypeID],
[tbl_City]. [Name] AS [CityName],
[tbl_Account].[CityID] AS [CityID],
[tbl_Account].[ZIP] AS [ZIP],
[tbl_Campaign].[Name] AS [CampaignName],
[tbl_Account].[CampaignID] AS [CampaignID],
[tbl_Contact].[Name] AS [PrimaryContactName],
[tbl_Account].[PrimaryContactID] AS [PrimaryContactID],
[tbl_Country].[Name] AS [CountryName],
[tbl_Account].[CountryID] AS [CountryID],
[tbl_State].[Name] AS [StateName],
[tbl_Account].[StateID] AS [StateID],
[tbl_Territory].[Name] AS [TerritoryName],
[tbl_Account].[TerritoryID] AS [TerritoryID],
[Owner].[Name] AS [OwnerName],
[tbl_Account].[OwnerID] AS [OwnerID],
[tbl_Account].[ActivityID] AS [ActivityID],
[tbl_Activity].[Name] AS [ActivityName],
[tbl_Account].[FieldID] AS [FieldID],
[tbl_Field].[Name] AS [FieldName],
[tbl_Account].[AccountTypeID] AS [AccountTypeID],
[tbl_AccountType].[Name] AS [AccountTypeName],
[tbl_AddressType].[Name] AS [AddressTypeName],
[CommunicationType1].[Name] AS [Communication1TypeName],
[CommunicationType2]. [Name] AS [Communication2TypeName],
[CommunicationType3].[Name] AS [Communication3TypeName],
[CommunicationType4].[Name] AS [Communication4TypeName],
[CommunicationType5].[Name] AS [Communication5TypeName],
[tbl_Account].[Code] AS [Code],
[tbl_Account].[TaxRegistrationCode] AS [TaxRegistrationCode],
[tbl_Account].[CreatedOn] AS [CreatedOn],
[tbl_Account].[CreatedByID] AS [CreatedByID],
[CreatedBy].[Name] AS [CreatedByName],
[tbl_Account].[ModifiedOn] AS [ModifiedOn],
[tbl_Account].[ModifiedByID] AS [ModifiedByID],
[ModifiedBy].[Name] AS [ModifiedByName],
[tbl_Job].[NameOf] AS [JobNameOf],
[tbl_Account].[SettledCredit] AS [SettledCredit],
[tbl_Account].[PostponementPayment] AS [PostponementPayment],
NULL AS [UID1C],
NULL AS [Object1C],
[tbl_Account].[SiteID] AS [SiteID],
[tbl_Account].[IsActive] AS [IsActive],
[tbl_Account].[DoNotCall] AS [DoNotCall],
[vw_AppealInfo].[AppealDate] AS [AppealDate],
[vw_AppealInfo]. [AppealStatusID] AS [AppealStatusID],
[AITaskStatus].[Status] AS [AppealStatus],
[vw_AppealInfo].[AppealTypeID] AS [AppealTypeID],
[AITaskType].[Name] AS [AppealTypeName],
[vw_LoyaltyInfo].[LoyContDate] AS [LoyContDate],
[vw_LoyaltyInfo].[LoyContTypeID] AS [LoyContTypeID],
[LITaskType].[Name] AS [LoyContTypeName],
[vw_LoyaltyInfo].[LoyOrderNum] AS [LoyOrderNum],
[vw_LoyaltyInfo].[LoyResultID] AS [LoyResultID],
[LITaskResult].[Result] AS [LoyResultName],
[vw_LoyaltyInfo].[LoyComment] AS [LoyComment],
[vw_LoyaltyRepInfo].[LoyRepCallDate] AS [LoyRepCallDate],
[vw_ReminderInfo].[RemContDate] AS [RemContDate],
[vw_ReminderInfo].[RemContTypeID] AS [RemContTypeID],
[RITaskType].[Name] AS [RemContTypeName],
[vw_ReminderInfo].[RemOrderNum] AS [RemOrderNum],
[vw_ReminderInfo].[RemResultID] AS [RemResultID],
[RITaskResult].[Result] AS [RemResultName],
[vw_ReminderInfo].[RemComment] AS [RemComment],
[vw_ReminderRepInfo].[RemRepCallDate] AS [RemRepCallDate],
[tbl_Account]. [SitePaymentRecID] AS [SitePaymentRecID],
[tbl_AccountBillingInfo].[INN] AS [INN],
[tbl_AccountBillingInfo].[Name] AS [NameUr]

FROM
[dbo].[tbl_Account] AS [tbl_Account]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [tbl_Contact] ON [tbl_Contact].[ID] = [tbl_Account].[PrimaryContactID]
LEFT OUTER JOIN
[dbo].[tbl_Territory] AS [tbl_Territory] ON [tbl_Territory].[ID] = [tbl_Account].[TerritoryID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [Owner] ON [Owner].[ID] = [tbl_Account].[OwnerID]
LEFT OUTER JOIN
[dbo].[tbl_Campaign] AS [tbl_Campaign] ON [tbl_Campaign].[ID] = [tbl_Account].[CampaignID]
LEFT OUTER JOIN
[dbo].[tbl_City] AS [tbl_City] ON [tbl_City].[ID] = [tbl_Account].[CityID]
LEFT OUTER JOIN
[dbo].[tbl_State] AS [tbl_State] ON [tbl_State].[ID] = [tbl_Account].[StateID]
LEFT OUTER JOIN
[dbo].[tbl_Country] AS [tbl_Country] ON [tbl_Country].[ID] = [tbl_Account].[CountryID]
LEFT OUTER JOIN
[dbo].[tbl_Activity] AS [tbl_Activity] ON [tbl_Activity]. [ID] = [tbl_Account].[ActivityID]
LEFT OUTER JOIN
[dbo].[tbl_Field] AS [tbl_Field] ON [tbl_Field].[ID] = [tbl_Account].[FieldID]
LEFT OUTER JOIN
[dbo].[tbl_AccountType] AS [tbl_AccountType] ON [tbl_AccountType].[ID] = [tbl_Account].[AccountTypeID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [CreatedBy] ON [CreatedBy].[ID] = [tbl_Account].[CreatedByID]
LEFT OUTER JOIN
[dbo].[tbl_Contact] AS [ModifiedBy] ON [ModifiedBy].[ID] = [tbl_Account].[ModifiedByID]
LEFT OUTER JOIN
[dbo].[tbl_AddressType] AS [tbl_AddressType] ON [tbl_AddressType].[ID] = [tbl_Account].[AddressTypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType1] ON [CommunicationType1].[ID] = [tbl_Account].[Communication1TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType2] ON [CommunicationType2].[ID] = [tbl_Account].[Communication2TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType3] ON [CommunicationType3]. [ID] = [tbl_Account].[Communication3TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType4] ON [CommunicationType4].[ID] = [tbl_Account].[Communication4TypeID]
LEFT OUTER JOIN
[dbo].[tbl_CommunicationType] AS [CommunicationType5] ON [CommunicationType5].[ID] = [tbl_Account].[Communication5TypeID]
LEFT OUTER JOIN
[dbo].[tbl_Job] AS [tbl_Job] ON [tbl_Job].[ID] = [tbl_Contact].[JobID]
LEFT OUTER JOIN
[dbo].[vw_AppealInfo] AS [vw_AppealInfo] ON [vw_AppealInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_LoyaltyInfo] AS [vw_LoyaltyInfo] ON [vw_LoyaltyInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_LoyaltyRepInfo] AS [vw_LoyaltyRepInfo] ON [vw_LoyaltyRepInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_ReminderInfo] AS [vw_ReminderInfo] ON [vw_ReminderInfo].[AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[vw_ReminderRepInfo] AS [vw_ReminderRepInfo] ON [vw_ReminderRepInfo]. [AccountID] = [tbl_Account].[ID]
LEFT OUTER JOIN
[dbo].[tbl_TaskStatus] AS [AITaskStatus] ON [AITaskStatus].[ID] = [vw_AppealInfo].[AppealStatusID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [AITaskType] ON [AITaskType].[ID] = [vw_AppealInfo].[AppealTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [LITaskType] ON [LITaskType].[ID] = [vw_LoyaltyInfo].[LoyContTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskResult] AS [LITaskResult] ON [LITaskResult].[ID] = [vw_LoyaltyInfo].[LoyResultID]
LEFT OUTER JOIN
[dbo].[tbl_TaskType] AS [RITaskType] ON [RITaskType].[ID] = [vw_ReminderInfo].[RemContTypeID]
LEFT OUTER JOIN
[dbo].[tbl_TaskResult] AS [RITaskResult] ON [RITaskResult].[ID] = [vw_ReminderInfo].[RemResultID]
LEFT OUTER JOIN
[dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfo] ON [tbl_AccountBillingInfo].[AccountID] = [tbl_Account].[ID]

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

Нравится
0

Нравится

Избранное

Введение и обзор предложения 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

10 3

9

3

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

GO

SELECT p.Name AS ProductName,

NonDiscountSales = (OrderQty * UnitPrice),

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

FROM Production. Product ASOrder JOles AS p

3

3 дерн

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

     ПРИСОЕДИНЯЙТЕСЬ к Sales.CreditCard cc ON pcc.CreditCardID = 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 ccCridID;

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

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

SELECT *

от Person.Person P

Left Join Sales.PersonCreditCard PCC на P.BusyNessentID = PCC.BusinessentityId

Left Join Sales.creditcard ccc. НУЛЕВОЙ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Он много писал как для 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 .

Table of contents

  • SQL Joins
  • Types of SQL JOINs
    • Inner Join
    • Left Join 
    • Right Join
    • Full Join
  • SQL JOIN and Aliases
  • Examples
  • Conclusion
  • Recommended Articles

SQL Joins 

One of the many interesting operations that we can perform через SQL есть Joins. Соединения SQL позволяют нам объединять записи из двух или более таблиц базы данных на основе общего атрибута или столбца. У нас есть предложение JOIN для реализации соединений в SQL или применения запроса на соединение в SQL. Есть четыре разных вида Соединения в SQL , и мы обсудим каждое из них вместе с их синтаксисом и примерами.

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

  Также функции чтения: агрегатные и скалярные функции с примерами  

Синтаксис использования пункта соединения в SQL приведен AS-

Синтаксис:

  SELECT_NAME:   

  Выбор TABLE1. COMMON_COL =TABLE2.COMMOM_COL  

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

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

Table 1: Teacher Table

9 1

0 10069

TEACHER_ID TACHER_NAME SUBJECT CONTACT
1014 RANJANA KHANNA ENGLISH 9535455433
1012 СОНАМ МАРЬЯ МАТЕМАТИКА 8736653542
1021 ВИШАЛ ПАТХАК HINDI 9865356277
1015 MANJULATA SINGH ECONOMICS 8736363721
1013 MRINALINI SINGH  PHYSICS 7865634243
1026 PREETI RAHEJA CHEMISTRY 9735662523
1019 MRIDUL BAJPAYEE СЧЕТА 7892125688
MADHU SONKER BIOLOGY 9563819230

Table 2: Department Table

9AM069 МАУРЬЯ

7

0069

DPT_ID SUBJECT HEAD
501 PHYSICS НАИНА БАНСАЛ
502 ХИМИЯ АНКУР СИНХА
503 МАТЕМАТИКА СОН
504 ENGLISH KIRAN JOSHI
505 HINDI VISHAL PATHAK
506 ECONOMICS KIRAN SRIVASTAVA
507 HISTORY MEENAKSHI PAL
508 ГЕОГРАФИЯ ШРАВАН СИНГХ
509 CIVICS ЛАЛИТА БХАРДВАДЖ
ACCOUNTS NIKHIL MATHEWS
511 BIOLOGY BEENA BASU
512 LINGUISTIC  MANISHA DIXIT

Now, let us try performing the Join query in SQL on две приведенные выше таблицы в соответствии с заданным синтаксисом.

Пример:

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

Вывод:

ПРИМЕЧАНИЕ. Мы можем напрямую написать нужные имена столбцов в предложении 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:

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

Вывод:

Как видно из выходных снимков, используя * вместо имен столбцов, мы получаем все столбцы из обеих таблиц. В другом случае мы выбрали поле 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:

  ВЫБЕРИТЕ DPT_ID, TEACHER.TEACHER_ID, DEPARTMENT.SUBJECTFROM DEPARTMENT LEFT JOIN TEACHERON DEPARTMENT.SUBJECT = TEACHER.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:

  SELECT Учитель. Teacher_id, Department.DPT_ID, Учитель. Соглашение от департамента Departy Depanon Department.subject = учитель.  

Выход: 9008

как следует из выходных данных, все записи из таблиц 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 КАК ИДЕНТИФИКАТОР, СВЯЖИТЕСЬ КАК ТЕЛЕФОН ИЗ ТЕЛЕФОНА;  

Результат:

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

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

  SELECT TABLE1_LAILS.COLUMN1 AS COLUND1_ALIAS, TABLE2_ALIS.COLUMN2_ALIAS,… .. FROM TABLE1 AS TABLIS1_ALIASJOIN TABLE2 AS TABLE2_ALISON TABLE1_LIAS. Присоединиться с псевдонимом:   

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

Вывод:                    

90 используемые псевдонимы столбцов и таблиц в одном запросе 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: Присоединение к трем таблицам - Учитель, отдел и программа

  Select Sective_id, учитель.teacher_Name, Func_Namefrom Department D Присоединение D. D.DPT_ID a weaper.teacher_name, func_namefrom Dable D. D.dpt_id_id_id_id_DAMER_NAME, Func_Namefrom D.  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: Присоединяйтесь к учителю и департаменту, сопоставляя учительскую и головную колонку

  Select Selection_id, T. Teacher_Name, DPT_ID, D.SubjectFrom Учитель в качестве отдела T -DON DON TACHER_NAME = D. ;  

Вывод:

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

Пример 3: Присоединяйтесь к трем таблицам и используйте, где условие

  SELECT Учитель_ид, T.Teacher_Name, func_namefrom Департамент D СООБЩЕНИЕ PON D.DPT_ID = P.DPT_NAME присоединяется к учителю D.Subject = T.Subjectwhere T.TEACHER_NAME НРАВИТСЯ "%A";  

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

Точно так же мы можем применить несколько других ограничений к результирующему набору операции JOIN в SQL. Мы также можем использовать предложения GROUP BY и ORDER BY вместе с предложением JOIN так же, как и с любым другим предложением SQL.