여러 테이블 JOIN
- SQL에서 두 개 이상의 테이블을 JOIN할 때는 테이블 간의 관계를 명확히 이해하는 것이 중요합니다.
- 여러 테이블을 JOIN하는 과정은 직관과 명확한 연결 방식이 필요합니다.
여러 테이블 JOIN의 단계
여러 테이블을 JOIN할 때는 단계적으로 접근하는 것이 좋습니다:
- 첫 번째 단계: 두 개의 테이블을 기본적으로 JOIN합니다.
- 두 번째 단계: 첫 번째 JOIN의 결과를 다른 테이블과 다시 JOIN합니다.
- 세 번째 단계 이후: 동일한 방식으로 추가적인 테이블을 계속 JOIN합니다.
이 과정에서 각 테이블의 공통 열을 기준으로 JOIN 조건을 설정해야 하며, JOIN 방식은 INNER JOIN, LEFT JOIN, RIGHT JOIN 등 상황에 맞게 선택할 수 있습니다.
/* 3개의 테이블(employees, dept_manager, departments)을 모두 JOIN시켜
해당 테이블에 있는 값들을 추출할 수 있다.
*/
SELECT
e.first_name,
e.last_name,
e.hire_date,
m.from_date,
d.dept_name
FROM
employees e
JOIN
dept_manager m ON e.emp_no = m.emp_no
JOIN
departments d ON m.dept_no = d.dept_no;
SQL JOIN 사용 시 유용한 팁
JOIN 시 중요한 열
- JOIN을 수행할 때 가장 중요한 것은 테이블 간의 연결을 위해 공통 열을 사용하는 것입니다.
- 이 열들은 외래 키나 기본 키가 될 수도 있지만, 꼭 그래야 하는 것은 아닙니다.
- 중요한 것은 연결하려는 두 테이블이 해당 열을 통해 의미 있는 관계를 맺고 있다는 점입니다
효율적인 쿼리 작성
- 가능하면 쿼리를 단순하고 효율적으로 작성해야 합니다.
- 복잡한 JOIN을 사용할 때는 항상 쿼리 성능을 염두에 두고, 불필요한 연산을 줄이기 위해 필요 없는 열이나 조건을 배제하는 것이 좋습니다.
/*
dept_name을 기준으로 그룹화 하고 그룹화 한 대상으로 salary 연봉을 구합니다.
구한 salary가 60000보다 높은 값들만 가져오도록 만들었습니다.(배제)
*/
SELECT
d.dept_name, AVG(salary) as average_salary
FROM
departments d
JOIN
dept_manager m ON d.dept_no = m.dept_no
JOIN
salaries s ON m.emp_no = s.emp_no
GROUP BY d.dept_name
having average_salary > 60000
order by average_salary DESC
;
UNION VS UNION ALL
- UNION과 UNION ALL은 여러 SELECT 문을 결합하여 하나의 결과 집합을 반환할 때 사용됩니다.
- 두 연산자는 기본적으로 비슷하지만, 중요한 차이점이 있어 상황에 따라 선택하여 사용해야 합니다.
UNION과 UNION ALL의 기본 개념 및 차이점
- UNION: 두 개 이상의 SELECT 문을 결합하고, 중복된 행을 제거하여 하나의 결과 집합을 반환합니다. 결과에 중복된 데이터가 있을 경우, 하나의 행만 표시됩니다.
- UNION ALL: 두 개 이상의 SELECT 문을 결합하며, 중복된 행을 제거하지 않고 모든 행을 반환합니다. 따라서 UNION보다 더 많은 행을 반환할 수 있으며, 성능 면에서 더 효율적일 수 있습니다
언제 사용해야 할까?
- UNION: 중복된 데이터가 중요하지 않거나, 중복된 데이터가 결과에 포함되지 않아야 하는 경우 사용합니다. 예를 들어, 특정 데이터의 고유 목록을 출력하고자 할 때 유용합니다.
- UNION ALL: 중복된 데이터를 포함하여 모든 데이터를 확인하고 싶거나, 성능이 중요한 상황에서 사용합니다. 예를 들어, 로그 데이터나 모든 거래 내역을 확인해야 하는 경우 적합합니다
/*
employees의 select 문과 dept_manager의 select문을 합치고 중복값 없이 출력하도록 만들었습니다.
별칭 a로 설정 후 해당 a.emp_no를 음수로 변환 후 내림차순으로 정렬하였습니다.
*/
SELECT
*
FROM
(SELECT
e.emp_no,
e.first_name,
e.last_name,
NULL AS dept_no,
NULL AS from_date
FROM
employees e
WHERE
last_name = 'Denis' UNION SELECT
NULL AS emp_no,
NULL AS first_name,
NULL AS last_name,
dm.dept_no,
dm.from_date
FROM
dept_manager dm) AS a
# emp_no를 음수로 변환 후 내림차순으로 정렬하는 것이며 양수 기준으로 본다면 오름차순으로 정렬하는 것과 같습니다.
ORDER BY - a.emp_no DESC;
이상입니다
728x90
'Data Analyst > SQL' 카테고리의 다른 글
SQL - SELF JOIN, VIEW (0) | 2024.09.10 |
---|---|
SQL - SubQuery (1) | 2024.09.09 |
SQL - RIGHT JOIN, SQL 조인 구문: 새로운 방식과 오래된 방식, CROSS JOIN (0) | 2024.09.02 |
SQL - INNER JOIN, DUPLICATED, LEFT JOIN (0) | 2024.08.31 |
SQL - DELETE, TRUNCATE, Aggregate functions(집계함수), IFNULL - COALESCE (0) | 2024.08.29 |