Тестове и прегледи

SQL език – JOIN. Съвети и трикове за програмиране на клауза JOIN Sql вътрешно описание на съединение

Нека продължим да учим основите SQLи е време да поговорим за простите JOIN. И днес ще разгледаме как данните се комбинират с помощта на оператори ЛЯВО СЪЕДИНЯВАНЕ, ДЯСНО СЪЕДИНЯВАНЕ, КРЪСТОЧНО СЪЕДИНЯВАНЕ и ВЪТРЕШНО СЪЕДИНЯВАНЕ, с други думи, ще се научим да пишем заявки, които комбинират данни и, както обикновено, ще изучаваме всичко това с примери.

JOINs са много важни в SQL, тъй като без възможността да пишат заявки, които комбинират данни от различни обекти, SQL програмист и дори само администратор, който от време на време разтоварва някои данни от базата данни, просто не може без него, така че това важи за основите на SQL и всеки човек, който се занимава с SQL, трябва да има представа какво е това.

Забележка!Ще напишем всички примери в Management Studio SQL Server 2008.

Вие и аз изучаваме основите на SQL от дълго време и ако си спомняте, започнахме с оператора select и като цяло вече имаше много материали на този сайт за SQL, например:

И много повече, дори вече разгледахме съюза и съюза всички, но по един или друг начин не сме говорили за присъединяване към съюзи по-подробно, така че днес ще запълним тази празнина в нашите знания.

И ще започнем, както обикновено, с малко теория.

ПРИСЪЕДИНЯВАНЕе обединение на два или повече обекта на база данни, използващи специфичен ключ или ключове или, в случай на кръстосано свързване, без ключ изобщо. Обектите тук означават различни таблици, изгледи, функции на таблици или просто sql подзаявки, т.е. всичко, което връща таблични данни.

SQL LEFT и RIGHT JOIN

ЛЯВО ПРИСЪЕДИНЯВАНЕ– това е комбинация от данни от левия клавиш, т.е. Да кажем, че съединяваме две таблици с помощта на ляво съединение и това означава, че всички данни от втората таблица ще бъдат изтеглени до първата и ако няма ключ, ще се показват NULL стойности, с други думи, всички данните от лявата таблица и всички данни по ключ от дясната таблица ще бъдат показани.

ДЯСНО ПРИСЪЕДИНЕТЕ– това е същото съединение като лявото съединение, само всички данни от дясната таблица ще бъдат показани и само тези данни от лявата таблица, които съдържат ключа за свързване.

Сега нека да разгледаме примерите и първо да създадем две таблици:

СЪЗДАВАНЕ НА ТАБЛИЦА ( (18, 0) NULL, (50) NULL) В ДВИЖЕНИЕ СЪЗДАВАНЕ НА ТАБЛИЦА ( (18, 0) NULL, (50) NULL) В ДВИЖЕНИЕ

Ето тези прости таблици и например ги попълних със следните данни:

Сега нека напишем заявка, свързваща тези таблици чрез цифровия клавиш, започвайки с ЛЯВО:

ИЗБЕРЕТЕ t1.number като t1_number,t1.text като t1_text, t2.number като t2_number, t2.text като t2_text FROM test_table t1 LEFT JOIN test_table_2 t2 ON t1.number=t2.number

Както можете да видите, тук се извеждат всички данни от таблица t1, но не всички данни от таблица t2, тъй като редът с номер = 4 не е там, така че се извеждат NULL стойности.

Какво ще се случи, ако комбинираме с дясно присъединяване и ще бъде така:

ИЗБЕРЕТЕ t1.number като t1_number,t1.text като t1_text, t2.number като t2_number, t2.text като t2_text FROM test_table t1 RIGHT JOIN test_table_2 t2 ON t1.number=t2.number

С други думи, всички редове от таблица t2 и съответните записи от таблица t1 бяха показани, тъй като всички ключове, които са в таблица t2, също са в таблица t1 и следователно нямаме NULL стойности.

SQL INNER JOIN

Вътрешно присъединяване– това е обединение, когато се показват всички записи от една таблица и всички съответни записи от друга таблица, а тези записи, които не са в едната или другата таблица, няма да бъдат показани, т.е. само онези записи, които съответстват на ключа. Между другото, ще кажа веднага, че вътрешното присъединяване е същото като просто присъединяване без Inner. Пример:

ИЗБЕРЕТЕ t1.number като t1_number,t1.text като t1_text, t2.number като t2_number, t2.text като t2_text FROM test_table t1 INNER JOIN test_table_2 t2 на t1.number=t2.number

Сега нека се опитаме да комбинираме нашите таблици по два ключа. За да направим това, нека си припомним малко как да добавим колона към таблица и как да актуализираме данните с помощта на update, тъй като нашите таблици имат само две колони и обединяването по текстово поле е някак си. не е добре. За да направите това, добавете колони:

ALTER TABLE test_table ADD number2 INT ALTER TABLE test_table_2 ADD number2 INT

Нека актуализираме нашите данни, просто поставете стойността 1 в колоната number2:

АКТУАЛИЗИРАНЕ на test_table SET number2 = 1 UPDATE test_table_2 SET number2 = 1

И нека напишем заявка с обединение, базирано на два ключа:

ИЗБЕРЕТЕ t1.number като t1_number,t1.text като t1_text, t2.number като t2_number, t2.text като t2_text FROM test_table t1 INNER JOIN test_table_2 t2 ON t1.number=t2.number И t1.number2=t2.number2

И резултатът ще бъде същият като в предишния пример:

Но ако ние, да кажем във втората таблица в един ред, променим полето number2 на стойност, да речем 2, тогава резултатът ще бъде напълно различен.

АКТУАЛИЗИРАНЕ test_table_2 set number2 = 2 WHERE number=1

Искането е същото, но ето резултата:

