-- OUTER JOIN 실습환경 세팅
INSERT INTO tb_dept VALUES ('100014', '4차산업혁명팀', '999999');
INSERT INTO tb_dept VALUES ('100015', '포스트코로나팀', '999999');
COMMIT;
SELECT * FROM tb_dept;
ALTER TABLE tb_emp DROP CONSTRAINT fk_tb_emp01;
INSERT INTO tb_emp (emp_no, emp_nm, birth_de, sex_cd, addr, tel_no, direct_manager_emp_no,
final_edu_se_cd, sal_trans_bank_cd, sal_trans_accnt_no, dept_cd, lunar_yn)
VALUES ('1000000041', '이순신', '19811201', '1', '경기도 용인시 수지구 죽전1동 435', '010-5656-7878',
NULL, '006', '003', '114-554-223433', '000000', 'N');
INSERT INTO tb_emp (emp_no, emp_nm, birth_de, sex_cd, addr, tel_no, direct_manager_emp_no,
final_edu_se_cd, sal_trans_bank_cd, sal_trans_accnt_no, dept_cd, lunar_yn)
VALUES ('1000000042', '정약용', '19820402', '1', '경기도 고양시 덕양구 화정동 231', '010-4054-6547',
NULL, '004', '001', '110-223-553453', '000000', 'Y');
INSERT INTO tb_emp (emp_no, emp_nm, birth_de, sex_cd, addr, tel_no, direct_manager_emp_no,
final_edu_se_cd, sal_trans_bank_cd, sal_trans_accnt_no, dept_cd, lunar_yn)
VALUES ('1000000043', '박지원', '19850611', '1', '경기도 수원시 팔달구 매탄동 553', '010-1254-1116',
NULL, '004', '001', '100-233-664234', '000000', 'N');
INSERT INTO tb_emp (emp_no, emp_nm, birth_de, sex_cd, addr, tel_no, direct_manager_emp_no,
final_edu_se_cd, sal_trans_bank_cd, sal_trans_accnt_no, dept_cd, lunar_yn)
VALUES ('1000000044', '장보고', '19870102', '1', '경기도 성남시 분당구 정자동 776', '010-1215-8784',
NULL, '004', '002', '180-345-556634', '000000', 'Y');
INSERT INTO tb_emp (emp_no, emp_nm, birth_de, sex_cd, addr, tel_no, direct_manager_emp_no,
final_edu_se_cd, sal_trans_bank_cd, sal_trans_accnt_no, dept_cd, lunar_yn)
VALUES ('1000000045', '김종서', '19880824', '1', '경기도 고양시 일산서구 백석동 474', '010-3687-1245',
NULL, '004', '002', '325-344-45345', '000000', 'Y');
COMMIT;
SELECT * FROM tb_emp ORDER BY emp_no DESC;
SELECT emp_no, emp_nm, dept_cd FROM tb_emp ORDER BY emp_no DESC;
SELECT * FROM tb_dept;
-- # OUTER JOIN
-- 1. 조인 조건을 만족하지 않는 행들도 조회할 때 사용하는 조인기법입니다.
-- 2. OUTER조인 연산자 기호는 (+)기호입니다.
-- 3. INNER조인은 조인 조건을 만족하지 않으면 해당 행을 조회하지 않습니다
-- 그러나 OUTER JOIN은 방향(LEFT, RIGHT, FULL)에 맞게 조건에 매칭되지
-- 않는 행들도 모두 NULL로 처리해서 조회합니다.
-- # LEFT OUTER JOIN
-- 조인되는 왼쪽 테이블은 모두 조회하고, 오른쪽 테이블은 조인조건에 매칭된 것만 조회합니다.
-- 나는 사원정보는 일단 다 보고 싶은데 혹시 부서테이블에서 부서코드가 매칭되면
-- 보너스로 부서이름도 찍어줘라
SELECT COUNT(emp_no) FROM tb_emp; -- 46명의 사원이 등록 되어 있음.
SELECT
emp_no, emp_nm, dept_cd
FROM tb_emp
ORDER BY emp_no
; -- 아래 조인 조회에서 5명이 걸러진 이유는..?
-- TB_dept 테이블에 00000 부서번호는 없기 때문에 매칭이 되지 않았다.
-- ANSI 표준 LEFT OUTER JOIN / OUTER 생략 가능
SELECT
a.emp_no, a.emp_nm, a.dept_cd , B.dept_nm
FROM tb_emp A
LEFT OUTER JOIN tb_dept B --46명 나오게 하기!
ON A.dept_cd = B.dept_cd
ORDER BY A.emp_no
; -- 41명만 나옴. 부서번호에 없는 사원들이 5명이 있어서 걸러짐.
SELECT
*
FROM tb_emp A
LEFT OUTER JOIN tb_dept B --46명 나오게 하기!
ON A.dept_cd = B.dept_cd
ORDER BY A.emp_no
;
-- Oracle join
SELECT
a.emp_no, a.emp_nm, a.dept_cd , B.dept_nm
FROM tb_emp A, tb_dept B
WHERE A.dept_cd = B.dept_cd
ORDER BY A.emp_no
;
-- Oracle LEFT join
SELECT
a.emp_no, a.emp_nm, a.dept_cd , B.dept_nm
FROM tb_emp A, tb_dept B
WHERE A.dept_cd = B.dept_cd (+) -- LEFT JOIN / 오른쪽 컬럼쪽에 ( + )
ORDER BY A.emp_no
;
-- # RIGHT OUTER JOIN
-- 조인되는 오른쪽 테이블은 모두 조회하고, 왼쪽 테이블은 조건에 매칭된것만 조회
-- 나는 모든 부서정보를 조회하고 싶은데 혹시 부서코드가 일치하는 사원이 있으면 함께 조회해줘
SELECT
a.emp_no, a.emp_nm, B.dept_cd , B.dept_nm
FROM tb_emp A -- 왼쪽
RIGHT OUTER JOIN tb_dept B -- 오른쪽
ON A.dept_cd = B.dept_cd
ORDER BY A.emp_no
; -- 43건?
SELECT
*
FROM tb_emp A -- 왼쪽
RIGHT OUTER JOIN tb_dept B -- 오른쪽
ON A.dept_cd = B.dept_cd
ORDER BY A.emp_no
; -- 43건?
-- Oracle RIGHT join
-- Oracle LEFT join
SELECT
a.emp_no, a.emp_nm, a.dept_cd , B.dept_nm
FROM tb_emp A, tb_dept B
WHERE A.dept_cd (+) = B.dept_cd -- RIGHT JOIN / 왼쪽 컬럼쪽에 ( + )
ORDER BY A.emp_no
;
-- # FULL OUTER JOIN
-- - 왼쪽 조인테이블, 오른쪽 조인테이블을 모두 보여주고 매칭되면 매칭데이터까지 합쳐서 보여줌.
SELECT
a.emp_no, a.emp_nm, B.dept_cd , B.dept_nm
FROM tb_emp A -- 왼쪽
FULL OUTER JOIN tb_dept B -- 오른쪽
ON A.dept_cd = B.dept_cd
ORDER BY A.emp_no
;
-- 48행 : 41행은 매칭된 데이터
-- / 5행은 부서코드가 매칭안된 사원 5명 / 2행은 부서쪽에서 사원이랑 매칭이 안된 부서 2개
'데이터베이스' 카테고리의 다른 글
데이터베이스_SQL기본(계층형 쿼리)_교안_ 22.06.27(day06) (0) | 2022.06.27 |
---|---|
데이터베이스_SQL기본(집합연산자)_ 22.06.27(day06) (0) | 2022.06.27 |
데이터베이스_SQL기본(JOIN)_예제2_ 22.06.24(day05) (0) | 2022.06.24 |
데이터베이스_SQL기본(JOIN)_예제_ 22.06.24(day05) (0) | 2022.06.24 |
데이터베이스_SQL기본(JOIN)_교안_ 22.06.24(day05) (0) | 2022.06.24 |