Каково различие между inner и outer join?

Каково различие между одним inner и один outer join?

И: какова функция модификаторов left, right или full?

107
задан 30.08.2019, 18:37
2 ответа

Понимая, что его становится одним join колонн без дубликатов, что общий случай:

  • inner join A и B он вручит результат пересечения наборов A и B. В других словах, часть помещает – пересечение – в диаграмме Venn.

  • full outer join между A и B он вручит результат союза A и B. В других словах, внешней части – союзе – в диаграмме Venn.

Примеры:

Давайте предполагать, что у нас есть два подмостков, с единственной колонной каждая и следующие данные:

A    B
-    -
1    3
2    4
3    5
4    6

Замечание, что (1,2) только находятся в A, (3,4) общие и (5,6) только находятся в B.

Inner Join

inner join – используя любой из синтаксисов эквивалентной консультации – вручает тебе пересечение обоих подмостков, а именно, линии, которые оба подмостков есть общим.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a, b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Left outer join

Один outer join из-за левой стороны, он даст тебе все линии A, включая общие линии между A и B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*,b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Right outer join

Один outer join из-за правой стороны он даст тебе все линии B, включая общие линии с A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*,b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Full outer join

Один outer join я завершаю (full) он вручит тебе союз A и B; а именно, все линии A и все линии B. Если у линии в A нет соответствующей линии в B, часть B - null, и vice поверни.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    5
null |    6

Диаграммы Venn

Само, мы можем видеть это с диаграммами Venn:

Explicación visual de joins Изображение SQL Хоинс.свг де Арбекк, имеемое под лицензией CC BY 3.0.

164
ответ дан 01.12.2019, 08:18
  • 1
    #161; Хороший и # 237; simo! С изображением останься совсем ясным.:) – Victor 01.12.2015, 18:52
  • 2
    Изображение, кажется, под лицензией (Те Коде Прохект Опен License), которая, кажется, не позволяет вновь печатать ее без разрешения expl и # 237; я назначаю встречу автора (3.e) – ninjalj 01.12.2015, 21:26
  • 3
    Стоит объяснять для qu и # 233; подай left или right join, хотя не pregunt и # 243;. До того, как существовала эта альтернатива, это был достаточно dif и # 237; cil доставать какие-то доклады. – Walter Mitty 03.12.2015, 15:42
  • 4
    @jachguate aqu и # 237; есть versi и # 243; n изображения с лицензией Креативе Коммонс commons.wikimedia.org/wiki/File:SQL_Joins.svg – El Asiduo 31.08.2016, 07:17

Я буду использовать тот же пример jachguate, который очень ясный добавляя одни pequeños детали.

Глоссарий

  • inner join (traducci¦n я освободил: Внутренний Uni¦n)
  • outer join (traducci¦n я освободил: Внешний Uni¦n)

introducir la descripción de la imagen aquí

-- Crear tabla A (tabla Izquierda)
CREATE TABLE A
(
a INT
);

-- Crear tabla B (tabla derecha)
CREATE TABLE B
(
b INT
);

-- Insertar datos
Insert into A (a) Values (1);
Insert into A (a) Values (2);
Insert into A (a) Values (3);
Insert into A (a) Values (4);
Insert into B (b) Values (3);
Insert into B (b) Values (4);
Insert into B (b) Values (5);
Insert into B (b) Values (6);
COMMIT;

-- Tabla A
SELECT * FROM A;

-- Tabla B
SELECT * FROM B;

/* Inner Join. */
-- Unión interna, filas que ambas tablas tienen en común.
select * from A INNER JOIN B on A.a = B.b;
select A.*, B.*  from A, B where A.a = B.b;

/* Left outer join */
-- Unión externa por la izquierda, todas las filas de A (tabla izquierda) relacionadas con B, así estas tengan o no coincidencias.
select * from A LEFT OUTER JOIN B on A.a = B.b;
select A.*,B.*  from A,B where A.a = B.b(+);

/* Right outer join */
-- Unión externa por la derecha, todas las filas de B (tabla derecha), así estas tengan o no coincidencias con A.
select * from A RIGHT OUTER JOIN B on A.a = B.b;
select A.*,B.*  from A,B where A.a(+) = B.b;

/* Full outer join */
-- Unión externa completa, unión externa por la izquierda unida a unión externa por la derecha. 

-- En oracle:
select * from A FULL OUTER JOIN B on A.a = B.b;

-- En MySql no está implementado FULL OUTER JOIN, para obtener este mismo resultado:

select * from A LEFT OUTER JOIN B on A.a = B.b
UNION 
select * from A RIGHT OUTER JOIN B on A.a = B.b;

introducir la descripción de la imagen aquí

Видеть:

35
ответ дан 01.12.2019, 08:18

Теги

Похожие вопросы