241122 TIL - SQL CROSS JOIN

J_log·2024년 11월 22일
0

1. CROSS JOIN 이란 ?

CROSS JOIN은 두테이블의 모든 행을 조합하여 데카르트 곱을 생성하는 JOIN 방식이다.
즉, 첫 번째 테이블의 모든 행과 두 번째 테이블의 모든 행을 서로 결합하여 결과를 반환 !

CROSS JOIN의 특징

  • 두 테이블 간 관계를 정의하는 조건이 없다.
  • 결과는 행의 개수 = 테이블1의 행 개수 x 테이블2의 행 개수가 된다.
  • 실무에서는 드물게 사용되며, 잘못 사용하면 결과가 너무 커질 수 있으니 주의가 필요하다.

2. CROSS JOIN 문법

문법은 간단하다.

SELECT *
FROM 테이블1
CROSS JOIN 테이블2;
SELECT *
FROM 테이블1, 테이블2;

두 방식 모두 동일하게 작동한다. 하지만 CROSS JOIN을 명시적으로 사용하는 것이 직관적이라고 생각한다.

CROSS JOIN을 이용해 풀었던 문제

https://leetcode.com/problems/students-and-examinations/description/

학생 리스트가 있고 과목마다 시험을 본 횟수를 출력해줘야 하는 문제이다. 시험을 한번도 치지 않은 학생도 표시가 되도록 구현해야 한다.

  • 첫 시도
SELECT s.student_id, s.student_name, e.subject_name, COUNT(e.subject_name) AS attended_exams
FROM Students s
LEFT JOIN Examinations e ON s.student_id = e.student_id
GROUP BY s.student_id, s.student_name, e.subject_name
ORDER BY s.student_id, e.subject_name;
  • 정답
SELECT s.student_id, s.student_name, sub.subject_name, COUNT(e.subject_name) AS attended_exams
FROM Students s
CROSS JOIN Subjects sub
LEFT JOIN Examinations e ON s.student_id = e.student_id AND sub.subject_name = e.subject_name
GROUP BY s.student_id, s.student_name, sub.subject_name
ORDER BY s.student_id, sub.subject_name;
  • 정답 쿼리는 Students와 Subjects 테이블 간에 CROSS JOIN을 사용하여 학생과 과목의 모든 조합을 만든다. 반면 처음 시도했던 쿼리는 LEFT JOIN을 사용하여 Students와 Examinations만 결합하고, 실제 시험을 본 학생들만 포함된다.

JOIN 종류 별로 간단 정리

JOIN 종류설명
INNER JOIN두 테이블 간 조건에 맞는 행만 반환.
LEFT JOIN왼쪽 테이블의 모든 행과 조건에 맞는 오른쪽 테이블의 행 반환. 오른쪽 테이블에 일치하는 행이 없으면 NULL 반환.
RIGHT JOIN오른쪽 테이블의 모든 행과 조건에 맞는 왼쪽 테이블의 행 반환. 왼쪽 테이블에 일치하는 행이 없으면 NULL 반환.
FULL OUTER JOIN두 테이블의 모든 행과 조건에 맞는 행을 반환. 한쪽 테이블에 일치하는 행이 없으면 NULL 반환.
CROSS JOIN조건 없이 두 테이블의 모든 행을 조합하여 반환 (데카르트 곱).

0개의 댓글