✅ JOIN
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
// 오라클 방식으로 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값인것 빼고 개수세줌
즉 쉽게말해서 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사진
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;
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으로 함