SQL은 강력한 데이터베이스 언어로, 복잡한 데이터를 효과적으로 처리하고 분석할 수 있는 다양한 기능을 제공합니다. 이 중에서도 서브쿼리와 셀프 조인은 데이터베이스 쿼리를 작성할 때 매우 유용한 기능입니다. 서브쿼리와 셀프 조인의 개념과 예제를 통해 학습에 도움이 되었으면 좋겠습니다.
서브쿼리는 다른 쿼리의 결과를 이용하거나, 그 결과를 기반으로 새로운 쿼리를 실행하는 쿼리입니다. 서브쿼리는 괄호 () 안에 작성되며, 메인 쿼리에서 이를 참조하여 조건을 설정하거나 데이터를 필터링할 수 있습니다.
필자의 경우 서브쿼리를 테이블을 대신할 수 있는 용도로 많이 활용했었습니다. 원하는 데이터 구조를 상황에 따라 만들어야 한다면 서브쿼리를 사용해 보세요.
🤪 예제 1: 평균 성적보다 높은 학생 찾기
SELECT student, grade
FROM test_scores
WHERE grade > (SELECT AVG(grade) FROM test_scores);
위 예제에서는 test_scores 테이블에서 학생들의 평균 성적보다 높은 성적을 가진 학생들을 조회합니다. 괄호 안의 서브쿼리가 먼저 실행되어 평균 성적을 계산하고, 메인 쿼리는 이 값을 이용해 필터링을 수행합니다.
🤪 예제 2: 특정 테이블의 데이터를 기반으로 필터링
SELECT student, grade
FROM test_scores
WHERE student IN (SELECT student FROM honor_roll_table);
이 예제에서는 honor_roll_table에 있는 학생들의 데이터를 test_scores에서 조회합니다. IN 키워드를 사용하여 서브쿼리의 결과에 해당하는 학생들만 필터링합니다.
EXISTS 오퍼레이터는 서브쿼리에서 행의 존재 여부를 테스트하는 데 사용됩니다. 주로 서브쿼리의 결과가 존재하는지 확인하는 데 사용됩니다. (NOT EXISTS도 가능, 행의 여부에 따라 참과 거짓으로 결괏값이 나올 수 있다)
SELECT column_name
FROM table_name
WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
위 예제에서는 서브쿼리의 결과가 존재하는지 확인하여 조건을 만족하는 행만을 반환합니다.
서브쿼리를 사용한 쿼리와 JOIN을 사용한 쿼리는 비슷한 결과를 얻을 수 있지만, 상황에 따라 더 적합한 방법을 선택할 수 있습니다.
-- 서브쿼리를 사용한 예제
SELECT first_name, last_name
FROM customer AS c
WHERE EXISTS (SELECT * FROM payment AS p WHERE p.customer_id = c.customer_id AND amount > 11);
-- JOIN을 사용한 예제
SELECT first_name, last_name
FROM customer
INNER JOIN payment ON customer.customer_id = payment.customer_id
WHERE payment.amount > 11;
두 쿼리는 동일한 결과를 반환하지만, 상황에 따라 더 읽기 쉽고 이해하기 쉬운 방법을 선택할 수 있습니다.
셀프 조인은 하나의 테이블을 두 번 참조하여 서로 다른 열을 비교하거나, 같은 테이블의 데이터를 서로 연결할 때 사용됩니다. 이는 같은 테이블의 두 복사본을 조인하는 것처럼 보일 수 있습니다.
같은 표를 사용하면서 셀프 조인을 사용한다면 표 이름을 위해서 alias를 사용합니다.
🤪 예제 1: 같은 테이블의 열 비교
SELECT tableA.col, tableB.col
FROM table AS tableA
JOIN table AS tableB ON tableA.some_col = tableB.other_col;
위 예제에서는 같은 테이블의 두열을 비교하여 조건을 만족하는 행을 조회합니다. tableA와 tableB는 같은 테이블의 별칭이다.
🤪 예제 2: 직원과 보고서 관계
SELECT emp.name, report.name AS rep
FROM employees AS emp
JOIN employees AS report ON emp.emp_id = report.report_id;
이 예제에서는 employees 테이블에서 직원과 그들의 보고서를 조회합니다. emp와 report는 같은 employees 테이블의 별칭
🤪 예제 3: 같은 길이의 영화 찾기
SELECT f1.title, f2.title, f1.length
FROM film AS f1
INNER JOIN film AS f2 ON f1.film_id != f2.film_id AND f1.length = f2.length;
이 예제에서는 film 테이블에서 길이가 같은 다른 영화를 조회합니다. f1과 f2는 같은 film 테이블의 별칭
서브쿼리와 셀프 조인은 SQL에서 데이터를 다룰 때 매우 유용한 도구입니다. 서브쿼리는 다른 쿼리의 결과를 기반으로 조건을 설정하거나 데이터를 필터링할 수 있으며, 셀프 조인은 같은 테이블의 데이터를 서로 연결하거나 비교할 때 사용됩니다. 이 두 기능을 잘 활용하면 더 복잡하고 다양한 데이터를 효과적으로 처리할 수 있습니다.
저는 첫 프로젝트를 진행했을 때, 가장 신세계를 보여준 개념이 서브쿼리였습니다. 학습하는 모두가 새로운 개념을 접했을 때, 그리고 학습한 내용을 성공적으로 적용했을 때 생기는 희열을 느끼셨으면 좋겠습니다.
| SQL - TIMESTAMP, EXTRACT, 수학 함수, 문자열 함수 etc (0) | 2024.04.17 |
|---|---|
| SQL - JOINS (+ AS, UNION) (0) | 2024.04.08 |
| SQL - GROUP BY 문 (+ AGG, HAVING) (0) | 2024.04.05 |
| SQL - 구문 기초 (0) | 2024.04.04 |
| 정규화 과정 살펴보기(제1 정규형, 제2 정규형, 제3 정규형, 보이스/코드) (0) | 2023.06.13 |