코딩하는 문과생

[SQL] 6. JOIN 본문

프로그래밍/SQL

[SQL] 6. JOIN

코딩하는 문과생 2020. 1. 21. 16:27

# JOIN

논리 모델링에서 중요한 점은

  1. 다대다를 풀어주고
  2. 정규화 시키는 것이다.
  1. EQUAL JOIN: 공통부분을 이용해 JOIN한다.
  2. NON EQUAL JOIN: 공통부분이 없다. 근데 JOIN한다.

JOIN이후 하나의 논리 테이블이 만들어진다고 생각하자.


# 오라클 전용 구문 EX1)

SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E,
		DEPARTMENT D
WHERE	E.DEPT_ID = D.DEPT_ID;

# 오라클 전용 구문 EX2)

SELECT	EMP_NAME
		, SALARY
		, SLEVEL
FROM	EMPLOYEE E
		, SAL_GRADE S
WHERE	E.SALARY BETWEEN S.LOWEST AND S.HIGHEST;

# 오라클 전용 구문 EX3)

//OUTER JOIN 1
SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E,
		DEPARTMENT D
WHERE	E.DEPT_ID(+) = D.DEPT_ID;
//(+)기호 반대쪽에 있는 모든 것을 출력한다.

# 오라클 전용 구문 EX4)

//OUTER JOIN 2
SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E,
		DEPARTMENT D
WHERE	E.DEPT_ID = D.DEPT_ID(+);
//(+)기호 반대쪽에 있는 모든 것을 출력한다.

 

# 오라클 전용 구문 EX5)

//OUTER JOIN 3 - (+), (+)는 불가능
SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E,
		DEPARTMENT D
WHERE	E.DEPT_ID(+) = D.DEPT_ID(+);
//오류, 불가능

# JOIN 구문

...

JOIN TABLE ON condition1 (조건식)

JOIN TABLE USING column (칼럼명)

...

USING구문에서는 테이블 별칭을 사용할 수 없다.

 

EX1)

SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E
		JOIN DEPARTMENT D
		USING(DEPT_ID);
 
//*************************************

SELECT	EMP_NAME
		, SALARY
		, SLEVEL
FROM	EMPLOYEE E
		JOIN SAL_GRADE S
		ON (E.SALARY BETWEEN S.LOWEST AND S.HIGHEST);
//같은 칼럼이지만 이름이 다른 경우 ON을 써서 JOIN한다.
SELECT	DEPT_NAME,
		LOC_DESCRIBE
FROM	DEPARTMENT
		JOIN LOCATION	
		ON (LOC_ID = LOCATION_ID);

  • LEFT JOIN: 왼쪽 테이블을 모두 출력하겠다는 의미
  • RIGHT JOIN: 오른쪽 테이블을 모두 출력하겠다는 의미
  • FULL JOIN: 모두 출력하겠다는 의미
  • NATURAL JOIN: 부모의 기본키와 자식의 외래키가 같은 경우(칼럼이 이름이 같은 경우), 알아서 JOIN해준다.
  • CROSS JOIN: 카디션 프로젝트 (큰 의미가 없는 JOIN)

EX2)

SELECT	EMP_NAME, DEPT_NAME
FROM	EMPLOYEE E
		LEFT JOIN DEPARTMENT D
		USING(DEPT_ID);

왼쪽 테이블 모두 출력

EX3)

SELECT	E.EMP_NAME AS 직원,
		M.EMP_NAME AS 관리자
FROM	EMPLOYEE E
		JOIN EMPLOYEE M 
		ON E.MGR_ID = M.MGR_ID
ORDER BY 1;

EX4)

SELECT	E.EMP_NAME AS 직원,
		M.EMP_NAME AS 관리자,
		S.EMP_NAME AS 인원
FROM	EMPLOYEE E
		JOIN EMPLOYEE M ON (E.MGR_ID = M.EMP_ID)
		JOIN EMPLOYEE S ON (M.MGR_ID = S.EMP_ID)
ORDER BY 1;

JOIN의 JOIN 결과

EX5)

SELECT	E.EMP_NAME, J.JOB_TITLE, D.DEPT_NAME
FROM	EMPLOYEE E
		JOIN JOB J USING(JOB_ID)
		JOIN DEPARTMENT D USING(DEPT_ID)

EX6)

//5개 테이블 조인 후, 직급이 대리, 지역이 아시아인 사원 출력		
SELECT	E.EMP_NAME
		, J.JOB_TITLE
		, D.DEPT_NAME
		, S.SLEVEL
		, E.SALARY
		, L.LOC_DESCRIBE
		, C.COUNTRY_NAME
FROM	EMPLOYEE E
		JOIN JOB J USING(JOB_ID)
		JOIN DEPARTMENT D USING(DEPT_ID)
		JOIN LOCATION L ON D.LOC_ID = L.LOCATION_ID
		JOIN COUNTRY C USING(COUNTRY_ID)
		JOIN SAL_GRADE S ON (E.SALARY BETWEEN S.LOWEST AND S.HIGHEST)
WHERE	J.JOB_TITLE = '대리' 
		AND LOC_DESCRIBE LIKE '아시아%';

조인 결과

'프로그래밍 > SQL' 카테고리의 다른 글

[SQL] 8. Subquery  (0) 2020.01.22
[SQL] 7. SET Operator  (0) 2020.01.22
[SQL] 5. Additional SELECT(3)  (0) 2020.01.21
[SQL] 4. Additional SELECT(2)  (0) 2020.01.21
[SQL] 3. Additional SELECT  (0) 2020.01.20