Какво е SQL JOIN
и какви са различните типове?
SQL JOIN
?SQL JOIN
е метод за извличане на данни от две или повече таблици в базата данни.
SQL JOIN
?Съществуват общо пет вида JOIN
. Те са :
1. JOIN or INNER JOIN
2. OUTER JOIN
2.1 LEFT OUTER JOIN or LEFT JOIN
2.2 RIGHT OUTER JOIN or RIGHT JOIN
2.3 FULL OUTER JOIN or FULL JOIN
3. NATURAL JOIN
4. CROSS JOIN
5. SELF JOIN
При този вид JOIN
получаваме всички записи, които отговарят на условието в двете таблици, а записите в двете таблици, които не отговарят, не се отчитат.
С други думи, INNER JOIN
се основава на един-единствен факт, който: САМО съвпадащите записи в ДВЕТЕ таблици ТРЯБВА да бъдат изброени.
Обърнете внимание, че JOIN
без никакви други ключови думи JOIN
(като INNER
, OUTER
, LEFT
и т.н.) е INNER JOIN
. С други думи, JOIN
е
Синтактична захар за INNER JOIN
(вижте: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join).
OUTER JOIN
извлича
Или, съвпадащите редове от едната таблица и всички редове в другата таблица Или, всички редове във всички таблици (без значение дали има съвпадение или не).
Съществуват три вида външно обединение :
2.1 ЛЯВО ВЪНШНО СЪЕДИНЕНИЕ или ЛЯВО СЪЕДИНЕНИЕ
При това обединение се връщат всички редове от лявата таблица в комбинация със съответстващите редове от лявата таблица.
от дясната таблица. Ако в дясната таблица няма съвпадащи колони, се връщат стойности NULL
.
2.2 RIGHT OUTER JOIN или RIGHT JOIN
Това JJOIN
връща всички редове от дясната таблица в комбинация със съвпадащите редове от
лявата таблица. Ако в лявата таблица няма съвпадащи колони, той връща стойности NULL
.
2.3 FULL OUTER JOIN или FULL JOIN
Това JOIN
съчетава LEFT OUTER JOIN
и RIGHT OUTER JOIN
. Той връща редове от двете таблици, когато условията са изпълнени, и връща стойност NULL
, когато няма съвпадение.
С други думи, OUTER JOIN
се основава на факта, че: САМО съвпадащите записи в ЕДНА от таблиците (ДЯСНА или ЛЯВА) или в ДВЕТЕ таблици (ПЪЛНА) ТРЯБВА да бъдат изброени.
Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
Тя се основава на две условия :
JOIN
се прави на всички колони с едно и също име за равенство.Изглежда, че това е по-скоро от теоретично естество и в резултат на това (вероятно) повечето СУБД дори не си правят труда да го поддържат.
Това е декартовото произведение на двете участващи таблици. Резултатът от CROSS JOIN
няма да има смисъл
в повечето ситуации. Нещо повече, това изобщо няма да ни е необходимо (или е необходимо най-малко, за да сме точни).
Това не е различна форма на JOIN
, а по-скоро е JOIN
(INNER
, OUTER
и т.н.) на дадена таблица към самата себе си.
В зависимост от оператора, използван за клаузата JOIN
, могат да съществуват два вида JOIN
. Те са
Equi JOIN
Theta JOIN
За който и да е тип JOIN
(INNER
, OUTER
и т.н.), ако използваме САМО оператора за равенство (=), тогава казваме, че
JOIN
е EQUI JOIN
.
Това е същото като EQUI JOIN
, но позволява всички други оператори като >, <, >= и т.н.
Мнозина смятат, че както
EQUI JOIN
, така и ThetaJOIN
са подобни наINNER
,OUTER
. и т.н.JOIN
. Но аз съм твърдо убеден, че това е грешка и прави идеи неясни. ЗащотоINNER JOIN
,OUTER JOIN
и т.н. са свързани с таблиците и техните данни, докатоEQUI JOIN
иTHETA JOIN
са само свързани с операторите, които използваме в първите.Отново има много хора, които смятат, че
NATURAL JOIN
е някакъв вид "своеобразен"EQUI JOIN
. Всъщност, това е вярно, тъй като на първия условие, което споменах заNATURAL JOIN
. Въпреки това, не е нужно да ограничаваме това само доNATURAL JOIN
.INNER JOIN
s,OUTER JOIN
s и т.н. също могат да бъдатEQUI JOIN
.
Определение:
Съединенията са начин за търсене на данни, които се комбинират от няколко таблици едновременно.
В СУБД има 5 типа обединения:
Еqui-Join: Комбинира общи записи от две таблици въз основа на условие за равенство. Технически обединението се извършва чрез използване на оператора за равенство (=) за сравняване на стойностите на първичния ключ на една таблица и стойностите на чуждия ключ на друга таблица, поради което резултатът включва общи (съвпадащи) записи от двете таблици. За изпълнение вижте INNER-JOIN.
Natural-Join: Това е усъвършенствана версия на Equi-Join, при която SELECT пропуска дублиращата се колона. За изпълнение вижте INNER-JOIN
Неравно-съединяване: Това е обратното на равно-съединяването, при което условието за присъединяване използва други оператори, различни от оператора за равенство (=), например !=, <=, >=, >, < или BETWEEN и т.н. За изпълнение вижте INNER-JOIN.
Самоприсъединяване:: Обикновено това е необходимо за запитване на самосвързващи се таблици (или Unary relationship entity). За изпълнение вижте INNER-JOINs.
Картезиански продукт: Той комбинира всички записи от двете таблици без никакви условия. Технически той връща резултата от заявка без клауза WHERE.
Според загрижеността и напредъка на SQL съществуват 3 типа обединения и всички обединения на RDBMS могат да бъдат постигнати с помощта на тези типове обединения.
ВЪТРЕШНО СЪЕДИНЕНИЕ: То обединява (или комбинира) съвпадащи редове от две таблици. Съпоставянето се извършва въз основа на общите колони на таблиците и операцията за тяхното сравняване. Ако условието се основава на равенство, тогава: Извършва се EQUI-JOIN, в противен случай - Non-EQUI-Join.
OUTER-JOIN: Той обединява (или комбинира) съвпадащи редове от две таблици и несъвпадащи редове с NULL стойности. Въпреки това, може да персонализира избора на несъвпадащи редове, напр. да избере несъвпадащ ред от първата таблица или втората таблица по подтипове: LEFT OUTER JOIN и RIGHT OUTER JOIN.
2.1. ЛЕВО ВЪНШНО СЪЕДИНЕНИЕ (известно още като LEFT-JOIN): Връща съвпадащи редове от две таблици и несъвпадащи редове само от ЛЯВАТА таблица (т.е. първата таблица).
2.2. Дясно външно свързване (известно още като RIGHT-JOIN): Връща съвпадащи редове от две таблици и несъвпадащи редове само от ДЯСНАТА таблица.
2.3. ПЪЛНО ВЪНШНО СЪЕДИНЕНИЕ (известно още като OUTER JOIN): Връща съвпадащи и несъвпадащи редове от двете таблици.
CROSS-JOIN: Това обединение не обединява/комбинира, а извършва декартово произведение.
Забележка: Self-JOIN може да се постигне чрез INNER-JOIN, OUTER-JOIN и CROSS-JOIN в зависимост от изискванията, но таблицата трябва да се присъедини към себе си.
1.1: INNER-JOIN: Имплементация на Equi-join
SELECT *
FROM Table1 A
INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
1.2: INNER-JOIN: Реализация на Natural-JOIN
Select A.*, B.Col1, B.Col2 --But no B.ForeignKeyColumn in Select
FROM Table1 A
INNER JOIN Table2 B On A.Pk = B.Fk;
1.3: INNER-JOIN с изпълнение NON-Equi-join
Select *
FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
1.4: INNER-JOIN с SELF-JOIN
Select *
FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
2.1: OUTER JOIN (пълно външно присъединяване)
Select *
FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
2.2: LEFT JOIN
Select *
FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
2.3: ДЯСНО СЪЕДИНЕНИЕ
Select *
FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
3.1: CROSS JOIN
Select *
FROM TableA CROSS JOIN TableB;
3.2: CROSS JOIN-Self JOIN
Select *
FROM Table1 A1 CROSS JOIN Table1 A2;
//OR//
Select *
FROM Table1 A1,Table1 A2;