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

**URL:** <https://forum.itvdn.com/t/kakie-tipy-join-sushhestvuyut-v-sql/1967>\
**Category:** SQL\
**Created:** [20.07.2018 08:37:17 UTC](https://forum.itvdn.com/t/kakie-tipy-join-sushhestvuyut-v-sql/1967 "2018-07-20T08:37:17Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![sergey226](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/s/f6c823/32.png) [@sergey226](https://forum.itvdn.com/u/sergey226)\
**Post date:** [20.07.2018 08:37:17 UTC](https://forum.itvdn.com/t/kakie-tipy-join-sushhestvuyut-v-sql/1967/1 "2018-07-20T08:37:17Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![yaroslavselnik](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/y/c4cdca/32.png) [@yaroslavselnik](https://forum.itvdn.com/u/yaroslavselnik)\
**Post date:** [20.07.2018 10:32:37 UTC](https://forum.itvdn.com/t/kakie-tipy-join-sushhestvuyut-v-sql/1967/2 "2018-07-20T10:32:37Z")

</div>

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

- 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 ...)
