[SQLD] 2 -2 SQL 활용 (1)

Joy·2020년 5월 4일
0

SQL

목록 보기
7/9

1. 표준 조인

standard sql

일반 집합 연산자 --> 현재의 SQL

(비교)
1. UNION 연산은 UNION 기능으로,
2. INTERSECTION 연산은 INTERSECT 기능으로,
3. DIFFERENCE 연산은 EXCEPT(Oracle은 MINUS) 기능으로,
4. PRODUCT 연산은 CROSS JOIN 기능으로

순수 관계 연산자 --> 현재의 SQL

SELECT->WHERE
PROJECT->SELECT
(NATURAL)JOIN->다양한JOIN
DIVIDE->현재 사용하지 않음

from 절 join 형태

ANSI/ISO SQL에서 표시하는 FROM 절의 JOIN 형태

- INNER JOIN - NATURAL JOIN - USING 조건절 - ON 조건절 - CROSS JOIN - OUTER JOIN

inner join

내부 JOIN
JOIN 조건에서 동일한 값이 있는 행만 반환
USING 조건절이나 ON조건절을 필수적으로 사용 (WHERE 절에서 사용하던 JOIN 조건을 FROM 절에서 정의하겠다는 표시이므로)

예)
SQL>>
“사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 출력하시오.”

SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

->(다음도 같은 코드)

SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME FROM EMP
INNER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

->(다음도 같은 코드, INNER JOIN을 JOIN으로 써도 상관 없다. 디폴트값이 INNER JOIN)

SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME FROM EMP
JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

Natural join

두테이블간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=)JOIN을 수행
JOIN에 사용된 칼럼들은 같은 데이터 유형이어야 한다
NATURAL JOIN이 명시되면, 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없다.
SQL Server에서는 지원하지 않는 기능

[예제] 사원 번호와 사원 이름, 소속부서 코드와 소속부서 이름을 찾아본다.

SELECT DEPTNO, EM PNO, ENAM E, DNAM E FROM EM P NATURAL JOIN DEPT;

USING 조건절

FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수가 있다
SQL Server에서는 지원하지 않는다
JOIN칼럼에 대해서는 ALIAS나 테이블이름과 같은 접두사를 붙일 수 없다

예)
Oracle SQL>>

SELECT * FROM DEPT JOIN DEPT_TEMP USING (DEPTNO);

ON 조건절

JOIN 서술부(ON 조건절)와 비 JOIN 서술부(WHERE 조건절)를 분리하여 이해가 쉬우며,
칼럼명이 다르더라도 JOIN 조건을 사용할 수 있는 장점이 있다
★ ALIAS나 테이블명과 같은 접두사를 사용해야한다

가. WHERE 절과의 혼용
SQL>>
“부서코드 30인 부서의 소속 사원 이름 및 소속 부서 코드, 부서 코드, 부서 이름을 출력하시오.”

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME FROM EMP E
JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) WHERE E.DEPTNO = 30;

Cross join

테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
결과는 양쪽 집합의 M*N 건의 데이터 조합이 발생

outer join

OUTER(외부) JOIN
JOIN 조건에서 동일한 값이 없는 행도 반환, null 값도
USING 조건 절이나 ON 조건 절을 필수적으로 사용

LEFT OUTER JOIN

조인 수행 시 좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 우측테이블에서 JOIN 대상 데이터를 읽어온다

RIGHT OUTER JOIN

LEFT OUTER JOIN와 반대로 우측 테이블이 기준

FULL OUTER JOIN

합집합 개념으로 LEFT와 RIGHT를 모두 읽어 온다

INNER vs OUTER vs CROSS JOIN 비교

INNER JOIN 결과

양쪽 테이블에 모두 존재하는 키 값이 B-B, C-C 인 2건이 출력

LEFT OUTER JOIN 결과

TAB1을 기준으로 키 값 조합이 B-B, C-C, D-NULL, E-NULL 인 4건이 출력

RIGHT OUTER JOIN 결과

TAB2를 기준으로 키 값 조합이 NULL-A, B-B, C-C 인 3건이 출력된다.

FULL OUTER JOIN 결과

양쪽 테이블을 기준으로 키 값 조합이 NULL-A, B-B, C-C, D-NULL, E-NULL 인 5건이 출력

CROSS JOIN 결과

JOIN 가능한 모든 경우의 수를 표시하지만 단, OUTER JOIN은 제외한다.
양쪽 테이블 TAB1과 TAB2의 데이터를 곱한 개수인 4 * 3 = 12건이 추출됨
키 값 조합이 B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C 인 12건이 출력

2. 집합연산자

두개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중 하나
2개 이상의 질의 결과를 하나의 결과로
제약조건 : SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능(반드시 동일한 데이터 타입일 필요는 없음)해야 한다

3. 계층형 질의와 셀프 조인

계층형 질의

테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 사용
엔터티를 순환관계 데이터 모델로 설계할 경우 계층형 데이터가 발생한다.

(예: 조직, 사원, 메뉴 등)

@@ Oracle 계층형 질의

@@ SQL Server 계층형 질의

‘앵커 멤버’(Anchor Member)

‘재귀 멤버’(Recursive Member)

셀프 조인

“동일 테이블 사이의 조인”
반드시 테이블 별칭(Alias)을 사용해야 한다.

[예제]

SELECT E1.사원, E1.관리자, E2.관리자 차상위_관리자 FROM 사원 E1, 사원 E2 WHERE E1.관리자 = E2.사원 ORDER BY E1.사원;

[실행 결과] 사원 관리자 차상위_관리자 ---- ------ ---------- B A C A D C A E C A

profile
roundy

0개의 댓글