수색…


크로스 조인

CROSS JOIN 은 명시 적 조인 절을 사용하지 않고 두 테이블의 카디 전 곱을 결과로 가져 오는 두 테이블 사이의 조인을 수행합니다. 데카르트 곱은 하나의 테이블의 각 행이 조인에서 두 번째 테이블의 각 행과 결합됨을 의미합니다. 예를 들어 TABLEA 에 20 개의 행이 있고 TABLEB 에 20 개의 행이 있으면 결과는 20*20 = 400 출력 행이됩니다.

예:

SELECT * 
FROM TABLEA CROSS JOIN TABLEB;

이것은 또한 다음과 같이 쓰여질 수 있습니다 :

SELECT *
FROM TABLEA, TABLEB;

다음은 두 테이블 간의 SQL에서 크로스 조인의 예입니다.

샘플 테이블 : TABLEA

+-------+---------+
| VALUE |   NAME  |
+-------+---------+
|   1   |   ONE   |
|   2   |   TWO   |
+-------+---------+

샘플 표 : TABLEB

+-------+--------+
| VALUE |  NAME  |
+-------+--------+
|   3   |  THREE |
|   4   |  FOUR  |
+-------+--------+

자, 쿼리를 실행하면 :

SELECT *
FROM TABLEA CROSS JOIN TABLEB;

산출:

+-------+--------+-------+--------+
| VALUE |  NAME  | VALUE |  NAME  |
+-------+--------+-------+--------+
|   1   |   ONE  |   3   |  THREE |
|   1   |   ONE  |   4   |  FOUR  |
|   2   |   TWO  |   3   |  THREE |
|   2   |   TWO  |   4   |  FOUR  |
+-------+--------+-------+--------+

다음과 같이 두 테이블간에 교차 결합이 발생합니다. 산출

Cross Join에 대한 추가 정보 : Oracle 문서

내부 결합

INNER JOIN은 명시 적 조인 절을 지정할 수있는 JOIN 연산입니다.

통사론

TableExpression [INNER] JOIN TableExpression {ON booleanExpression | USING 절}

부울 식과 함께 ON을 지정하여 조인 절을 지정할 수 있습니다.

ON 절의 표현식 범위에는 현재 테이블과 현재 SELECT에 대한 외부 쿼리 블록의 테이블이 포함됩니다. 다음 예에서 ON 절은 현재 테이블을 참조합니다.

-- Join the EMP_ACT and EMPLOYEE tables
-- select all the columns from the EMP_ACT table and 
-- add the employee's surname (LASTNAME) from the EMPLOYEE table
-- to each row of the result
SELECT SAMP.EMP_ACT.*, LASTNAME
 FROM SAMP.EMP_ACT JOIN SAMP.EMPLOYEE
 ON EMP_ACT.EMPNO = EMPLOYEE.EMPNO
-- Join the EMPLOYEE and DEPARTMENT tables, 
-- select the employee number (EMPNO),  
-- employee surname (LASTNAME), 
-- department number (WORKDEPT in the EMPLOYEE table and DEPTNO in the
-- DEPARTMENT table) 
-- and department name (DEPTNAME) 
-- of all employees who were born (BIRTHDATE) earlier than 1930.
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME 
 FROM SAMP.EMPLOYEE JOIN SAMP.DEPARTMENT 
 ON WORKDEPT = DEPTNO 
 AND YEAR(BIRTHDATE) < 1930

-- Another example of "generating" new data values, 
-- using a query which selects from a VALUES clause (which is an 
-- alternate form of a fullselect). 
-- This query shows how a table can be derived called "X"
-- having 2 columns "R1" and "R2" and 1 row of data
SELECT *
FROM (VALUES (3, 4), (1, 5), (2, 6))
AS VALUESTABLE1(C1, C2)
JOIN (VALUES (3, 2), (1, 2),
(0, 3)) AS VALUESTABLE2(c1, c2)
ON VALUESTABLE1.c1 = VALUESTABLE2.c1
-- This results in:
-- C1         |C2         |C1         |2
-- -----------------------------------------------
-- 3          |4          |3          |2
-- 1          |5          |1          |2 


-- List every department with the employee number and 
-- last name of the manager

SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
FROM DEPARTMENT INNER JOIN EMPLOYEE
ON MGRNO = EMPNO

-- List every employee number and last name 
-- with the employee number and last name of their manager
SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME    
FROM EMPLOYEE E INNER JOIN    
DEPARTMENT INNER JOIN EMPLOYEE M 
    ON MGRNO = M.EMPNO
    ON E.WORKDEPT = DEPTNO

LEFT OUTER JOIN

LEFT OUTER JOIN 은 명시 적 조인 절이 필요하지만 첫 번째 테이블에서 불일치 행을 제외하지 않는 두 테이블 간의 조인을 수행합니다.

예:

SELECT                                      
      ENAME,                                
      DNAME,                                
      EMP.DEPTNO,                           
      DEPT.DEPTNO                           
FROM                                        
      SCOTT.EMP LEFT OUTER JOIN SCOTT.DEPT  
      ON EMP.DEPTNO = DEPT.DEPTNO;          

ANSI 구문이 권장되는 방법이지만 레거시 구문이 자주 접하게 될 가능성이 큽니다. 조건 내에서 (+) 사용하면 방정식의 어느 쪽이 바깥 쪽으로 간주 될지 결정됩니다.

SELECT                                      
      ENAME,                                
      DNAME,                                
      EMP.DEPTNO,                           
      DEPT.DEPTNO                           
FROM                                        
      SCOTT.EMP, 
      SCOTT.DEPT  
WHERE
      EMP.DEPTNO = DEPT.DEPTNO(+);

다음은 두 테이블 사이의 왼쪽 외부 조인의 예입니다.

샘플 테이블 : EMPLOYEE

+-----------+---------+
|    NAME   |  DEPTNO |
+-----------+---------+
|     A     |    2    |
|     B     |    1    |
|     C     |    3    |
|     D     |    2    |
|     E     |    1    |
|     F     |    1    |
|     G     |    4    |
|     H     |    4    |
+-----------+---------+

샘플 표 : DEPT

+---------+--------------+
|  DEPTNO |   DEPTNAME   |
+---------+--------------+
|    1    |  ACCOUNTING  |
|    2    |    FINANCE   |
|    5    |   MARKETING  |
|    6    |      HR      |
+---------+--------------+

자, 쿼리를 실행하면 :

SELECT
      *
FROM
      EMPLOYEE LEFT OUTER JOIN DEPT
      ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;

산출:

+-----------+---------+---------+--------------+
|    NAME   |  DEPTNO |  DEPTNO |   DEPTNAME   |
+-----------+---------+---------+--------------+
|     F     |    1    |    1    |  ACCOUNTING  |
|     E     |    1    |    1    |  ACCOUNTING  |
|     B     |    1    |    1    |  ACCOUNTING  |
|     D     |    2    |    2    |    FINANCE   |
|     A     |    2    |    2    |    FINANCE   |
|     C     |    3    |         |              |
|     H     |    4    |         |              |
|     G     |    4    |         |              |
+-----------+---------+---------+--------------+

오른쪽 외부 조인

RIGHT OUTER JOIN 은 명시 적 조인 절이 필요하지만 두 번째 테이블에서 일치하지 않는 행을 제외하지 않는 두 테이블 간의 조인을 수행합니다.

예:

SELECT                                      
      ENAME,                                
      DNAME,                                
      EMP.DEPTNO,                           
      DEPT.DEPTNO                           
FROM                                        
      SCOTT.EMP RIGHT OUTER JOIN SCOTT.DEPT  
      ON EMP.DEPTNO = DEPT.DEPTNO;          

SCOTT.DEPTSCOTT.DEPT 하지 않는 행은 포함되어 있지만 SCOTT.EMP 의 일치하지 않는 행은 포함되어 있지 않으므로 위의 것은 LEFT OUTER JOIN 사용하는 다음 명령문과 같습니다.

SELECT                                      
      ENAME,                                
      DNAME,                                
      EMP.DEPTNO,                           
      DEPT.DEPTNO                           
FROM                                        
      SCOTT.DEPT RIGHT OUTER JOIN SCOTT.EMP  
      ON DEPT.DEPTNO = EMP.DEPTNO;

다음은 두 테이블 간의 오른쪽 외부 조인의 예입니다.

