오라클 조인

최주영·2023년 4월 5일
0

오라클

목록 보기
11/22

✅ JOIN

  • 두개이상의 테이블을 특정컬럼을 기준으로 연결해주는 기능
  • JOIN 의 종류 5가지
    -- 1. 카티션 곱 = 크로스조인 : 모든 행에 대해서 조인
    (공통되는 컬럼없이 조인조건이 없어서 모든 데이터가 조회)
    -- 2. 비동등 조인 : 테이블의 동일한 컬럼 없이 다른 조건으로 조인하는 방법
    -- 3. INNER JOIN (동등조인): 기준되는 값이 일치하는 ROW만 가져오는 JOIN
    -- 4. OUTER JOIN : 기준되는 값이 일치하지 않은 ROW도 가져오는 JOIN
    -- 5. 셀프조인 : 자기 자신의 테이블과 조인하는 방법
  • JOIN을 작성하는 방법 : 2가지
    -- 1. 오라클 조인방식 : ,와 WHERE로 작성
    -- 2. ANSI 표준 조인방식 : JOIN, ON || USING 예약어를 사용해서 작성

* 카티션 곱 = CROSS JOIN

  • 모든 ROW를 연결해주는 JOIN
    EX ) 두 개의 테이블의 ROW가 각각 24, 9개 가있으면 곱한 216개의 결과가 출력된다
SELECT EMP_NAME, DEPT_TITLE // cross join 예시
FROM EMPLOYEE CROSS JOIN DEPARTMENT
// 카티션 곱 예시
select count(*) from employees;  // 총 107개 행
select count(*) from dapartments; // 총 28개 행
select count(*) from employees, departments // 107*28 = 2996개 행

* 비동등 조인

SELECT * 
FROM employees E, jobs J
WHERE E.salary BETWEEN J.min_salary AND J.max_salary 
// employees 테이블과 jobs의 테이블은 동일한 컬럼으로 조인한 것이 아닌
// 서로 다른 컬럼으로 조인하고 있다  employees -> salary    jobs-> min_salary, max_salary

* INNER JOIN

// 오라클 방식으로 JOIN 하기
SELECT * 
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID; // DEPT_CODE와 DEPT_ID과 일치하는 것끼리 JOIN

// ANSI 표준으로 JOIN하기
// JOIN 예약어 뒤에는 JOIN할 테이블을 적고, 조건을 적어줌
SELECT *
FROM EMPLOYEE 
    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID; 
    

SELECT * 
FROM countries C, locations L
WHERE C.country_id = L.country_id;
// JOIN 문에서도 WHERE절 사용하기
// 부서가 총무부인 사원의 (사원명, 월급, 보너스, 부서명) 조회하기
SELECT EMP_NAME, SALARY, BONUS, DEPT_TITLE
FROM EMPLOYEE
	JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID  // 여기까지 실행하면 이미 합쳐졌기 때문에 WHERE 절에서 TITLE 사용가능
WHERE DEPT_TITLE = '총무부';


// JOIN문에서 GROUP BY절 사용하기
// 부서별 평균급여가 300만원 이상인것 출력하기 (부서명, 평균급여)
SELECT DEPT_TITLE, AVG(SALARY)
FROM EMPLOYEE 
    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
GROUP BY DEPT_TITLE
HAVING AVG(SALARY) >= 3000000;
// JOIN할 때 기준이되는 컬럼명이 [중복]된다면 반드시 별칭을 작성해야 한다
// 사원명, 급여, 보너스, 직책명을 조회하기
SELECT *
FROM EMPLOYEE E   // E와 J는 별칭
    JOIN JOB J ON E.JOB_CODE = J.JOB_CODE;
    
    
// 동일한 기준의 컬럼명으로 조인할 때는 USING 이용할 수 있다.
SELECT EMP_NAME, SALARY, BONUS, JOB_NAME
FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE);


// INNER 조인일때는 비교되는 컬럼이 null이면 비교대상 x
SELECT COUNT(*)
FROM EMPLOYEE
    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;  // 비교되는 컬럼이 null값인것 빼고 개수세줌

* OUTER JOIN

  • LEFT OUTER JOIN : JOIN을 기준으로 왼쪽에 있는 테이블을 기준으로 설정
  • RIGHT OUTER JOIN : JOIN을 기준으로 오른쪽에 있는 테이블을 기준으로 설정

즉 쉽게말해서 LEFT OUT JOIN은 왼쪽테이블의 모든 데이터가 출력이 되는것을 전제로 JOIN된 방식
모든 데이터가 출력된다는 의미 -> JOIN되는 테이블의 짝이 없어도 출력이된다는 의미!

NETFLIX (LEFT 테이블), NETFLIX_CAST(RIGHT)테이블 일 때 LEFT OUTER JOIN 할 경우
위와 같은 결과가 나온다.
-> 나의 아저씨, 시그널, 효리네 민박, 이태원 클라쓰는 짝이 있어서 CASE_MEMBER 값이 같이 나오지만
인터스텔라, 귀를 귀울이면, 연애의 참견은 짝이 없지만 모든 데이터가 출력되야 하기때문에
CASE_MEMBER 값은 NULL이 된 상태로 출력하게 된다!

SELECT *
FROM jobs J, job_history H
WHERE J.job_id = H.job_id(+); // jobs 테이블이 기준 (1 사진)

SELECT *
FROM jobs J, job_history H
WHERE J.job_id(+) = H.job_id; // job_history 테이블이 기준 (2 사진)
// job_history 테이블의 데이터는 job 테이블에 비해 데이터가 다 있지 않음
// 그래서 조인했을때 일치하지 않는것도 출력하려면 job_history 부분에 (+) 해줘야함
// 쉽게 말해서 데이터가 적은쪽에 (+)를 붙이면 null값까지 포함해서 출력된다

1사진
2사진


* SELF JOIN

SELECT E.first_name, E.last_name, M.first_name, M.last_name
FROM employees E, employees M // 동일한 employee 테이블에서 자체 조인
WHERE E.manager_id = M.employee_id; 

  • 다중 조인
    -> 3개이상의 테이블을 연결해서 사용
SELECT EMP_NAME, JOB_NAME, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
    JOIN JOB USING(JOB_CODE);
    // 위 결과는 EMPLOYEE, DEPARTMENT, JOB 테이블 3개가 조인된 결과가 나온다
    
  
// 사원의 사원명, 부서명, 직책명, 근무지역 조회하기
SELECT EMP_NAME, JOB_NAME,  DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE  // EMPLOYEE를 기준으로 밑에 JOIN할 테이블들과 각각 기준잡을 컬럼을 선택해야한다
    LEFT JOIN JOB USING(JOB_CODE)
    LEFT JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
    LEFT JOIN LOCATION ON LOCATION_ID = LOCAL_CODE;
    // 일치하지 않는 모든 사원들이 출력되기 위해서 LEFT JOIN으로 함
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글