Может кто-нибудь объяснить мне, в чем разница между union All и join в Oracle SQL?

Я ищу этот вопрос с последних 2 дней, в чем разница между UNION и JOIN. Специально UNION ALL и Natural JOIN. Итак, у меня есть 2 запроса здесь первый

CREATE OR REPLACE VIEW VU_m1 AS 
SELECT department_id,manager_id FROM employees 
NATURAL JOIN departments ;
SELECT * FROM vu_m1;

а второй

CREATE OR REPLACE VIEW VU_m2 AS 
SELECT department_id,manager_id FROM employees 
UNION ALL
SELECT department_id,manager_id FROM departments; 
SELECT * FROM vu_m2;

Результат обоих запросов одинаков. Так в чем же разница между UNION ALL и Natural JOIN?

Подробности: я использую Oracle 11gR2, работающий над образцом базы данных HR.

3 ответа

Это мои 2 цента

+----------------------------------+--------------------------------------------+
+- UNION                           +- JOIN                                      +
+----------------------------------+--------------------------------------------+
+SELECT 1 AS bah FROM DUAL         + SELECT *                                   +
+      EMP.DEPTNO                  + FROM                                       +
+SELECT 2 AS bah FROM DUAL;        + (SELECT 1 AS bah from dual)  foo           +
+                                  + JOIN                                       +
+                                  + (SELECT 2 AS bah from dual)  bar           +
+                                  + ON 1=1;                                    +
+----------------------------------+--------------------------------------------+
+-                              RESULTS                                         +
+----------------------------------+--------------------------------------------+
+This gives everything in vertical + This gives everything in horizontal        +
+    BAH                           + BAH  BAH                                   +
+    1                             + 1    2                                     +
+    2                             +                                            +
+----------------------------------+--------------------------------------------+
+-                             OBSERVATIONS                                     +
+----------------------------------+--------------------------------------------+
+ UNION puts lines from queries    + JOIN makes a Cartesian product             +
+ after each other                 + and subsets it                             +
+                                  +                                            +
+ UNION combines the results of    + JOIN can retrieve data from two or         +
+ two or more queries into a single+ more tables based on logical relationships +
+ result set that includes all the + between the tables. Joins indicate how SQL +
+ rows that belong to all queries  + should use data from one table to select   +
+ in the union.                    + the rows in another table.                 +
+                                  +                                            +
+ UNION makes two queries look     + JOIN examine two or more tables in         +
+ like one.                        + a single query statement                   +
+                                  +                                            +
+ UNION returns the results of two + JOIN relates similar data in different     +
+ different queries as a single    + tables.                                    +
+ recordset.                       +                                            +
+                                  +                                            +
+----------------------------------+--------------------------------------------+

JOIN выбирает поля из таблицы A и поля из таблицы B и складывает их все вместе, JOIN является "горизонтальным", например:

SELECT A.A1, A.A2, A.A3, B.B1, B.B2
FROM A
INNER JOIN B
ON A.A10 = B.B20

который может быть написан так:

select A1, A2, A3, B1, B2 from TABLEA, TABLEB
WHERE A10 = B20

результат:

Field-A1 | Field-A2 | Field-A3 | Field-B1 | Field-B2 |  
...

СОЮЗ / UNIONALL:

Разница между ними заключается в том, что UNION возвращает только различные результаты, а UNIONALL возвращает ВСЕ результаты (включая дубликаты). UNION/UNIONALL объединяет результаты двух выборок - но есть "зацепка" - имена столбцов должны быть точно такими же - это свойство делает UNION "вертикальным", например:

Select A1 as X1, A2 as X2 from TABLEA
UNIONALL
Select B1 as X1, B2 as X2 from TABLEB

результат:

Field-X1 | Field-X2
A1      | A2
B1      | B2
...

Объединение. Объединение - это операция SQL, выполняемая для установления соединения между двумя или более таблицами базы данных на основе совпадающих столбцов, тем самым создавая связь между таблицами. Наиболее сложные запросы в системе управления базами данных SQL включают команды соединения. Например: SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate ОТ заказов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Клиентов НА Orders.CustomerID=Customers.CustomerID;

Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT.

Обратите внимание, что каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов. Столбцы также должны иметь похожие типы данных. Кроме того, столбцы в каждой инструкции SELECT должны иметь один и тот же синтаксис: SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;

Другие вопросы по тегам