Да, я использую все три из этих JOIN, хотя я склонен использовать только LEFT (OUTER) JOIN
вместо того, чтобы смешивать LEFT и RIGHT JOIN. Я также использую FULL OUTER JOIN
с и CROSS JOIN
с.
Таким образом, INNER JOIN
ограничивает набор результатов только теми записями, которые удовлетворяют условию JOIN. Рассмотрим следующие таблицы
РЕДАКТИРОВАТЬ: Я переименовал имена таблиц и префикс их с @
, так что переменные таблицы могут использоваться для любого, кто читает этот ответ и хочет экспериментировать.
Если вы также хотите поэкспериментировать с этим в браузере, Я настроил все это на SQL Fiddle тоже;
@Table1
id | name
---------
1 | One
2 | Two
3 | Three
4 | Four
@Table2
id | name
---------
1 | Partridge
2 | Turtle Doves
3 | French Hens
5 | Gold Rings
код SQL
DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');
DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');
Оператор SQL INNER JOIN
, объединенный в поле id
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
Результаты в
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
A LEFT JOIN
вернет набор результатов со всеми записями из таблицы в левой части объединения (если вы выписали инструкцию в виде одного строки, таблицы, которая появляется первой) и полей из таблицы в правой части объединения, которые соответствуют выражению объединения и включены в предложение SELECT
. Отсутствующие детали будут заполнены значением NULL
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
Результаты в
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
A RIGHT JOIN
- это та же логика, что и LEFT JOIN
, но она возвращает все записи с правой стороны объединения и поля с левой стороны, которые соответствуют выражению соединения и включены в предложение SELECT
.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
Результаты в
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
Конечно, есть также FULL OUTER JOIN
, который включает записи из обеих объединенных таблиц и заполняет любые пропущенные детали NULL.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
Результаты в
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
И CROSS JOIN
(также известный как CARTESIAN PRODUCT
), который является просто результатом перекрестного применения полей в операторе SELECT
из одной таблицы с полями в операторе SELECT
из другой таблицы. Обратите внимание, что в CROSS JOIN
нет выражения объединения
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
Результаты в
id | name | name
------------------
1 | One | Partridge
2 | Two | Partridge
3 | Three | Partridge
4 | Four | Partridge
1 | One | Turtle Doves
2 | Two | Turtle Doves
3 | Three | Turtle Doves
4 | Four | Turtle Doves
1 | One | French Hens
2 | Two | French Hens
3 | Three | French Hens
4 | Four | French Hens
1 | One | Gold Rings
2 | Two | Gold Rings
3 | Three | Gold Rings
4 | Four | Gold Rings
EDIT:
Представьте, что теперь есть Таблица3
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
Код SQL
DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');
Теперь все три таблицы объединены с INNER JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
INNER JOIN
@Table3 t3
ON
t1.id = t3.id
Результаты в
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Это может помочь понять этот результат, полагая, что записи с идентификаторами 2 и 3 являются единственными общими для всех трех таблиц и также являются полями, к которым мы присоединяемся к каждой таблице.
Теперь все три с LEFT JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Результаты в
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
Ответ Джоэля - хорошее объяснение для объяснения этого набора результатов (Таблица1 - таблица базы / происхождения).
Теперь с INNER JOIN
и LEFT JOIN
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Результаты в
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Хотя нам неизвестен порядок, в котором оптимизатор запросов будет выполнять операции, мы рассмотрим этот запрос сверху вниз, чтобы понять набор результатов. INNER JOIN
для идентификаторов между таблицами Table1 и Table2 будет ограничивать набор результатов только теми записями, которые удовлетворяют условию соединения, то есть тремя строками, которые мы видели в самом первом примере. Этот временный набор результатов будет затем LEFT JOIN
преобразован в Таблицу3 для идентификаторов между Таблицей1 и Таблицами; В Таблице 3 есть записи с идентификаторами 2 и 3, но без идентификатора 1, поэтому в поле t3.name будут указаны детали для 2 и 3, но не 1.