Mysql
 sql >> база данни >  >> RDS >> Mysql

Въведение в SQL Joins

Традиционно извличате данни от две или повече таблици с помощта на 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 клауза запитвания. Съединенията са ценен механизъм за прилагане на алгебрична логика към две или повече таблици.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да архивирате вашата база данни Chamilo LMS MySQL

  2. Neo4j - Пуснете индекс с помощта на Cypher

  3. MySQL:Как да се присъединя към една и съща таблица няколко пъти?

  4. MySQL Неправилна стойност за дата и час:'0000-00-00 00:00:00'

  5. Как да вмъкнете данни от една таблица на база данни в друга таблица на база данни в Mysql