Data Analyst/SQL

SQL - 여러 테이블 JOIN, SQL JOIN 사용 시 유용한 팁, UNION, UNION ALL

hmm06 2024. 9. 3. 10:40

여러 테이블 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