여러 테이블에서 데이터 가져 오기
여러 테이블의 데이터 표시
대규모 데이터베이스의 관련 테이블은 외래 및 기본 키를 사용하거나 흔히 공통 열이라고하는 항목을 통해 연결됩니다. 테이블을 결합하는 기능을 사용하면 생성되는 결과 테이블에 더 많은 의미를 추가 할 수 있습니다. 쿼리에서 'n'개의 테이블을 조인하려면 최소 (n-1) 개의 조인 조건이 필요합니다. 조인 조건에 따라 Oracle은 일치하는 행 쌍을 결합하고 조인 조건을 만족하는 행을 표시합니다.
조인은 다음과 같이 분류됩니다.
자연 조인 (동등 조인 또는 단순 조인이라고도 함)-일반적으로 명명되고 정의 된 열을 사용하여 조인을 만듭니다.
비동 등 조인-조인 할 테이블에 동등한 행이 없을 때 테이블을 조인합니다 (예 : 테이블의 한 열에있는 값을 다른 테이블의 값 범위와 일치).
자체 조인-테이블을 자신에 조인합니다.
외부 조인-다른 테이블에 일치하는 레코드가없는 경우 출력에 테이블의 레코드를 포함합니다.
카티 전 조인 (카티 시안 곱 또는 교차 조인이라고도 함)-첫 번째 테이블의 각 행을 두 번째 테이블의 모든 행과 함께 복제합니다. 가능한 모든 레코드 조합을 표시하여 테이블 간의 조인을 만듭니다.
자연 조인
NATURAL 키워드는 동등 조인의 구문을 단순화 할 수 있습니다. NATURAL JOIN은 두 개 이상의 테이블에 동일한 이름의 열이 있고 열이 조인 호환 가능할 때 (즉, 열에 값의 공유 도메인이있는 경우) 가능합니다. operation은 동일한 명명 된 열에 대해 동일한 열 값을 가진 테이블의 행을 조인합니다.
DEPARTMENTS 테이블과 EMPLOYEES 테이블 간의 일대 다 관계를 고려하십시오. 각 테이블에는 DEPARTMENT_ID라는 열이 있습니다.이 열은 DEPARTMENTS 테이블의 기본 키이고 EMPLOYEES 테이블의 외래 키입니다.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;
FIRST_NAME DNAME
---------- ------
MILLER DEPT 1
JOHN DEPT 1
MARTIN DEPT 2
EDWIN DEPT 2
아래 SELECT 쿼리는 ON 키워드로 조인 조건을 명시 적으로 지정하여 두 테이블을 조인합니다.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);
NATURAL JOIN과 관련하여 몇 가지 제한 사항이 있습니다. NATURAL JOIN으로 LOB 열을 지정할 수 없습니다. 또한 조인에 관련된 열은 테이블 이름 또는 별칭으로 정규화 될 수 없습니다.
USING 절
자연 조인을 사용하여 Oracle은 조인의 기반을 형성하는 열을 암시 적으로 식별합니다. 많은 상황에서 조인 조건을 명시 적으로 선언해야합니다. 이러한 경우 USING 절을 사용하여 결합 기준을 지정합니다. USING 절은 열의 동일성을 기반으로 테이블을 조인하므로 Equijoin이라고도합니다. 내부 조인 또는 단순 조인이라고도합니다.
통사론:
SELECT <column list>
FROM TABLE1 JOIN TABLE2
USING (column name)
아래 SELECT 쿼리를 고려하면 EMPLOYEES 테이블과 DEPARTMENTS 테이블이 공통 열 DEPARTMENT_ID를 사용하여 조인됩니다.
SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);
셀프 조인
SELF-JOIN 연산은 단일 테이블 내에 저장된 행 사이에 관심 관계가 존재할 때 결과 테이블을 생성합니다. 즉, 테이블이 자신에게 조인 될 때 조인을 자체 조인이라고합니다.
직원과보고 관리자가 포함 된 EMPLOYEES 테이블을 고려하십시오. 직원의 관리자 이름을 찾으려면 EMP 테이블 자체에 대한 조인이 필요합니다. 이것은 Self Join의 전형적인 후보입니다.
SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;
비 동등 조인
비동 등 조인은 관련 열을 등호로 조인 할 수없는 경우 조인 할 테이블에 동등한 행이 없음을 의미합니다. 비동 등 조인을 사용하면 한 열에 범위의 최소값을 저장할 수 있습니다. 레코드의 최대 값과 다른 열의 최대 값. 따라서 열 대 열 일치를 찾는 대신 비 균등 조인을 사용하여 배송되는 항목이 열의 최소 범위와 최대 범위 사이에 속하는지 여부를 확인할 수 있습니다. 조인이 해당 항목에 대해 일치하는 범위를 찾은 경우 해당 배송 수수료는 결과로 반환 될 수 있습니다. 기존의 동등 조인 방법과 마찬가지로 WHERE 절에서 비동 등 조인을 수행 할 수 있습니다. 또한 JOIN 키워드를 ON 절과 함께 사용하여 조인에 대한 관련 열을 지정할 수 있습니다.
SELECT E.first_name,
J.job_hisal,
J.job_losal,
E.salary
FROM employees E JOIN job_sal J
ON (E.salary BETWEEN J.job_losal AND J.job_losal);
같음 및 부등식 연산자, BETWEEN, IS NULL, IS NOT NULL 및 RELATIONAL과 같이 앞에서 설명한 모든 비교 매개 변수를 사용할 수 있습니다.
외부 결합
외부 조인은 두 테이블이 관련되어 있더라도 한 테이블의 행이 두 번째 테이블의 행과 일치하지 않는 상황을 식별하는 데 사용됩니다.
외부 조인에는 LEFT, RIGHT 및 FULL OUTER JOIN의 세 가지 유형이 있습니다. 모두 INNER JOIN으로 시작한 다음 삭제 된 행 중 일부를 다시 추가합니다. LEFT OUTER JOIN은 조인 조건의 첫 번째 (왼쪽) 테이블에서 삭제 된 모든 행을 다시 추가하고 두 번째 (오른쪽) 테이블의 출력 열은 NULL로 설정됩니다. RIGHT OUTER JOIN은 조인 조건의 두 번째 (오른쪽) 테이블에서 삭제 된 모든 행을 다시 추가하고 첫 번째 (왼쪽) 테이블의 출력 열은 NULL로 설정됩니다. FULL OUTER JOIN은 두 테이블에서 삭제 된 모든 행을 다시 추가합니다.
오른쪽 외부 결합
RIGHT OUTER JOIN은 조인 조건의 두 번째 (오른쪽) 테이블에서 삭제 된 모든 행을 다시 추가하고 첫 번째 (왼쪽) 테이블의 출력 열은 NULL로 설정됩니다. 아래 쿼리는 직원과 해당 부서를 나열합니다. 또한 부서 30에 직원이 지정되지 않았습니다.
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
왼쪽 외부 결합
LEFT OUTER JOIN은 조인 조건의 첫 번째 (왼쪽) 테이블에서 삭제 된 모든 행을 다시 추가하고 두 번째 (오른쪽) 테이블의 출력 열은 NULL로 설정됩니다. 위에 설명 된 쿼리는 (+) 기호의 위치를 교환하여 왼쪽 외부 조인을 설명하는 데 사용할 수 있습니다.
SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);
FIRST_NAME SALARY DEPARTMENT_ID
---------- ---------- ----------
JOHN 6000 10
EDWIN 2000 20
MILLER 2500 10
MARTIN 4000 20
30
전체 외부 결합
FULL OUTER JOIN은 두 테이블에서 삭제 된 모든 행을 다시 추가합니다. 아래 쿼리는 직원과 부서를 나열합니다. 직원 'MAN'은 지금까지 어떤 부서도 할당되지 않았으며 (NULL) 부서 30은 직원에게 할당되지 않았습니다.
SELECT nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;
FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN -
JOHN 10
EDWIN 20
MILLER 10
MARTIN 20
- 30
6 rows selected.
데카르트 곱 또는 교차 조인
두 엔티티 A와 B의 경우 A * B는 카티 전 곱으로 알려져 있습니다. 카티 전 곱은 각 테이블의 가능한 모든 행 조합으로 구성됩니다. 따라서 10 개의 행이있는 테이블이 20 개의 행이있는 테이블과 결합되면 데카르트 곱은 200 행 (10 * 20 = 200)이됩니다. 예를 들어 직원 테이블을 8 개 행으로, 부서 테이블을 3 개 행으로 결합하면 다음이 생성됩니다. 24 개 행의 데카르트 곱 테이블 (8 * 3 = 24).
교차 조인은 두 테이블의 카티 전 곱을 나타냅니다. 두 테이블의 외적을 생성합니다. 위 쿼리는 CROSS JOIN 절을 사용하여 작성할 수 있습니다.
카티 전 곱 결과 테이블은 일반적으로 그다지 유용하지 않습니다. 실제로 이러한 결과 테이블은 매우 오해의 소지가 있습니다. EMPLOYEES 및 DEPARTMENTS 테이블에 대해 아래 쿼리를 실행하면 결과 테이블은 모든 직원이 모든 부서와 관계가 있음을 의미하며, 이것이 사실이 아님을 압니다!
SELECT E.first_name, D.DNAME
FROM employees E,departments D;
교차 조인은 다음과 같이 작성할 수 있습니다.
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;