Както можете да видите, за втория ключ не получихме нито един ред.

SQL CROSS JOIN

КРЪСТОСТНА СЪЕДИНКАе SQL съединение, при което всеки ред от една таблица се свързва с всеки ред от друга таблица. Лично аз рядко се нуждая от това присъединяване, но все пак е необходимо понякога, така че трябва да знаете и как да го използвате. Например, в нашия случай ще се окаже, разбира се, не е ясно какво, но нека все пак опитаме, особено след като синтаксисът е малко по-различен:

ИЗБЕРЕТЕ t1.number като t1_number,t1.text като t1_text, t2.number като t2_number, t2.text като t2_text FROM test_table t1 CROSS JOIN test_table_2 t2

Тук всеки ред от таблицата test_table съответства на всеки ред от таблицата test_table_2, т.е. в таблицата test_table имаме 4 реда, а в таблицата test_table_2 3 реда 4 умножете по 3 и ще бъде 12, точно както получихме 12 реда.

И накрая, нека да покажем как можете да обедините няколко таблици, за това, само като пример, ще обединя нашата първа таблица с втората няколко пъти, разбира се, че няма смисъл от обединяване в този случай, но ще видите как може да го направи така, нека да започнем:

ИЗБЕРЕТЕ t1.number като t1_number, t1.text като t1_text, t2.number като t2_number, t2.text като t2_text, t3.number като t3_number, t3.text като t3_text, t4.number като t4_number, t4.text като t4_text FROM test_table t1 LEFT JOIN test_table_2 t2 на t1.number=t2.number RIGHT JOIN test_table_2 t3 на t1.number=t3.number INNER JOIN test_table_2 t4 на t1.number=t4.number

Както можете да видите, тук комбинирам ляво, дясно и вътрешно, за да стане ясно.

Мисля, че е достатъчно със синдикатите, особено след като в тях няма нищо сложно. Но това не е краят на изучаването на SQL; ще продължим в следващите статии, но засега тренирайте и пишете вашите собствени заявки. Успех!

Преди това разгледахме използването на израза SELECT за избор на данни от една таблица на база данни. Ако Transact-SQL беше ограничен до поддържането само на такива прости изрази SELECT, би било невъзможно да се съединят две или повече таблици в заявка за извличане на данни от тях. Следователно всички данни от базата данни ще трябва да се съхраняват в една таблица. Въпреки че този подход е напълно възможен, той има един съществен недостатък - съхраняваните по този начин данни се характеризират с голям излишък.

Transact-SQL адресира този недостатък, като предоставя Оператор JOIN, което ви позволява да извличате данни от повече от една таблица. Този оператор е може би най-важният оператор за системи за релационни бази данни, защото прави възможно разпределянето на данни в множество таблици, като по този начин осигурява важно свойство на системите с бази данни - липсата на излишък на данни.

Операторът UNION, който разгледахме по-рано, също ви позволява да правите заявки за множество таблици. Но този оператор ви позволява да обединявате множество оператори SELECT, докато операторът JOIN свързва множество таблици, като използва само един оператор SELECT. Освен това операторът UNION обединява редове на таблица, докато операторът JOIN обединява колони.

Операторът за присъединяване може да се използва и с подлежащи таблици и изгледи. Операторът JOIN има няколко различни форми. Тази статия обхваща следните основни форми на този оператор:

    естествена връзка;

    Декартово произведение или кръстосано съединение;

    външно съединение;

    тета-съединяване, самосъединяване и полусъединяване.

Преди да разгледаме различните форми на връзки, в този раздел ще разгледаме различни варианти JOIN оператор за присъединяване.

Две синтактични форми за осъществяване на връзки

Можете да използвате две различни синтактични форми на оператора за свързване, за да свържете таблици:

    явен синтаксис на присъединяване (ANSI SQL:1992 синтаксис на присъединяване);

    скрит синтаксис на присъединяване (синтаксис на присъединяване "стар стил").

Синтаксисът за присъединяване ANSI SQL:1992 е въведен от стандарта SQL92 и дефинира изрично операциите за присъединяване, т.е. използвайки подходящото име за всеки тип операция за присъединяване. Когато изрично декларирате връзка, се използват следните ключови думи:

  • ЛЯВО ПРИСЪЕДИНЯВАНЕ;

    RIGHT JOIN;

    ПЪЛНО ПРИСЪЕДИНЕНИЕ.

Ключовата дума CROSS JOIN дефинира декартовото произведение на две таблици. Ключовата дума INNER JOIN дефинира естествено свързване между две таблици, а LEFT OUTER JOIN и RIGHT OUTER JOIN дефинират операции за свързване със същото име. И накрая, ключовата дума FULL OUTER JOIN дефинира дясно и ляво външно съединение. Всички тези операции за свързване се обсъждат в следващите раздели.

Синтаксисът на имплицитния оператор за присъединяване е синтаксис "стар стил", където всяка операция за присъединяване се дефинира неявно от клауза WHERE, използвайки така наречените колони за присъединяване.

Препоръчва се да се използва изричен синтаксис за операции за присъединяване, защото това подобрява надеждността на заявките. Поради тази причина всички следващи примери, включващи операции за присъединяване, използват форми на явен синтаксис. Но първите няколко примера също ще демонстрират синтаксис "стар стил".

Естествена връзка

Термините естествено присъединяване и равно присъединяване често се използват като синоними, но има малка разлика между тях. Операцията за съединяване на еквивалентност винаги има една или повече двойки колони с еднакви стойности във всеки ред. Операция, която елиминира такива колони от резултатите от операция за свързване на еквивалентност, се нарича естествено съединение. По най-добрия начинЕстествената връзка може да се обясни с пример:

ИЗПОЛЗВАЙТЕ SampleDb; SELECT Employee.*, Department.* FROM Employee INNER JOIN Department ON Employee.DepartamentNumber = Department.Number;