샘플 테이블 : EMPLOYEE

+-----------+---------+
|    NAME   |  DEPTNO |
+-----------+---------+
|     A     |    2    |
|     B     |    1    |
|     C     |    3    |
|     D     |    2    |
|     E     |    1    |
|     F     |    1    |
|     G     |    4    |
|     H     |    4    |
+-----------+---------+

샘플 표 : DEPT

+---------+--------------+
|  DEPTNO |   DEPTNAME   |
+---------+--------------+
|    1    |  ACCOUNTING  |
|    2    |    FINANCE   |
|    5    |   MARKETING  |
|    6    |      HR      |
+---------+--------------+

자, 쿼리를 실행하면 :

SELECT
      *
FROM
      EMPLOYEE RIGHT OUTER JOIN DEPT
      ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;

산출:

+-----------+---------+---------+--------------+
|    NAME   |  DEPTNO |  DEPTNO |   DEPTNAME   |
+-----------+---------+---------+--------------+
|     A     |    2    |    2    |    FINANCE   |
|     B     |    1    |    1    |  ACCOUNTING  |
|     D     |    2    |    2    |    FINANCE   |
|     E     |    1    |    1    |  ACCOUNTING  |
|     F     |    1    |    1    |  ACCOUNTING  |
|           |         |    5    |   MARKETING  |
|           |         |    6    |      HR      |
+-----------+---------+---------+--------------+

쿼리에 해당하는 Oracle (+) 구문은 다음과 같습니다.

SELECT *
FROM EMPLOYEE, DEPT
WHERE EMPLOYEE.DEPTNO(+) = DEPT.DEPTNO;

전체 외부 조인

FULL OUTER JOIN 은 명시 적 조인 절이 필요하지만 두 테이블 중 일치하지 않는 행을 제외하지 않는 두 테이블 간의 조인을 수행합니다. 즉, 각 테이블의 모든 행을 반환합니다.

예:

SELECT                                     
      *                                    
FROM                                       
      EMPLOYEE FULL OUTER JOIN DEPT 
      ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;         

다음은 두 테이블 간의 완전 외부 조인의 예입니다.

샘플 테이블 : EMPLOYEE

+-----------+---------+
|    NAME   |  DEPTNO |
+-----------+---------+
|     A     |    2    |
|     B     |    1    |
|     C     |    3    |
|     D     |    2    |
|     E     |    1    |
|     F     |    1    |
|     G     |    4    |
|     H     |    4    |
+-----------+---------+

샘플 표 : DEPT

+---------+--------------+
|  DEPTNO |   DEPTNAME   |
+---------+--------------+
|    1    |  ACCOUNTING  |
|    2    |    FINANCE   |
|    5    |   MARKETING  |
|    6    |      HR      |
+---------+--------------+

자, 쿼리를 실행하면 :

SELECT
      *
FROM
      EMPLOYEE FULL OUTER JOIN DEPT
      ON EMPLOYEE.DEPTNO = DEPT.DEPTNO;

산출

+-----------+---------+---------+--------------+
|    NAME   |  DEPTNO |  DEPTNO |   DEPTNAME   |
+-----------+---------+---------+--------------+
|     A     |    2    |    2    |    FINANCE   |
|     B     |    1    |    1    |  ACCOUNTING  |
|     C     |    3    |         |              |
|     D     |    2    |    2    |    FINANCE   |
|     E     |    1    |    1    |  ACCOUNTING  |
|     F     |    1    |    1    |  ACCOUNTING  |
|     G     |    4    |         |              |
|     H     |    4    |         |              |
|           |         |    6    |      HR      |
|           |         |    5    |   MARKETING  |
+-----------+---------+---------+--------------+

여기서 일치하지 않는 열은 NULL로 유지됩니다.

항생제

antijoin은 술어의 오른쪽에서 대응하는 행이없는 술어의 왼쪽에서 행을 리턴합니다. 오른쪽에있는 하위 쿼리와 일치하지 않는 행을 반환합니다 (NOT IN).

SELECT * FROM employees 
   WHERE department_id NOT IN 
   (SELECT department_id FROM departments 
       WHERE location_id = 1700)
   ORDER BY last_name;

