Слышал что на собеседованиях спрашивают подобный вопрос. Знаю, что есть 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 ...)