Заявката връща цялата информация за всички служители: собствено и фамилно име, номер на персонала и име на отдел, номер и местоположение, докато за номера на отдела се показват дублирани колони от различни таблици.

В този пример операторът SELECT избира всички колони от таблиците за Служител и Отдел. Клаузата FROM на израза SELECT дефинира таблиците, които да бъдат обединени, и също така изрично указва типа на операцията за присъединяване - ВЪТРЕШНО СЪЕДИНЕНИЕ. Клаузата ON е част от клаузата FROM и указва колоните в двете таблици, които да бъдат обединени. Изразът "Employee.DepartamentNumber = Department.Number" дефинира условието за присъединяване и двете колони на условието се извикват присъединете се към колони.

Еквивалентна заявка, използваща имплицитен синтаксис („стар стил“), би изглеждала така:

Тази форма на синтаксис има две съществени разлики от изричната форма: списъкът на таблиците, които трябва да бъдат съединени, е посочен в клаузата FROM, а съответното условие за присъединяване е посочено в клаузата WHERE от колоните, които се обединяват.

Предишните примери илюстрират как работи операцията за присъединяване. Но трябва да се има предвид, че това е само идея за процеса на свързване, т.к всъщност Database Engine избира изпълнение на операцията за присъединяване измежду няколко възможни стратегии. Представете си, че всеки ред в таблицата Employee е свързан с всеки ред в таблицата Department. Резултатът е таблица със седем колони (4 колони от таблицата Employee и 3 от таблицата Department) и 21 реда.

След това всички редове, които не отговарят на условието за присъединяване "Employee.Number = Department.Number" се изтриват от тази таблица. Останалите редове представляват резултата от първия пример по-горе. Съединените колони трябва да имат идентична семантика, т.е. и двете колони трябва да имат една и съща булева стойност. Колоните, които се обединяват, не трябва да имат едно и също име (или дори един и същи тип данни), въпреки че често го правят.

Системата от бази данни не може да определи логическата стойност на колоната. Например, той не може да определи, че колоните номер на проект и персонален номер на служител нямат нищо общо, въпреки че и двете са цели числа. Следователно системата от бази данни може да проверява само типа данни и дължината на низа. Database Engine изисква колоните, които се обединяват, да имат съвместими типове данни, като INT и SMALLINT.

Базата данни SampleDb съдържа три двойки колони, където всяка колона в двойката има една и съща булева стойност (както и едно и също име). Таблиците Employee и Department могат да бъдат обединени с помощта на колоните Employee.DepartmentNumber и Department.Number. Колоните за свързване на таблиците Employee и Works_on са колоните Employee.Id и Works_on.EmpId. И накрая, таблиците Project и Works_on могат да бъдат обединени с помощта на колоните Project.Number и Works_on.ProjectNumber.

Можете да прецизирате имената на колоните в оператора SELECT. В този контекст квалификацията означава, че за да се избегне неяснотата към коя таблица принадлежи дадена колона, името на колоната включва името на нейната таблица (или псевдоним на таблица), разделени с точка:

име_на_таблица.име_на_колона (име_на_таблица.име_на_колона)

Повечето оператори SELECT не изискват квалификация на колона, въпреки че обикновено се препоръчва да се използва квалификация на колона за подобряване на разбирането на кода. Ако имената на колоните в оператора SELECT са двусмислени (като колоните Number в таблиците Project и Department), използването на квалифицирани имена на колони е задължително.

В оператор SELECT с операция за присъединяване, в допълнение към условието за присъединяване, клаузата WHERE може да съдържа други условия, както е показано в примера по-долу:

ИЗПОЛЗВАЙТЕ SampleDb; -- Явен синтаксис SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on JOIN Project ON Project.Number = Works_on.ProjectNumber WHERE ProjectName = "Gemini"; -- Стар стил SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on, Project WHERE Project.Number = Works_on.ProjectNumber AND ProjectName = "Gemini";

Използването на квалифицирано име на колона Project.Number в примера по-горе не е задължително, тъй като в този случай няма неяснота относно техните имена. По-долу всички примери ще използват само изричен синтаксис на присъединяване.

Примерът по-долу показва друга употреба на вътрешно съединение:

Обединяване на повече от две маси

На теория броят на таблиците, които могат да бъдат обединени в оператор SELECT, е неограничен. (Но едно условие за присъединяване обединява само две таблици!) Въпреки това, Database Engine ограничава броя на обединяващите се таблици в оператор SELECT до 64 таблици.

Примерът по-долу показва свързване между три таблици на SampleDb база данни:

ИЗПОЛЗВАЙТЕ SampleDb; -- Връща единствения служител "Василий Фролов" SELECT FirstName, LastName FROM Works_on JOIN Employee ON Works_on.EmpId = Employee.Id JOIN Department ON Employee.DepartamentNumber = Department.Number AND Location = "St. Petersburg" AND Job = "Analyst" ;

В този пример са избрани имената и фамилиите на всички анализатори (Job = "Analyst"), чийто отдел се намира в Санкт Петербург (Location = "St. Petersburg"). Резултатът от заявката, дадена в примера по-горе, може да бъде получен само ако обедините поне три таблици: Works_on, Employee и Department. Тези таблици могат да бъдат обединени с помощта на две двойки колони за свързване:

(Works_on.EmpId, Employee.Id) (Employee.DepartmentNumber, Department.Number)

Имайте предвид, че за постигане на естествено свързване между три таблици се използват две условия за свързване, всяко от които свързва две таблици. А при съединяване на четири маси са необходими три такива условия за обединяване. Като цяло, за да избегнете получаването на декартово произведение при свързване на n таблици, трябва да приложите n - 1 условия за свързване. Разбира се, допустимо е да се използват повече от n - 1 условия за свързване, както и други условия, за да се намали допълнително броят на елементите в резултантния набор от данни.

Декартов продукт

В предишния раздел разгледахме възможен начин за създаване на естествена връзка. Първата стъпка от този процес свързва всеки ред в таблицата Employee с всеки ред в таблицата Department. Тази операция се нарича Декартов продукт. Заявката за създаване на съединение между таблиците Employee и Department с помощта на декартов продукт е показана в примера по-долу:

ИЗПОЛЗВАЙТЕ SampleDb; SELECT Employee.*, Department.* FROM Employee CROSS JOIN Отдел;

Декартовото произведение свързва всеки ред от първата таблица с всеки ред от втората. Като цяло декартовото произведение на първа таблица с n реда и втора таблица с m реда ще доведе до таблица с n*m реда. Така че наборът от резултати на заявката в примера по-горе има 7 x 3 = 21 реда (тези редове съдържат дублирани стойности).

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

Външно присъединяване

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

Примерът по-долу показва селекция от цялата информация за служители, които живеят и работят в един и същи град. Това използва таблицата EmployeeEnh, която създадохме в статията „Разширен оператор SELECT“, когато обсъждахме оператора UNION.

ИЗПОЛЗВАЙТЕ SampleDb; SELECT DISTINCT EmployeeEnh.*, Department.Location FROM EmployeeEnh JOIN Department ON City = Location;

Резултатът от тази заявка:

В този пример необходимите редове се получават чрез естествено свързване. Ако този резултат трябва да включва служители, живеещи на други места, трябва да се приложи ляво външно съединение. Това външно съединение се нарича ляво съединение, защото връща всички редове от таблицата от лявата страна на оператора за сравнение, независимо дали има съвпадащи редове в таблицата с дясната страна. С други думи, това външно свързване ще върне ред от лявата таблица, дори ако няма съвпадение в дясната таблица, със съответната стойност на колона NULL за всички редове с несъответстваща стойност на колона в другата дясна таблица. За да изпълни операция за ляво външно свързване, Database Engine използва оператора ЛЯВО ВЪНШНО СЪЕДИНЕНИЕ.

Операцията на дясно външно съединение е подобна на ляво, но се връщат всички редове в таблицата от дясната страна на израза. За да изпълни операция за дясно външно свързване, Database Engine използва оператора ДЯСНО ВЪНШНО СЪЕДИНЕНИЕ.

ИЗПОЛЗВАЙТЕ SampleDb; SELECT EmployeeEnh.*, Department.Location FROM EmployeeEnh LEFT OUTER JOIN Department ON City = Location;

Този пример избира служители (включително пълна информация) за градове, в които служителите или само живеят (колона Град в таблицата EmployeeEnh), или живеят и работят. Резултатът от тази заявка:

Както можете да видите в резултата от заявката, когато ред от лявата таблица (в този случай EmployeeEnh) няма съответстващ ред в дясната таблица (в този случай Department), лявата външна операция за свързване все още връща този ред, запълвайки всички клетки в съответната колона с NULL за несъответстваща стойност на дясната колона на таблицата. Използването на дясно външно съединение е показано в примера по-долу:

ИЗПОЛЗВАЙТЕ SampleDb; ИЗБЕРЕТЕ EmployeeEnh.City, Department.* FROM EmployeeEnh RIGHT OUTER JOIN Department ON City = Location;

В този пример са избрани отдели (включително пълна информация за тях) за градове, в които служителите или само работят, или живеят и работят. Резултатът от тази заявка:

Освен леви и десни външни съединения, има и пълно външно съединение, което е обединението на леви и десни външни съединения. С други думи, резултатният набор от такова съединение се състои от всички редове от двете таблици. Ако ред в една таблица няма съответен ред в другата таблица, всички клетки в реда във втората таблица са зададени на NULL. За да извършите пълна операция за външно свързване, използвайте оператора ПЪЛНО ВЪНШНО СЪЕДИНЕНИЕ.

Всяка операция за външно свързване може да бъде емулирана с помощта на оператора UNION във връзка с функцията NOT EXISTS. По този начин заявката, показана в примера по-долу, е еквивалентна на заявката за ляво външно присъединяване, показана по-рано. Тази заявка избира служители (включително пълна информация) за градовете, в които служителите или само живеят, или живеят и работят:

Първият оператор SELECT на съединението дефинира естествено съединение на таблиците EmployeeEnh и Department с помощта на колоните за свързване на City и Location. Тази инструкция връща всички градове за всички служители, в които служителите живеят и работят. Освен това вторият оператор SELECT на съединението връща всички редове от таблицата EmployeeEnh, които не отговарят на условието в естественото съединение.

Други форми на операции за присъединяване

В предишните раздели разгледахме най-важните форми на връзка. Но има и други форми на тази операция, които ще разгледаме в следващите подраздели.

Тета връзка

Условието за сравнение на колона за присъединяване не трябва да е равенство, но може да бъде всяко друго сравнение. Извиква се съединение, което използва общо условие за сравняване на колоните за свързване тета връзка. Примерът по-долу показва операция за тета свързване, която използва условието по-малко от. Тази заявка връща всички комбинации от информация за служител и отдел за случаите, когато домашното местоположение на служителя идва по азбучен ред преди местоположението на всеки отдел, в който работи служителят:

ИЗПОЛЗВАЙТЕ SampleDb; ИЗБЕРЕТЕ FirstName, LastName, City, Location FROM EmployeeEnh JOIN Department ON City

Резултатът от тази заявка:

Този пример сравнява съответните стойности на колоните Град и Местоположение. Всеки ред от резултата сравнява стойността на колоната Град по азбучен ред със съответната стойност на колоната Местоположение.

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

