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