반응형
[SQL_오라클] JOIN
JOIN
- JOIN에는 Selection과 Production 연산이 있다.
- Selection 연산은 row, 즉, tuple에서의 연산
- Production 연산은 column에서의 연산
- nested loop는 튜플 하나를 맞춰보기 위해서 튜플 하나하나에 조인되는 테이블을 한 번씩 쭉 살펴보는 것이다.
- merge sort loop는 정렬을 시킨 다음 매칭 시키는 것이다.
- hash loop는 정렬이 아니라 유니크하게 나열한 다음 매칭 시키는 것이다.
- 안티 조인
- 안티 조인이란 조인 조건에서 NOT IN 연산자를 사용하는 조인
- = 의 안티라고 해서!=, <>가 아니다. 이것은 단지 cartesain product의 일부이다.
- 예
SELECT emp.employee_id, emp.first_name
FROM employees emp
WHERE emp.department_id NOT IN
(SELECT dep.department_id
FROM departments dep
WHERE dep.location_id = 3200);
- 세미 조인
- EXISTS 사용하는 JOIN
- 예
SELECT dep.*
FROM departments dep
WHERE EXISTS ( SELECT 1
FROM employees emp
WHERE emp.department_id = dep.department_id
AND emp.salary > 10000)
ORDER BY dep.department_id; - 사족
SELECT 1
FROM employees emp
WHERE emp.department_id = dep.department_id
AND emp.salary > 10000
=> 이 query는 부서 아이디가 같은 것 중에 연봉이 10000 초과인 데이터를 아무 값(1)을 줘서 있다는 것을 표시하는 것임
- ANSI 조인 - 표준 표기법
-
- SQL 사상에 맞게 평이한 텍스트 형식의 문법을 사용하고 있다.
- FULL OUTER JOIN을 지원한다.
- 다른 DBMS와의 호환성을 위해
Join을 어떻게 사용하느냐에 따라 performance에 차이가 있는 것 같다.
*JOIN을 할 때 조인 조건을 먼저 써주고 검색 조건을 나중에 써주는 것이 가독성을 위해 좋다.
********************************************************************
JOIN 참고자료
********************************************************************
* JOIN의 개념 *
- JOIN은 두 개의 릴레이션에 대해 연관된 튜플들을 결합하여, 하나의 새로
운 릴레이션을 반환한다. - JOIN은 크게 INNER JOIN과 OUTER JOIN으로 구분된다.
- JOIN은 일반적으로 FROM절에 기술하지만, 릴레이션이 사용되는 어느 곳에서나 사용할 수 있다.
* INNER JOIN *
- INNER JOIN은 일반적으로 EQUI JOIN과 NON EQUI JOIN으로 구분된다.
- EQUI JOIN은 JOIN 대상 테이블에서 공통 속성을 기준으로 '='(equal) 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 생성하는 JOIN방법이다.
- EQUI JOIN에서 JOIN조건이 '='일 때 동일한 속성이 두 번 나타나게 되는데, 이 중 중복된 속성을 제거하여 같은 속성을 한 번만 표기하는 방법을 NATURAL JOIN이라 한다.
- EQUI JOIN에서 연결 고리가 되는 공통 속성을 JOIN속성이라고 한다.
= WHERE 절을 이용한 EQUI JOIN 표기 형식 =
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1, 테이블명 2,..
WHERE 테이블명 1. 속성명 = 테이블명 2. 속성명;= NATURAL JOIN을 이용한 EQUI JOIN의 표기 형식 =
SELECT [테이블명 1.], [테이블명 2.] 속성명,..
FROM 테이블명 1 NATURAL JOIN 테이블명 2;= JOIN ~ USING 절을 이용한 EQUI JOIN의 표기 형식 =
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1 JOIN 테이블명 2 USING(속성명);예) <학생> 테이블과 <학과> 테이블에서 학과 코드 값이 같은 튜플을 JOIN 하여 학번, 이름, 학과 코드, 학과명을 출력하는 SQL문- WHERE절 이용 -
SELECT 학번, 이름, 학과 코드, 학과명
FROM 학생, 학과
WHERE 학생. 학과 코드 = 학과. 학과 코드;- NATURAL JOIN -
SELECT 학번, 이름, 학과 코드, 학과명
FROM 학생 NATURAL JOIN 학과;- JOIN ~ USING -
SELECT 학번, 이름, 학과 코드, 학과명
FROM 학생 JOIN 학과 USING(학과 코드);
* OUTER JOIN *
=> LEFT OUTER JOIN의 경우 LEFT 테이블의 값을 다 출력해주기 위해 RIGTH의 테이블이 모자라면 Null 값을 추가해서 출력하라는 의미에서 left 테이블 = right 테이블(+)인 것 같다
=> 또한 OUTER JOIN에서는 전체의 값을 보장받는 테이블을 먼저 읽어 전체가 몇 개인지를 알고 그다음 순서대로 읽는다.
=> OUT JOIN의 단점은 Driving Table의 순서가 정해져 있다는 것이다. 가장 좋은 것은 딱 하나의 튜플만을 찾아 조인을 시도하는 것이다.
- (+)는 WHERE 절에서만 사용 가능하다
- 테이블 간 외부 조인 조건이 한 개 이상일 경우, 모든 외부 조인 조건에
(+)를 붙여야 외부 조인이 성립된다. 또한 정확한 외부조건 결과를 얻기 위해서는 조인 조건 외의 일반조건에도 (+)를 붙여야 한다.
-> 일반조건에 (+)를 붙이지 않으면 그 조건에 해당하는 데이터만 나온다.
이렇게 되면 OUTER JOIN을 한 의미가 없다. 때문에 조건에 (+)를 붙여 주
면 조건에 해당하지 않는 튜플들은 OUTER JOIN으로 지정된 테이블의
데이터를 제외하고 NULL로 바꿔서 출력한다. - 테이블 자신에 (+)를 붙일 수 없다.
- (+)는 오직 칼럼에만 붙일 수 있으며 OR 연산자 또는 IN 연산자와는 같이 사용할 수 없다. => IN이라는 것은 포함 여부를 따지는 명령어인데 OUTER JOIN은 비교대는 값이 없더라도 조회 결과가 나와야 하는 명령어이다. 서로 상반되는 기능이기에 사용할 수 없다.
- OUTER JOIN시 대상 테이블은 오직 한 개의 테이블과만 외부 조인이 가능하다.(?)
- OUTER JOIN은 릴레이션에서 JOIN조건에 만족하지 않더라도 결과로 출력하기 위한 JOIN방법으로, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.
- - LEFT OUTER JOIN -
INNER JOIN의 결과를 구한 후, 우측 항 릴레이션의 어떤 튜플과도 맞지 않는 좌측 항의 릴레이션에 있는 튜플들에 NULL 값을 붙여서 INNER JOIN의 결과에 추가한다.
- - LEFT OUTER JOIN -
= 표기 형식 =
<1>
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1 LEFT OUTER JOIN 테이블명 2
ON 테이블명 1. 속성명 = 테이블명 2. 속성명;
<2>
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1, 테이블명 2
WHERE 테이블명 1. 속성명 = 테이블명 2. 속성명(+);
- - RIGHT OUTER JOIN -
- INNER JOIN의 결과를 구한 후, 좌측 항 릴레이션의 어떤 튜플과도 맞지 않는 우측 항의 릴레이션에 있는 튜플들에 NULL값을 붙여서 INNER JOIN의 결과에 추가한다.
= 표기 형식 =
<1>
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1 RIGHT OUTER JOIN 테이블명 2
ON 테이블명 1. 속성명 = 테이블명 2. 속성명;
<2>
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1, 테이블명 2
WHERE 테이블명 1. 속성명(+) = 테이블명 2. 속성명;
- - FULL OUTER JOIN -
- LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합쳐 놓은 것이다.
- INNER JOIN의 결과를 구한 후, 좌측 항의 릴레이션의 튜플들에 대해서 우측 항의 릴레이션의 어떤 튜플과도 맞지 않는 튜플들에 NULL값을 붙여서 INNER JOIN의 결과에 추가한다. 그리고 유사하게 우측 항의 릴레이션의 튜플들에 대해 좌측 항의 릴레이션의 어떤 퓨플과도 맞지 않는 튜플들에 NULL값을 붙여서 INNER JOIN의 결과에 추가한다.
= 표기 형식 =
SELECT [테이블명 1.] 속성명, [테이블명 2.] 속성명,..
FROM 테이블명 1 FULL OUTER JOIN 테이블명 2
ON 테이블명 1. 속성명 = 테이블명 2. 속성명;예) <학생> 테이블과 <학과> 테이블에서 학과 코드 값이 같은 튜플을 JOIN 하여 학번, 이름, 학과 코드, 학과명을 출력하는 SQL문 (학과 코드가 입력되지 않은 학생도 출력)
<1>
SELECT 학번, 이름, 학과 코드, 학과명
FROM 학생 LEFT OUTER JOIN 학과 ON 학생. 학과 코드 = 학과. 학과 코드;
<2>
SELECT 학번, 이름, 학과 코드, 학과명
FROM 학생, 학과 WHERE 학생. 학과 코드 = 학과. 학과 코드(+);
* SELF JOIN *
- SELF JOIN은 같은 테이블에서 두 개의 속성을 연결하여 EQUI JOIN을 하는 JOIN방법이다.
= 표기 형식 =
<1>
SELECT [별칭 1.] 속성명, [별칭 1.] 속성명,..
FROM 테이블명 1 [AS] 별칭 1 JOIN 테이블명 1 [AS] 별칭 2
ON 별칭 1. 속성명 = 별칭 2. 속성명;
<2>
SELECT [별칭 1.] 속성명, [별칭 1.] 속성명,..
FROM 테이블명 1 [AS] 별칭 1, 테이블명 1 [AS] 별칭 2
WHERE 별칭 1. 속성명 = 별칭 2. 속성명;
예) 학생 테이블을 SELF JOIN 하여 선배가 있는 학생과 선배의 이름을 구하는 SQL문
<1>
SELECT A. 학번, A. 이름, B. 이름 AS 선배
FROM 학생 A JOIN 학생 B ON A. 선배=B. 학번;
<2>
SELECT A. 학번, A. 이름, B. 이름 AS 선배
FROM 학생 A , 학생 B WHERE A. 선배=B. 학번
728x90
'Computer Science & Engineering > Oracle' 카테고리의 다른 글
[SQL_오라클] SET 연산자 (0) | 2022.06.10 |
---|---|
[SQL_오라클] 서브쿼리 (0) | 2022.06.10 |
[SQL_오라클] GROUP QUERY (0) | 2022.06.10 |
[SQL_오라클] 1일차 숙제 (0) | 2022.06.10 |
[SQL_오라클] WHERE 절 (0) | 2022.06.08 |
댓글