INNER JOIN
- INNER JOIN은 두 테이블 간의 공통된 값을 가진 레코드만을 결합하여 결과로 반환합니다.
- 이 조인 방식에서는 두 테이블에 모두 존재하는 레코드만 결과에 포함되며, 어느 한 테이블에만 존재하는 값은 결과에 포함되지 않습니다
- 벤 다이어그램을 생각 하면 교집합과 같다 보시면 될 거 같습니다.
/*
dept_manager_dup와 departments_dup 에서의 dept_no가 설정된 관리자 데이터를 추출하는 쿼리입니다.
예를 들어 departments_dup에서 dept_no ='d002'가 없고 dept_manager_dup에는 있다면 해당 데이터는
추출하지 안습니다.
*/
SELECT
m.dept_no, m.emp_no, d.dept_name
FROM
dept_manager_dup m
INNER JOIN
departments_dup d ON m.dept_no = d.dept_no
ORDER BY m.dept_no;
SQL DUPLICATED
- 중복 레코드란 SQL 테이블에서 모든 컬럼의 값이 동일한 행들을 의미합니다.
- 중복 레코드는 일반적으로 데이터베이스에서 허용되지 않지만, 새로운 데이터나 관리되지 않은 데이터에서 발생할 수 있습니다.
- 이러한 중복 데이터를 처리하기 위해서는 특정 필드를 기준으로 그룹화(GROUP BY)하거나 고유한 레코드만을 반환하는 방법을 사용할 수 있습니다
# 중복 값 설정
insert into dept_manager_dup
values ('110228', 'd003', '1992-03-21', '9999-01-01');
# 중복 값 설정
insert into departments_dup
values('d009', 'Customer Service');
/*
GROUP BY를 하면 중복된 값들은 사라지며 고유값만 뽑아낼 수 있게 됩니다.
이를 활용해 중복을 제거하여 데이터를 추출합니다.
*/
SELECT
m.dept_no, m.emp_no, d.dept_name
FROM
dept_manager_dup m
JOIN
departments_dup d ON m.dept_no = d.dept_no
GROUP BY m.dept_no , m.emp_no , d.dept_name
ORDER BY m.dept_no;
LEFT JOIN
- LEFT JOIN은 왼쪽 테이블의 모든 레코드를 반환하며, 오른쪽 테이블과 일치하는 레코드가 있을 경우 해당 데이터를 결합합니다.
- 만약 오른쪽 테이블에 일치하는 값이 없다면, 해당 칼럼에는 NULL이 반환됩니다.
- 따라서 LEFT JOIN을 사용하면 왼쪽 테이블에 존재하지만 오른쪽 테이블에 없는 데이터를 식별(WHERE 활용)할 수 있습니다
/*
left join을 활용해 dept_no가 겹치는 레코드들과 manager_dup 테이블의 있는 남아 있는 값을
추출합니다.
*/
SELECT
m.dept_no, m.emp_no, d.dept_name
FROM
dept_manager_dup m
LEFT JOIN
departments_dup d ON m.dept_no = d.dept_no
where dept_name IS NULL
ORDER BY d.dept_no;
- 위의 코드를 설명 하자면, 왼쪽에만 있는 값들은 두 개의 테이블에서 dept_no가 겹치지 않는 값들입니다.
그래서. departments_dup 테이블에는 겹치는 dept_no값이 없다는 것을 의미하고 d.dept_name의 값 또한 없다는 것입니다. 그래서 NULL이 반환됩니다.
즉, dept_name이 NULL인 레코드는 왼쪽에만 있는 값으로 유추할 수 있고 where를 사용하면 해당 왼쪽의 차집합 부분을 추출할 수 있게 됩니다.