다음은 두 테이블 간의 안티 조인의 예입니다.

샘플 테이블 : EMPLOYEE

+-----------+---------+
|    NAME   |  DEPTNO |
+-----------+---------+
|     A     |    2    |
|     B     |    1    |
|     C     |    3    |
|     D     |    2    |
|     E     |    1    |
|     F     |    1    |
|     G     |    4    |
|     H     |    4    |
+-----------+---------+

샘플 표 : DEPT

+---------+--------------+
|  DEPTNO |   DEPTNAME   |
+---------+--------------+
|    1    |  ACCOUNTING  |
|    2    |    FINANCE   |
|    5    |   MARKETING  |
|    6    |      HR      |
+---------+--------------+

자, 쿼리를 실행하면 :

SELECT
      *
FROM
      EMPLOYEE WHERE DEPTNO NOT IN
      (SELECT DEPTNO FROM DEPT);

산출:

+-----------+---------+
|    NAME   |  DEPTNO |
+-----------+---------+
|     C     |    3    |
|     H     |    4    |
|     G     |    4    |
+-----------+---------+

출력에는 EEPLOYEE 테이블의 행만 표시되며 DEPTNO는 DEPT 테이블에 없습니다.

SEMIJOIN

예를 들어 세미 일 (semijoin) 쿼리를 사용하여 급여가 2500 명을 초과하는 직원이 적어도 한 명꼴 인 모든 부서를 찾을 수 있습니다.

SELECT * FROM departments 
   WHERE EXISTS 
   (SELECT 1 FROM employees 
       WHERE departments.department_id = employees.department_id 
       AND employees.salary > 2500)
   ORDER BY department_name; 

이것은 전체 조인 대안보다 효율적입니다. 직원에 대한 내부 참여로 급여가 2500보다 커야 함을 자세히 설명하는 where 절을 제공하면 동일한 부서를 여러 번 반환 할 수 있습니다. 소방서가있는 경우 말 n 직원 모두 급여 3000, select * from departments, employees 필요한와이 ID를 가입하고 우리의 where 절은 소방서 반환 n 번.

어울리다

JOIN 조작은 첫 x ​​째 테이블에서 불일치 행을 제외한 두 테이블 간의 조인을 수행합니다. Oracle 9i부터 JOININNER JOIN 과 기능면에서 동등합니다. 이 작업에는 CROSS JOINNATURAL JOIN 연산자와 달리 명시적인 조인 절이 필요합니다.

예:

select t1.*,
       t2.DeptId
  from table_1 t1
  join table_2 t2 on t2.DeptNo = t1.DeptNo

오라클 설명서 :

NATURAL JOIN

NATURAL JOIN은 명시 적 조인 조건이 필요하지 않습니다. 그것은 조인 된 테이블에 같은 이름을 가진 모든 필드를 기반으로 하나를 빌드합니다.

create table tab1(id number,  descr varchar2(100));
create table tab2(id number,  descr varchar2(100));
insert into tab1 values(1, 'one');
insert into tab1 values(2, 'two');
insert into tab1 values(3, 'three');
insert into tab2 values(1, 'ONE');
insert into tab2 values(3, 'three');

조인은 두 테이블 모두에 공통 인 필드 ID 및 DESCR에서 수행됩니다.

SQL> select *
  2  from tab1
  3        natural join
  4       tab2;

        ID DESCR
---------- ----------
         3 three

다른 이름을 가진 열은 JOIN 조건에서 사용되지 않습니다.

SQL> select *
  2  from (select id as id, descr as descr1 from tab1)
  3       natural join
  4       (select id as id, descr as descr2 from tab2);

        ID DESCR1     DESCR2
---------- ---------- ----------
         1 one        ONE
         3 three      three

조인 된 테이블에 공통 열이 없으면 조건이없는 JOIN이 수행됩니다.

SQL> select *
  2  from (select id as id1, descr as descr1 from tab1)
  3       natural join
  4       (select id as id2, descr as descr2 from tab2);

       ID1 DESCR1            ID2 DESCR2
---------- ---------- ---------- ----------
         1 one                 1 ONE
         2 two                 1 ONE
         3 three               1 ONE
         1 one                 3 three
         2 two                 3 three
         3 three               3 three


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow