Oracle Database
가입
수색…
크로스 조인
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.DEPT
의 SCOTT.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부터 JOIN
은 INNER JOIN
과 기능면에서 동등합니다. 이 작업에는 CROSS JOIN
및 NATURAL 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