SELECT - JOIN

Liberte Koo·2022년 12월 23일
0

Database

목록 보기
4/12

JOIN : 한 개 이상의 테이블에서 데이터를 조회하기 위해 사용한다. 수행결과는 하나의 RESULT SET으로 나오게 된다.

- 동작 순서
SELECT 6
FROM 1
JOIN 2
WHERE 3
GROUP BY 4
HAVING 5
ORDER BY 7

ORACLE 전용문법

SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

ANSI 표준구문

SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

둘 사이에 데이터를 연결해주는 컬럼을 찾는다

ORACLE 구문(두 테이블의 코드명이 겹치면 어느 것인지 오라클이 읽어오기 힘들므로 '테이블명.코드명'으로 테이블명을 명시해준다.

SELECT EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

ANSI 표준구문

SELECT EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);

ANSI 표준구문, 비교해야할 컬럼이름이 동일한 경우

SELECT EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
  • USING : 다른 테이블에 있지만 컬럼명이 같은 경우

INNER JOIN

(JOIN 조건에 일치하는 데이터만 출력)

DEPT_CODE가 NULL인 직원 2명은 조회결과 제외
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);

OUTER JOIN

(JOIN 조건에 일치하지 않더라도 JOIN 결과에 포함)

1) LEFT JOIN
JOIN문 기준으로 왼쪽에 있는 테이블은 조건에 일치하지 않더라도
JOIN 결과에 포함. 단, 데이터는 NULL로 출력
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);

2) RIGHT JOIN
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE RIGHT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
해외영업3(D7), 마케팅(D3), 국내영업(D4)
SELECT FROM DEPARTMENT;
SELECT
FROM EMPLOYEE WHERE DEPT_CODE IN ('D7', 'D3', 'D4');

3) FULL JOIN -> LEFT JOIN + RIGHT JOIN
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);

4) CROSS JOIN : 조인되는 테이블의 각 행들이 모두 매핑되는 데이터가 검색되는 조인. 쉽게말해 티셔츠 색깔, 사이즈 다 다르면 그 색깔에 따른 사이즈 다 보여주듯이 모든 경우수 보여줌
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT
ORDER BY 1;

5) SELF JOIN : 동일한 테이블을 JOIN
SELECT EMP.EMP_ID, EMP.EMP_NAME, EMP.MANAGER_ID, MAN.EMP_NAME
같은 테이블을 컬럼명이 다 겹치니까 소속을 다 적어줘야 한다. EMP.~ , MAN.~ 이렇게
FROM EMPLOYEE EMP
JOIN EMPLOYEE MAN ON(EMP.MANAGER_ID = MAN.EMP_ID);

SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);

/JOIN 실습/

1. 주민번호가 1970년대 생이면서 성별이 여자고, 성이 전씨인 직원들의 사원명, 주민번호, 부서명, 직급명을 조회하시오.

SELECT EMP_NAME 사원명, EMP_NO 주민번호, DEPT_TITLE 부서명, JOB_NAME 대리
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE)
WHERE EMP_NO LIKE '7__2__' AND EMP_NAME LIKE '전%';

2. 이름에 '형'자가 들어가는 직원들의 사번, 사원명, 부서명을 조회하시오.

SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE EMP_NAME LIKE '%형%';

3. 해외영업부에 근무하는 사원명, 직급명, 부서코드, 부서명을 조회하시오.

SELECT EMP_NAME 사원명, DEPT_CODE 직급명, DEPT_ID 부서코드, DEPT_TITLE 부서명
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE)
WHERE DEPT_TITLE LIKE '해외영업%';

4. 보너스포인트를 받는 직원들의 사원명, 보너스포인트, 부서명, 근무지역명을 조회하시오.

SELECT EMP_NAME, BONUS, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) --이 예제는 JOIN 순서 중요하다
LEFT JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE) -/EMPLOYEE와 LOCATION은 연관이 없으므로, 연관이 있는 EMPLOYEE - DEPARTMENT 우선 JOIN 시키고, 그 다음에 DEPARTMENT와 LOCATION을 JOIN 시킨다./
WHERE BONUS IS NOT NULL;

5. 부서코드가 D2인 직원들의 사원명, 직급명, 부서명, 근무지역명을 조회하시오.

SELECT EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
JOIN DEPARTMENT ON (DEPT_ID = DEPT_CODE)
JOIN LOCATION ON (LOCAL_CODE = LOCATION_ID)
WHERE DEPT_ID = 'D2';

6. 한국(KO)과 일본(JP)에 근무하는 직원들의 사원명, 부서명, 지역명, 국가명을 조회하시오.

SELECT EMP_NAME 사원명, DEPT_TITLE 부서명 , LOCAL_NAME 지역명, NATIONAL_NAME 국가명
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION L ON (LOCATION_ID = LOCAL_CODE)
JOIN NATIONAL USING(NATIONAL_CODE)
WHERE NATIONAL_NAME IN ('한국', '일본');

7. 같은 부서에 근무하는 직원들의 사원명, 부서명, 동료이름을 조회하시오. (self join 사용)

내정보가 들어있는 사원테이블은 E1
동료들의 정보가 들어가있는 사원테이블은 E2
같은 EMPLOYEE 테이블을 쓰지만 E1, E2로 구분해줌으로써 다른 테이블처럼 같은 테이블끼리 비교

SELECT E1.EMP_NAME 사원명, DEPT_TITLE, E2.EMP_NAME 동료이름
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON (E1.DEPT_CODE = E2.DEPT_CODE)
JOIN DEPARTMENT ON (E1.DEPT_CODE = DEPT_ID)
WHERE E1.EMP_NAME != E2.EMP_NAME
ORDER BY 1;

8. 보너스포인트가 없는 직원들 중에서 직급이 차장과 사원인 직원들의 사원명, 직급명, 급여를 조회하시오. 단 join과 in 사용할 것.

SELECT EMP_NAME 사원명, JOB_NAME 직급명, SALARY 급여
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME IN ('차장', '사원') AND BONUS IS NULL;

profile
A previous generalist who strives to become a genuine Specialist.

0개의 댓글