Традиционно извличате данни от две или повече таблици с помощта на WHERE
клауза в заявка. Но в система за релационна база данни (RDBMS) това може да се постигне с помощта на един SELECT
запитване. Това е истинската сила на системите за релационни бази данни. В това ръководство ще научите за SQL Joins, мощен начин за сравняване и избор на редове и таблици.
Какво е SQL присъединяване?
В SQL, join
клаузата разширява възможността за сравняване и избор на редове от таблици. Той използва алгебричен процес на комбиниране на редове от две или повече таблици въз основа на свързана колона в тези таблици. Според ANSI-стандартната SQL дефиниция има пет типа обединения –Кръстосани обединявания , Вътрешни съединения , Леви (външни) присъединявания , Дясно (външно) присъединяване и Пълни (външни) присъединявания . Тези обединения се прилагат във всички системи за релационни бази данни и са обхванати в разделите по-долу.
Забележка Обединяванията могат да се извършват на произволен брой таблици в дадена заявка. За краткост и яснота, това ръководство обсъжда присъединяванията, приложени към две таблици.
Това ръководство използва две таблици, Employees
и Address
, съответно, за демонстриране на SQL Joins. Всяка от тези таблици съдържа следните дефиниции и данни на колони:
-
Таблица на служителите
EmployeeId EmployeeName 1 Джон 2 Мери 3 Робърт -
Таблица с адреси
Id Състояние 1 Ню Йорк 2 Ню Джърси 3 Айдахо 4 Хавай
Забележка Освен ако не е посочено друго, всички команди в това ръководство работят добре и на MySQL и PostgreSQL бази данни.
SQL кръстосани присъединявания
Известно също като декартово присъединяване , кръстосани обединявания възникват, когато посочите множество таблици като източник за вашия SELECT
списък с колони. В този случай пропускате WHERE
клауза за присъединяване, за да съответства на редовете. Резултатът съдържа ред за всяка комбинация от редове между таблиците. В сценарий с две таблици всеки ред в една таблица е сдвоен с всеки ред от другата таблица. Полученият продукт е известен като декартов продукт от двете маси. Синтаксисът за кръстосано присъединяване е следният:
(# Rows in Table A) TIMES (# of Rows in Table B)
ЗабележкаВ теорията на множествата декартовото произведение е операция на умножение, която генерира всички подредени двойки от дадените множества. Например, помислете за набор
A
с елементи{a,b}
и задайтеB
с елементи{1,2,3}
. Декартовото произведение наA
иB
се обозначава сAxB
и резултатът е следният:AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
SQL синтаксисът за кръстосано свързване е както следва:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM [Table_1]
CROSS JOIN [Table_2]
От горния синтаксис, Column_1
, Column_2
, Column_N
представлява колоните в таблица и CROSS JOIN
клауза служи за комбиниране на двете таблици, Table_1
и Table_2
. От примерните таблици по-горе, ако трябва да извършите кръстосано присъединяване на Employees
и Address
таблици, използвайте следния SQL код:
SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address
Резултатът от горния SQL код прилича на следното:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| John | New Jersey |
| John | Idaho |
| John | Hawaii |
| John | New York |
| Mary | New York |
| Mary | New Jersey |
| Mary | Idaho |
| Mary | Hawaii |
| Robert | New York |
| Robert | New Jersey |
| Robert | Idaho |
| Robert | Hawaii |
+------------+----------------+
SQL вътрешно присъединяване
Вътрешното свързване връща редове, които имат съвпадащи стойности в двете таблици. Ако няма съвпадащи записи, тогава в резултатите не се връщат редове.
SQL синтаксисът за Inner Join е както следва:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;
В примера по-горе, key
е съответният ключ на таблиците. Ако трябва да извършите вътрешно присъединяване на Employees
и Address
таблици, използвайте следния SQL код:
SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id
Резултатът от горния SQL код прилича на следното:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
+------------+----------------+
SQL ляво (външно) присъединяване
Лявото свързване връща пълен набор от редове от лявата таблица заедно със съвпадащите редове от дясната таблица. Ако няма съвпадащи записи, тогава NULL
стойностите се връщат от дясната таблица.
Забележка Някои реализации на релационни бази данни използват ключовите думи „Left Outer Join“, за разлика от „Left Join“, но те са функционално еквивалентни.
SQL синтаксисът за лявото присъединяване е както следва:
SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key
В примера по-горе, key
е съответният ключ на таблиците. Ако трябва да извършите ляво присъединяване на Employees
и Address
таблици, използвайте следния SQL код:
SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id
Резултатът от горния SQL код е както следва:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
+------------+----------------+
Дясно (външно) присъединяване към SQL
Дясното свързване връща пълен набор от редове от дясната таблица и съвпадащите редове от лявата таблица. Това е известно още като дясно външно присъединяване. Ако няма съвпадащи записи, тогава NULL
стойностите се връщат от дясната таблица за засегнатите редове в лявата таблица.
Забележка Някои реализации на релационни бази данни използват ключовите думи „Дясно външно присъединяване“, за разлика от „Дясно присъединяване“, но те са функционално еквивалентни.
SQL синтаксисът за дясно присъединяване е както следва:
SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key
От горния код, key
е съответният ключ на таблиците. Ако трябва да извършите правилно присъединяване на Employees
и Address
таблици, използвайте следния SQL код:
SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id
Резултатът от горния SQL код е следният:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Пълно (външно) присъединяване към SQL
Пълно присъединяване връща всички редове от лявата таблица, всички редове от дясната таблица. Това е известно още като пълно външно присъединяване. Пълно присъединяване също връща всички съвпадащи записи от двете таблици, където има такива. Ако няма съвпадащи записи, тогава NULL
стойностите се връщат от лявата таблица. Също така връща NULL
стойности от дясната таблица.
Забележка Някои реализации на релационни бази данни използват ключовите думи „Full Outer Join“, за разлика от „Full Join“, но те са функционално еквивалентни.
SQL синтаксисът за пълно присъединяване е както следва:
SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key
В горния код key
е съответният ключ на таблиците. Ако трябва да извършите пълно присъединяване на Employees
и Address
таблици, използвайте следния SQL код:
SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id
Резултатът от горния SQL код е следният:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Забележка По време на изчисления на присъединяване, ако сравните данните от таблицата сNULL
ценности, те не съвпадат една с друга. Следователно,NULL
стойностите се връщат само като част от резултатите за присъединяване и се игнорират по време на изчисленията на присъединяване.
Сравнение на производителността на SQL присъединявания
Като се имат предвид горните примерни таблици, Inner Join обикновено е най-бързата от петте Join клаузи по отношение на производителността на базата данни. Лявото и дясното свързване са следващите най-бързи в зависимост от размера на двете маси. Пълното присъединяване обикновено е по-бавно от лявото или дясното присъединяване. Cross Join, разчитащ на декартовия продукт на двете таблици, обикновено е най-бавният по отношение на производителността на базата данни. Посочената йерархия на производителността може да се различава в зависимост от дължината на колоната на таблицата, типа данни на колоната и дефинициите на ключове.
Заключение
Използването на SQL Joins разширява функционалността на възможността за сравняване на редове в таблицата спрямо традиционните WHERE
клауза запитвания. Съединенията са ценен механизъм за прилагане на алгебрична логика към две или повече таблици.