В допълнение към свързването на две или повече различни таблици, естествена операция за свързване може да се приложи към една таблица. При тази операция таблица се свързва сама със себе си, като една колона от таблицата се сравнява със себе си. Сравняването на колона със себе си означава, че името на таблицата се използва два пъти в клаузата FROM на оператора SELECT. Следователно е необходимо да можете да препращате към едно и също име на таблица два пъти. Това може да стане с помощта на поне един псевдоним. Същото важи и за имена на колони в условие за свързване в оператор SELECT. За да разграничите колони с едно и също име, трябва да използвате квалифицирани имена.

Примерът по-долу демонстрира присъединяване на таблица към себе си:

Този пример избира всички отдели (с пълна информация), разположени на същото място като поне един друг отдел. Резултатът от тази заявка:

Тук клаузата FROM съдържа два псевдонима за таблицата Department: t1 и t2. Първото условие в клаузата WHERE ще дефинира колоните за свързване, а второто ще премахне ненужните дубликати, като гарантира, че всеки отдел се сравнява с други отдели.

Полусъединяване

Полусъединяването е подобно на естественото съединение, но връща само набора от всички редове от една таблица, които имат едно или повече съвпадения в друга таблица. Използването на semi-join е показано в примера по-долу:

Резултат от заявката:

Както можете да видите, списъкът SELECT в полусъединението съдържа само колони от таблицата Employee. Това е характерна черта на операцията полусъединяване. Тази операция обикновено се използва при обработка на разпределени заявки, за да се сведе до минимум количеството прехвърлени данни. Database Engine използва операцията за полусъединяване, за да реализира функционалност, наречена звездно присъединяване.

Разработването на всяка база данни включва не само създаване и попълване на таблици с различна информация, но и по-нататъшна работа с данните. За правилно изпълнение на различни задачи за избор на данни от таблици и генериране на отчети се използва стандартната конструкция Select.

Избор на данни от таблици

Ако разгледаме задачата за избор на данни или изграждане на отчет, можем да определим нивото на сложност на тази операция. Като правило, когато работите със сериозни (по отношение на обема на информацията) бази данни, които се формират например в онлайн магазини или големи компании, изборът на данни няма да бъде ограничен само до една таблица. Като правило, извадките могат да бъдат от доста голям брой не само взаимосвързани таблици, но и вложени заявки/подзаявки, които програмистът съставя сам, в зависимост от задачата, която му е възложена. За да изберете от една таблица, можете да използвате най-простата конструкция:

Изберете * от Лице

където Person е името на таблицата, от която трябва да се извлекат данни.

Ако е необходимо да изберете данни от няколко таблици, можете да използвате една от стандартните конструкции, за да комбинирате няколко таблици.

Методи за свързване на допълнителни таблици

Ако разгледаме използването на този вид конструкции на първоначално ниво, можем да различим следните механизми за свързване на необходимия брой таблици за вземане на проби, а именно:

  1. Вътрешен оператор Join.
  2. Ляво съединение или, това е вторият начин на писане, ляво външно съединение.
  3. Кръстосано присъединяване.
  4. Пълно присъединяване.

Използването на оператори за свързване на таблици на практика може да се научи, като се вземе предвид използването на SQL оператора - Inner Join. Пример за използването му ще изглежда така:

Изберете * от Лице

Езикът SQL и операторът Join Inner Join могат да се използват не само за свързване на две или повече таблици, но и за свързване на други подзаявки, което значително улеснява работата на администраторите на бази данни и като правило може значително да ускори изпълнението на определени , структурно сложни заявки.

Обединяване на данни в таблици ред по ред

Ако обмислим свързване на голям брой подзаявки и събиране на данни в една таблица ред по ред, тогава можем също да използваме операторите Union и Union All.

Използването на тези структури ще зависи от задачата, възложена на разработчика, и резултата, който той иска да постигне в крайна сметка.

Описание на оператора Inner Join

В повечето случаи операторът Inner Join се използва за свързване на множество таблици в SQL. Описанието на Inner Join в SQL е доста лесно за разбиране от средния програмист, който току-що започва да разбира базите данни. Ако разгледаме описанието на работния механизъм на този дизайн, получаваме следната картина. Логиката на оператора като цяло се основава на възможността за пресичане и избор само на данните, които се намират във всяка от таблиците, включени в заявката.

Ако разгледаме такава работа от гледна точка на графична интерпретация, получаваме структурата на SQL Inner Join оператора, чийто пример може да бъде показан с помощта на следната диаграма:

Например, имаме две таблици, чиято диаграма е показана на фигурата. Те от своя страна имат различен брой записи. Всяка таблица има полета, които са свързани едно с друго. Ако се опитаме да обясним работата на оператора въз основа на фигурата, върнатият резултат ще бъде под формата на набор от записи от две таблици, където номерата на взаимосвързаните полета съвпадат. Просто казано, заявката ще върне само онези записи (от таблица номер две), които имат данни в таблица номер едно.

Синтаксис на вътрешния оператор за свързване

Както споменахме по-рано, операторът Inner Join, а именно неговият синтаксис, е изключително прост. За да организирате връзки между таблици в една проба, ще бъде достатъчно да запомните и използвате следната основна схема за конструиране на оператор, която е написана в един ред SQL код, а именно:

  • Inner Join [Име на таблица] на [ключово поле от таблицата, към която се свързваме] = [Ключово поле на свързаната таблица].

За контакт даден операторИзползват се ключовете на основната маса. Като правило, в група от таблици, които съхраняват информация за служители, описаните по-горе Лице и Подразделение имат поне един подобен запис. Така че, нека да разгледаме по-отблизо Inner Join, пример за който беше показан малко по-рано.

Пример и описание на свързване към селекция от една маса

Имаме таблица Person, в която се съхранява информация за всички служители, работещи във фирмата. Нека веднага да отбележим, че основният ключ на тази таблица е полето - Pe_ID. Точно тук ще отиде връзката.

