Какие типы JOIN существуют в SQL?

Слышал что на собеседованиях спрашивают подобный вопрос. Знаю, что есть INNER JOIN и OUTER JOIN, но это не всё. Какие ещё есть , и в чём их разница?

Существуют такие типі соединений таблиц:

  • INNER JOIN,
  • FULL OUTER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • CROSS JOIN

Давай разберёмся на примерах.

Есть у нас 2 таблицы.

Первая:

CREATE TABLE myTable
(
	NameID smallint IDENTITY NOT NULL, -- ключевое слово IDENTITY закрывает поле от ввода пользователя и сервер заполняет его автоматически.
	FirstName char(25) NOT NULL,
	LastName char(45) NULL
)
INSERT INTO myTable -- по умолчанию порядок записи компонентов элемента такой же как и при создании таблицы. INTO - не обязателен.
VALUES
('Bill', 'Clinton'),
('Michael', 'Jackson'),
('Al', 'Capone'),
('Feofan', 'Nejromonah')
GO

И вторая:

CREATE TABLE mySecondTable
(
	NameID smallint IDENTITY NOT NULL, -- ключевое слово IDENTITY закрывает поле от ввода пользователя и сервер заполняет его автоматически.
	FirstName char(25) NOT NULL,
	LastName char(45) NULL
)
INSERT INTO mySecondTable -- по умолчанию порядок записи компонентов элемента такой же как и при создании таблицы. INTO - не обязателен.
VALUES
('Bill', 'Clinton'),
('Michael', 'Jordan'),
('Louise', 'Armstrong'),
('Nick', 'Fury')
GO

Итак, пойдём по командам.

select * from myTable INNER JOIN mySecondTable ON myTable.FirstName = mySecondTable.FirstName
go

Сравнивает значения поля FirstName у таблицы слева и таблицы справа.

В нашем примере выведутся оба Bill Clinton и оба Michael (не смотря на то что фамилии у них разные, потому что сравнение идёт на поле имени).


select * from myTable full outer JOIN mySecondTable ON myTable.FirstName = mySecondTable.FirstName
go

По сути одно и то же что и INNER JOIN, но также возвращает варианты, которые не совпадают.


select * from myTable left OUTER JOIN mySecondTable ON myTable.FirstName = mySecondTable.FirstName
go

select * from myTable right OUTER JOIN mySecondTable ON myTable.FirstName = mySecondTable.FirstName go

Возвращает все совпадающие (и не совпадающие) варианты с левой и правой сторон соответственно.


select * from myTable CROSS JOIN mySecondTable
go

Возвращает все возможные варианты (1-1, 1-2, 1-3, 1-4, 2-1, 2-2 ...)