관리 메뉴

프로그래밍 삽질 중

SQL 조인 설명 및 예제 본문

과거 프로그래밍 자료들/SQL(Oracle)

SQL 조인 설명 및 예제

평부 2021. 3. 22. 13:29

※ 조인

- 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력

- 여러 테이블 사용 시 FROM 이용

- 조인 조건이 없을 때 단점 1 : 연결하는 두 개의 데이터가 일치 하지 않아도 함께 출력

- 조인 조건이 없을 때 단점 2 : 어떤 조건으로 연결해야할 지 기준을 작성자가 직접 지정

- 조인 조건이 없을 때 단점 3 : WHERE절을 이용해 출력 행을 선정하는 조건절 명시

- 조인 조건이 없을 때 단점 4 : 서로 다른 테이블에 같은 이름의 열 구분 -> 테이블 이름. 열 이름

 

※ 조인 종류

- 곱집합 : 가능한 모든 행 조합해서 조인

- 동등 조인(등가조인) : 조인 조건이 정확히 일치 -> 결과 출력

- 비동등 조인 : 조인 조건이 일치X -> 결과 출력

- 외부 조인 : 조인 조건이 일치X -> 결과 출력

- 자체 조인 : 자체 테이블끼리 조인

 

[예시1]

사원 정보를 포함해 근무 부서 이름(EMP)과 부서 위치 정보(DEPT) 조회

1
2
3
SELECT *FROM EMP, DEPT
ORDER BY EMPNO; //EMP, DEPT 다 EMPNO를 가짐
cs

[예시2]

EMP 테이블(별칭 E)과 DEPT(별칭 D) 테이블 간 비교(EMPNO 기준으로 정렬)

1
2
3
4
SELECT *
FROM EMP E, DEPT D --E, D는 임의로 붙임
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
cs

 

[예시 3] - 등가조인

여러 테이블의 열 이름(DEPTNO)이 같을 경우 -> 어느 열에 속해 있는지 명시하기

사원정보, 이름 , 부서정보, 부서이름, 지역 출력 / 사원정보 기준으로 정렬

1
2
3
4
5
SELECT
E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
cs

 

[예시 4] - 비등가조인

EMP 테이블과 SALGRADE 테이블(각 등급정보, 등급 관련 최소금액, 최대 금액)은 서로 연결하기가 부적합

사원들의 급여 등급을 포함한 사원 정보 출력

1
2
3
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BTWEEN S.LOSAL AND S.HISAL;
cs

 

[예시 5] - 자체조인

하나의 테이블을 여러 개 테이블처럼 사용

EMP 테이블에는 직속상관의 사원번호가 저장되어 있음

사원의 이름과 해당 사원의 직속상관 이름을 나란히 출력 -> EMP 2번 사용

1
2
3
4
5
6
SELECT
E.EMPNO, E.ENAME, E.MGR,
M.EMPNO AS MGR_NO, --상관 번호로 저장
M.ENAME AS MGR_NAME --상관 이름으로 저장
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO;
cs

 

[예시 6] - 외부조인 : 직원 정보와 상사 정보와 함께 출력

조건을 만족하지 않는 행도 강제로 출력

왼쪽 외부조인(오른쪽에 (+) 삽입), 오른쪽 외부조인(왼쪽에 (+) 삽입)

(+)가 들어간 부분은 NULL값으로 나옴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- 왼쪽 외부 조인 사용
SELECT 
E.EMPNO, E.ENMAE, E.MGR,
M.EMPNO AS MGR_NO,
M.ENMAE AS MGR_NAME
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO(+)
-- MGR, MGR_NO, MGR_NAME이 NULL
-- 사원번호, 사원이름은 나오나 상사 관련 내용X
ORDER BY E.EMPNO;
 
-- 오른쪽 외부 조인 사용
SELECT 
E.EMPNO, E.ENMAE, E.MGR,
M.EMPNO AS MGR_NO,
M.ENMAE AS MGR_NAME
FROM EMP E, EMP M
WHERE E.MGR(+= M.EMPNO
-- EMPNO, ENAME, MGR이 NULL
-- MGR_NO나 MGR_NAME은 나오나 EMPNO, ENAME, MGR은 NULL
ORDER BY E.EMPNO;
cs

 

※ 표준문법 조인

1) JOIN ~ USING : 등가 조인을 대신해 조인

- USING을 통해 사용할 열 명시

 

[예시 7] - 급여가 5000이상인 사원들의 정보와 근무부서 출력하기

1
2
3
4
5
6
7
SELECT 
E.EMPNO, E.ENAME, E.JOB, E.MGR,
E.HIREDATE, E.SAL, E.COMM,
DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D USING(DEPTNO)
WHERE SAL >= 5000
ORDER BY DEPTNO, E.EMPNO;
cs

 

2) JOIN~ON : USING 대신에 ON사용

 

[예시 8] - 급여가 5000이상인 사원들의 정보와 근무부서 출력하기

1
2
3
4
5
6
7
SELECT 
E.EMPNO, E.ENAME, E.JOB, E.MGR,
E.HIREDATE, E.SAL, E.COMM,
DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D ON(E.DEPTNO = D.DEPTNO)
WHERE SAL >= 5000
ORDER BY DEPTNO, E.EMPNO;
cs

3) OUTER JOIN : 외부 조인에 사용함, WHERE이 아닌 FROM에서 조인 설정

- 왼쪽 외부조인(LEFT OUTER , 오른쪽 외부 조인, 전체 외부조인(FULL OUTER JOIN) 있음

 

[예시 9] 직원 정보와 상사 정보와 함께 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 왼쪽 외부 조인 사용
SELECT 
E.EMPNO, E.ENMAE, E.MGR,
M.EMPNO AS MGR_NO,
M.ENMAE AS MGR_NAME
FROM EMP E LEFT OUTER JOIN EMP M ON(E.MGR = M.EMPNO)
-- MGR, MGR_NO, MGR_NAME이 NULL
-- 사원번호, 사원이름은 나오나 상사 관련 내용X
ORDER BY E.EMPNO;
 
-- 오른쪽 외부 조인 사용
SELECT 
E.EMPNO, E.ENMAE, E.MGR,
M.EMPNO AS MGR_NO,
M.ENMAE AS MGR_NAME
FROM EMP E RIGHT OUTER JOIN EMP M ON(E.MGR = M.EMPNO)
-- EMPNO, ENAME, MGR이 NULL
-- MGR_NO나 MGR_NAME은 나오나 EMPNO, ENAME, MGR은 NULL
ORDER BY E.EMPNO;
 
cs