Втората таблица Subdivision ще съхранява информация за отделите, в които работят служителите. Тя от своя страна се свързва чрез полето Su_Person към таблицата Person. какво значи това Въз основа на схемата на данните можем да кажем, че в разделителната таблица за всеки запис от таблицата “Служители” ще има информация за отдела, в който работят. Именно чрез тази връзка ще работи операторът Inner Join.

За по-разбираема употреба помислете за SQL Inner Join оператора (примери за използването му за една и две таблици). Ако разгледаме пример за една таблица, тогава всичко е съвсем просто:

Изберете * от Лице

Подразделение за вътрешно присъединяване на Su_Person = Pe_ID

Пример за свързване на две таблици и подзаявка

Операторът SQL Inner Join, чиито примери могат да се използват за избиране на данни от няколко таблици по горния начин, работи на малко по-сложен принцип. Нека усложним задачата за две маси. Да кажем, че имаме таблица за заминаване, която съхранява информация за всички отдели във всеки отдел. Тази таблица съдържа номера на отдела и номера на служителя и трябва да допълните селекцията от данни с името на всеки отдел. Гледайки напред, си струва да кажем, че за да разрешите този проблем, можете да използвате два метода.

Първият метод е да свържете таблицата на отдела към селекцията. В този случай можете да организирате заявката по следния начин:

Струва си да се отбележи, че този дизайн не винаги може да ускори заявката. Понякога има случаи, когато трябва да използвате допълнителна извадка от данни във временна таблица (ако нейният обем е твърде голям) и след това да я комбинирате с основната извадка.

Пример за използване на оператора Inner Join за избор от голям брой таблици

Изграждането на сложни заявки включва използването на значителен брой взаимосвързани таблици и подзаявки за избор на данни. Синтаксисът на SQL Inner Join може да удовлетвори тези изисквания. Примерите за използване на оператора в този случай могат да бъдат усложнени не само от избори от много места за съхранение на данни, но и от голям брой вложени подзаявки. За конкретен пример можете да вземете извадка от данни от системни таблици (Inner Join SQL оператор). Пример - 3 таблици - в този случай ще има доста сложна структура.

В този случай се свързват три допълнителни (към основната таблица) и се въвеждат няколко условия за избор на данни.

Когато използвате оператора Inner Join, си струва да запомните, че колкото по-сложна е заявката, толкова по-дълго ще отнеме нейното изпълнение, така че си струва да търсите начини за по-бързо изпълнение и решаване на задачата.

Заключение

В крайна сметка бих искал да кажа едно нещо: работата с бази данни не е най-трудното нещо в програмирането, следователно, ако желаете, абсолютно всеки може да придобие знания за изграждане на бази данни и с течение на времето, натрупал опит, ще може да работим с тях на професионално ниво.

Оператор ПРИСЪЕДИНЕТЕ СЕизползва се за извършване на операция за обединяване на данни от два набора в един резултатен набор. Могат да се използват няколко различни видовеоперации за присъединяване при изпълнение на SELECT. Кои редове са включени в набора от резултати зависи от типа на операцията за присъединяване и от изричното определено условиевръзки. Състоянието на връзката, т.е. условието за съвпадение на редовете на таблицата един с друг е логически израз.

Ако трябва да свържете няколко таблици, операцията за свързване трябва да се приложи последователно няколко пъти.

Синтаксис на оператор JOIN

Синтаксис за свързване на допълнителна таблица към заявка с помощта на оператора ПРИСЪЕДИНЕТЕ СЕможе да се представи в следната форма:

ИЗБЕРЕТЕ field1, field1, [,... n] FROM Table1 t1 (INNER | (LEFT | RIGHT | FULL) OUTER | CROSS ) JOIN Table2 (ON | ИЗПОЛЗВАНЕ (име_на_поле [,... n]))

В повечето СУБД, когато използвате оператора ПРИСЪЕДИНЕТЕ СЕв комбинация с ключовите думи LEFT, RIGHT, FULL, ВЪНШНИЯТ операнд може да бъде пропуснат. Операндът INNER също не е необходимо да се използва в повечето СУБД.

Ако имената на колоните, с които се свързват таблиците, са еднакви, тогава вместо ON можете да използвате ИЗПОЛЗВАНЕ. За оператора КРЪСТОСТНА СЪЕДИНКАсъстояние не е посочено.

Тестови таблици за проверка на JOIN

За допълнителни примери нека създадем две прости тестови таблици. Справочни таблици за потребителите и техните превозни средства. Първата таблица ще съхранява потребителския идентификатор и неговото име (ник). Втората таблица съдържа списък с автомобили (идентификатор, име) и идентификатор на техните собственици/потребители. Трябва да се отбележи, че потребителят може да има няколко коли или нито една.

Потребителска таблица

CREATE TABLE потребители (id int not null, name varchar(32) not null, първичен ключ (id)); -- Вмъкнете няколко записа в таблицата, вмъкнете в потребителски (id, име) стойности (1, "alex"); вмъкнете в потребителите (id, име) стойности (2, "piter"); вмъкнете в потребителите (id, име) стойности (3, "serg"); вмъкнете в потребителите (id, име) стойности (4, "olga"); вмъкнете в потребителите (id, име) стойности (5, "ostap");

Маса за кола

CREATE table autos (id int not null, -- auto identifier name varchar(32) not null, -- auto name oid int not null, -- първичен ключ (id) на идентификатора на собственика); -- Вмъкнете няколко записа в таблицата, вмъкнете в autos (id, oid, name) стойности (1, 1, "toyota camry"); вмъкнете в autos (id, oid, name) стойности (2, 1, "toyota prado"); вмъкнете в autos (id, oid, name) стойности (3, 2, "renault megane"); вмъкнете в autos (id, oid, name) стойности (4, 3, "nissan x-trail"); вмъкнете в autos (id, oid, name) стойности (5, 4, "suzuki swift"); вмъкнете в autos (id, oid, name) стойности (6, 4, "suzuki vitara");

Вътрешно съединяване, INNER JOIN

ВЪТРЕШНО СЪЕДИНЕНИЕе вътрешен оператор за свързване между две таблици. Той е симетричен, така че редът на таблиците не е важен за оператора.

Приложимо ВЪТРЕШНО СЪЕДИНЕНИЕза извличане само на тези редове, за които има съответствие между записите в основната и обединените таблици. Алгоритъм за генериране на резултата: всеки ред от основната таблица се сравнява с всеки ред от обединената таблица. След това се проверява състоянието на връзката. Ако условието е вярно, съответният "съединен" ред се добавя към набора от резултати.

Заявка с избор на колони от набора с резултати изберете u.name като собственик, a.name като auto от потребители u inner join autos a ON a.oid = u.id -- Резултат от заявката собственик auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift olga suzuki vitara -- Заявка без избиране на колони от набора с резултати select * from users u inner join autos a ON a.oid = u.id -- Резултат от заявка id name id1 name1 oid 1 alex 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 3 renault megane 2 3 serg 4 nissan x-trail 3 4 olga 5 suzuki swift 4 4 olga 6 suzuki vitara 4

За да получите данни, които не отговарят на условието, трябва да използвате външно съединение - ВЪНШНО СЪЕДИНЕНИЕ.

Външно съединяване, ВЪНШНО СЪЕДИНЯВАНЕ

При свързване на две таблици с помощта на оператора ВЪНШНО СЪЕДИНЕНИЕнаборът от резултати задължително ще включва редове от една от таблиците или от двете таблици. Ключовата дума OUTER може да бъде пропусната. Означението LEFT JOIN е идентично с LEFT OUTER JOIN.

Има два вида външно свързване. това ЛЯВО ВЪНШНО СЪЕДИНЕНИЕИ ДЯСНО ВЪНШНО СЪЕДИНЕНИЕ. Тези оператори работят по същия начин. Разликата е, че когато използвате LEFT JOIN, основната таблица е таблицата, посочена след клаузата FROM. При определени условия данните от обединената таблица се добавят към редовете на тази таблица. За оператора RIGHT OUTER JOIN всичко е точно обратното.

Външен оператор за присъединяване ВЪНШНО СЪЕДИНЕНИЕне е симетричен, така че редът, в който се установява връзката между таблиците, е важен за оператора.

Пример за използване на оператора LEFT OUTER JOIN

Изберете u.name като собственик, a.name като auto от потребители u left join autos a ON a.oid = u.id -- Резултат от заявка собственик auto alex toyota camry alex toyota prado piter renault megane serg nissan x-trail olga suzuki swift олга сузуки витара остап

Графично резултатът от работата може да бъде представен по следния начин:

LEFT OUTER JOIN оператор с филтриране

Чрез добавяне на условието „където a.name е null“ към кода в предишния пример. В селекцията ще остане само един запис "ostap", тъй като той е единственият, който няма дефинирана кола.

Графично резултатът от работата може да бъде представен по следния начин:

Оператор за кръстосано свързване, CROSS JOIN

CROSS JOIN е оператор за кръстосано свързване (декартово произведение). Операторът е симетричен и редът на таблиците не е важен за оператора.

Резултатният набор се формира по следния начин: всеки ред от една таблица се свързва с всеки ред от втората таблица, като по този начин се получават всички възможни комбинации от редове от двете таблици. За нашия пример това води до 30 реда от набора с резултати.

Изберете * от потребители cross join autos -- Резултат от заявката id name id1 name1 oid 1 alex 1 toyota camry 1 2 piter 1 toyota camry 1 3 serg 1 toyota camry 1 4 olga 1 toyota camry 1 5 ostap 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 2 toyota prado 1 3 serg 2 toyota prado 1 4 олга 2 toyota prado 1 5 ostap 2 toyota prado 1 . . .

Само първите 12 реда се показват в резултатите от въвеждането.

това наръчник за обучение Oracle обяснява как да използвате СЪЕДИНЕНИЯ (ВЪТРЕШНИ и ВЪНШНИ)в Oracle със синтаксис и примери.

Описание

Oracle се ПРИСЪЕДИНЯВАсе използват за извличане на данни от множество таблици. ПРИСЪЕДИНЕТЕ СЕизпълнява се всеки път, когато две или повече таблици се съединят в SQL израз.

Има 4 различни видове Oracle се присъединява към:

Нека разгледаме синтаксиса на Oracle JOIN и също така да проучим примери за Oracle JOIN.

INNER JOIN (обикновено съединяване)

Най-вероятно вече сте написали заявки, които използват Oracle INNER JOIN. Това е най-често срещаният тип връзка. Oracle INNER JOINS връща всички редове от множество таблици, където са изпълнени условията за свързване.

Синтаксис

Синтаксис INNER JOIN в Oracle/PLSQL:

ИЗБЕРЕТЕ колони
ОТ таблица1
INNER JOIN table2

На тази фигура Oracle INNER JOIN връща защрихована област:

Oracle INNER JOIN ще върне записи, където table1 и table2 се пресичат.

Пример

По-долу е даден пример за Oracle INNER JOIN:

Oracle PL/SQL

ИЗБЕРЕТЕ доставчик.идентификатор на доставчик,

доставчици.име_на_доставчик,

orders.order_date

ОТ доставчици

INNER JOIN поръчки

Този пример на Oracle INNER JOIN връща всички редове от таблиците с доставчици и поръчки, където има съответстващи стойности на полето доставчик_id и в двете таблици.

Нека да разгледаме някои данни, за да разберем как работи INNER JOIN:

Ако изпълним израза SELECT на Oracle (който съдържа INNER JOIN) по-долу:

Oracle PL/SQL

