В тази статия ще разгледаме отблизо присъединяването на SQL Server. Ще прегледаме всички поддържани типове JOIN на SQL Server със синтаксис, визуални илюстрации и примери.
Както всички знаем, табличните данни са ядрото на всяка SQL база данни. За да го използват ефективно, администраторите на бази данни трябва редовно да извличат записи от няколко таблици въз основа на определени условия. И точно за това служат SQL JOIN.
JOIN е SQL клауза, използвана за извличане на данни от две или повече таблици въз основа на логически връзки между таблиците. Съединенията показват как SQL Server трябва да използва данни от една таблица, за да избере редовете в друга таблица.
Различни типове JOIN в SQL
SQL Server поддържа различни типове JOIN, включително INNER JOIN , САМО ПРИСЪЕДИНЯВАНЕ , КРЪСТО ПРИСЪЕДИНЯВАНЕ , и ВЪНШНО ПРИСЪЕДИНЕНИЕ . Всъщност всеки тип свързване дефинира начина, по който две таблици са свързани в една заявка. ВЪНШНИ СЪЕДИНЕНИ, от своя страна, могат да бъдат разделени на ЛЕВ ВЪНШНИ СЪЕДИНИ , ДЕСНИ ВЪНШНИ СЪЕДИНИ , и ПЪЛНИ ВЪНШНИ СЪЕДИНЕНИЯ .
За да демонстрираме по-добре как работят JOIN, ще създадем две таблици.
CREATE TABLE AdventureWorks2019.dbo.users (
auid INT IDENTITY
,username VARCHAR(50) NOT NULL
,password VARCHAR(50) NOT NULL
,createdate DATETIME NOT NULL
,isActive TINYINT NOT NULL
);
CREATE TABLE AdventureWorks2019.dbo.userprofile (
apid INT NOT NULL
,auid INT NOT NULL
,firstname VARCHAR(50) NOT NULL
,lastname VARCHAR(50) NOT NULL
,email VARCHAR(100) NOT NULL
,phone VARCHAR(45) NOT NULL
);
След това трябва да вмъкнем данните в създадените таблици.
USE AdventureWorks2019
GO
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(1,'admin','pswrd123', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(1,1,'Jack', 'Wolf', '[email protected]','600075764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(2, 'admin1','pass506', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(2, 3, 'Tom', 'Collins', '[email protected]','878511311054');
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(4,'fox12','[email protected]', GETDATE(), 1);
Insert into userprofile
(apid, auid, firstname, lastname, email, phone)
values
(4,5,'Bill', 'Fonskin', '[email protected]','450985764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(6, 'lexus1267','98hnfRT6', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(7, 7, 'John', 'Hopkins', '[email protected]','878511311054');
SQL INNER JOIN
Инструкцията INNER JOIN връща записи, които имат съвпадащи стойности и в двете таблици.
Синтаксисът на клаузата SQL INNER JOIN е както следва:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SQL OUTER JOIN
Противно на клаузите INNER JOIN, OUTER JOIN връщат не само съвпадащи записи, но и такива, които не съвпадат. В случай, че има несъответстващи редове в обединена таблица, стойностите NULL ще бъдат показани за тях.
Има следните два типа OUTER JOIN в SQL Server:SQL LEFT JOIN и SQL RIGHT JOIN. Нека разгледаме по-отблизо всеки от тях.
SQL LEFT JOIN
SQL LEFT JOIN връща всички записи от лявата таблица (таблица A) и съвпадащите записи от дясната таблица (таблица B). Резултатът е 0 записа от дясната страна, ако няма съвпадение.
Синтаксисът на клаузата LEFT JOIN на SQL е както следва:
SELECT column_name(s)
FROM tableA
LEFT JOIN tableB
ON tableA.column_name = tableB.column_name;
SQL DIGHT JOIN
Ключовата дума RIGHT JOIN връща всички записи от дясната таблица (таблица2) и съвпадащите записи от лявата таблица (таблица1). Резултатът е 0 записа от лявата страна, ако няма съвпадение.
Синтаксисът на клаузата SQL RIGHT JOIN е както следва:
SELECT column_name(s)
FROM tableA
RIGHT JOIN tableB
ON tableA.column_name = tableB.column_name;
SQL FULL OUTER JOIN
FULL OUTER JOIN връща всички записи, когато има съвпадение в левите (таблица А) или десните (таблица Б) записи на таблицата.
Синтаксисът на клаузата на SQL FULL OUTER JOIN е както следва:
SELECT column_name(s)
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column_name = tableB.column_name
WHERE condition;
SQL КРЪСТО ПРИСЪЕДИНЯВАНЕ
SQL CROSS JOIN, известен също като декартово JOIN, извлича всички комбинации от редове от всяка таблица. При този тип JOIN резултатният набор се връща чрез умножаване на всеки ред от таблица A с всички редове в таблица B, ако не е въведено допълнително условие.
За да разберем по-добре кръстосаните присъединявания, нека да разгледаме диаграмата на Venn по-долу.
Синтаксисът на SQL CROSS JOIN е както следва:
SELECT *
FROM tableA
CROSS JOIN tableB;
SQL Self JOIN
Самоприсъединяването е редовно JOIN, но таблицата се присъединява към себе си. Това означава, че всеки ред от таблицата се комбинира със себе си и с всеки друг ред на таблицата.
Синтаксисът на SQL self JOIN е както следва:
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
Заключение
Знанията и опитът в използването на SQL JOIN клаузи са основни умения на всеки DBA или анализатор. Със своята звездна функционалност за завършване на код, dbForge Studio за SQL Server може да ви спести време и усилия за писане дори на най-сложните JOIN клаузи. Не е нужно да имате предвид стотици имена на колони или псевдоними, dbForge Studio за SQL ще подкани пълна клауза SQL JOIN. Богатата функционалност на инструмента прави проектирането на сложни SQL заявки и управлението на условията на JOIN бързо, лесно и удобно.