상세 컨텐츠

본문 제목

SQL - SubQuery, Self Join (feat. EXISTS)

Computer Science/데이터베이스

by Dohangang 2024. 7. 17. 12:30

본문

 

 

 

 

 

 

 

 

 

 

서브쿼리와 셀프 조인: SQL에서 데이터 활용하기

SQL은 강력한 데이터베이스 언어로, 복잡한 데이터를 효과적으로 처리하고 분석할 수 있는 다양한 기능을 제공합니다. 이 중에서도 서브쿼리와 셀프 조인은 데이터베이스 쿼리를 작성할 때 매우 유용한 기능입니다. 서브쿼리와 셀프 조인의 개념과 예제를 통해 학습에 도움이 되었으면 좋겠습니다.

 

 

 

 

 

 

 

 




 

 

 

 

 

 

 

● 서브쿼리 (SubQuery)

서브쿼리는 다른 쿼리의 결과를 이용하거나, 그 결과를 기반으로 새로운 쿼리를 실행하는 쿼리입니다. 서브쿼리는 괄호 () 안에 작성되며, 메인 쿼리에서 이를 참조하여 조건을 설정하거나 데이터를 필터링할 수 있습니다.

 

필자의 경우 서브쿼리를 테이블을 대신할 수 있는 용도로 많이 활용했었습니다. 원하는 데이터 구조를 상황에 따라 만들어야 한다면 서브쿼리를 사용해 보세요.

 

 

 

 

 

🤪 예제 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 오퍼레이터

EXISTS 오퍼레이터는 서브쿼리에서 행의 존재 여부를 테스트하는 데 사용됩니다. 주로 서브쿼리의 결과가 존재하는지 확인하는 데 사용됩니다. (NOT EXISTS도 가능, 행의 여부에 따라 참과 거짓으로 결괏값이 나올 수 있다)

SELECT column_name
FROM table_name
WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);

위 예제에서는 서브쿼리의 결과가 존재하는지 확인하여 조건을 만족하는 행만을 반환합니다.

 

 

 

 

 서브쿼리와 JOIN의 차이

서브쿼리를 사용한 쿼리와 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;

두 쿼리는 동일한 결과를 반환하지만, 상황에 따라 더 읽기 쉽고 이해하기 쉬운 방법을 선택할 수 있습니다.

 

 

 

 

 

 

 

 

● 셀프 조인 (Self-Join)

셀프 조인은 하나의 테이블을 두 번 참조하여 서로 다른 열을 비교하거나, 같은 테이블의 데이터를 서로 연결할 때 사용됩니다. 이는 같은 테이블의 두 복사본을 조인하는 것처럼 보일 수 있습니다.

같은 표를 사용하면서 셀프 조인을 사용한다면 표 이름을 위해서 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에서 데이터를 다룰 때 매우 유용한 도구입니다. 서브쿼리는 다른 쿼리의 결과를 기반으로 조건을 설정하거나 데이터를 필터링할 수 있으며, 셀프 조인은 같은 테이블의 데이터를 서로 연결하거나 비교할 때 사용됩니다. 이 두 기능을 잘 활용하면 더 복잡하고 다양한 데이터를 효과적으로 처리할 수 있습니다.

 

저는 첫 프로젝트를 진행했을 때, 가장 신세계를 보여준 개념이 서브쿼리였습니다. 학습하는 모두가 새로운 개념을 접했을 때, 그리고 학습한 내용을 성공적으로 적용했을 때 생기는 희열을 느끼셨으면 좋겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

관련글 더보기