ИЗБЕРЕТЕ Доставчици.доставчик_id, Доставчици.име_доставчик, orders.order_date ОТ доставчици INNER JOIN поръчки НА Доставчици.доставчик_id = orders.supplier_id;

Редовете за Microsoft и NVIDIA от таблицата на доставчиците ще бъдат пропуснати, тъй като стойностите 10002 и 10003 на доставчик_ид не съществуват и в двете таблици. Редът order_id 500127 от таблицата с поръчки ще бъде пропуснат, тъй като доставчик_id 10004 не съществува в таблицата с доставчици.

Стар синтаксис

Като последна бележка, струва си да се отбележи, че примерът на Oracle INNER JOIN по-горе може да бъде пренаписан с помощта на стария имплицитен синтаксис, както следва (но се препоръчва използването на синтаксис INNER JOIN):

Друг тип свързване се нарича Oracle LEFT OUTER JOIN. Този тип свързване връща всички редове от таблици с ляво съединение, указано в клаузата ON, и само тези редове от друга таблица, където полетата, които се свързват, са равни.

Синтаксис

Синтаксис за Oracle LEFT OUTER JOIN:

ИЗБЕРЕТЕ колони
ОТ таблица1
LEFT JOIN table2
НА table1.column = table2.column;

В някои бази данни LEFT OUTER JOIN се заменя с LEFT JOIN.

На тази фигура Oracle LEFT OUTER JOIN връща защрихована област:

Oracle LEFT OUTER JOIN ще върне всички записи от table1 и само онези записи от table2, които се пресичат с table1.

Пример

Oracle PL/SQL

ИЗБЕРЕТЕ доставчик.идентификатор на доставчик,

доставчици.име_на_доставчик,

orders.order_date

ОТ доставчици

LEFT OUTER JOIN поръчки

ON suppliers.supplier_id=orders.supplier_id;

Този пример LEFT OUTER JOIN ще върне всички редове от таблицата с доставчици и само тези редове от таблицата с поръчки, където обединените полета са равни.

Ако стойността на доставчик_ид в таблицата на доставчиците не съществува в таблицата с поръчки, всички полета в таблицата с поръчки ще се показват като NULL в набора с резултати.

Нека да разгледаме някои данни, за да разберем как работи LEFT OUTER JOIN:

Имаме таблица с доставчици с две полета (supplier_id и доставчик_име), която съдържа следните данни:

Ако изпълним израза SELECT на Oracle (който съдържа LEFT OUTER JOIN) по-долу:

Oracle PL/SQL

ИЗБЕРЕТЕ доставчик.идентификатор_доставчик, име_доставчик_доставчик, дата_на_доставчик на поръчки ОТ доставчици ЛЯВО ВЪНШНО СЪЕДИНЯВАНЕ на поръчки НА доставчик.идентификатор_доставчик = идентификатор_доставчик на поръчки;

Ще бъдат включени редове за Microsoft и NVIDIA, тъй като е използван LEFT OUTER JOIN. Ще забележите обаче, че полето order_date за тези записи е NULL.

Друг тип свързване се нарича Oracle RIGHT OUTER JOIN. Този тип свързване връща всички редове от таблици с дясно съединение, указано в клаузата ON, и само онези редове от друга таблица, където полетата, които се свързват, са равни.

Синтаксис

Синтаксис на Oracle RIGHT OUTER JOIN:

ИЗБЕРЕТЕ колони
ОТ таблица1
RIGHT JOIN table2
НА table1.column = table2.column;

В някои бази данни RIGHT OUTER JOIN се заменя с RIGHT JOIN.

На тази фигура Oracle RIGHT OUTER JOIN връща защрихованата област:

Oracle RIGHT OUTER JOIN ще върне всички записи от таблица2 и само онези записи от таблица1, които се пресичат с таблица2.

Пример

По-долу е даден пример за Oracle RIGHT OUTER JOIN:

Oracle PL/SQL

ИЗБЕРЕТЕ orders.order_id,

orders.order_date,

доставчици.име_на_доставчик

ОТ доставчици

RIGHT OUTER JOIN поръчки

ON suppliers.supplier_id=orders.supplier_id;

Този пример за RIGHT OUTER JOIN връща всички редове от таблицата с поръчки и само тези редове от таблицата с доставчици, където обединените полета са равни.

Ако стойността на доставчик_ид в таблицата с поръчки не съществува в таблицата с доставчици, всички полета в таблицата с доставчици ще се показват като NULL в набора от резултати.

Нека да разгледаме някои данни, за да разберем как работи RIGHT OUTER JOIN:

Имаме таблица с доставчици с две полета (supplier_id и доставчик_име), която съдържа следните данни:

Ако изпълним израза SELECT на Oracle (който съдържа RIGHT OUTER JOIN) по-долу:

Oracle PL/SQL

ИЗБЕРЕТЕ orders.order_id, orders.order_date, suppliers.supplier_name ОТ доставчици ОТДЯСНО ВЪНШНО СЪЕДИНЯВАНЕ на поръчки НА доставчик.supplier_id = orders.supplier_id;

Редът за order_id 500127 ще бъде включен, защото са използвани RIGHT OUTER JOINS. Ще забележите обаче, че полето доставчик_име за този запис е NULL.

Друг тип присъединяване се нарича Oracle FULL OUTER JOIN. Този тип обединяване връща всички редове от лявата таблица и дясната таблица с NULL стойности на мястото, където условието за обединяване не е изпълнено.

Синтаксис

Синтаксис за Oracle FULL OUTER JOIN:

ИЗБЕРЕТЕ колони
ОТ таблица1
FULL JOIN table2
НА table1.column = table2.column;

В някои бази данни FULL OUTER JOINs се заменят с FULL JOINs.

В тази картина FULL OUTER JOIN връща защрихованата област:

Oracle FULL OUTER JOIN ще върне всички записи от двете таблици table1 и table2.