[금융권 SQL 실무] 2.서브쿼리(Subquery)
서브쿼리(Subquery) 란?
SQL 서브쿼리(Subquery)는 데이터베이스에서 하나의 SQL 쿼리문 안에 또 다른 SQL 쿼리문을 내장시켜서 데이터를 추출하는 방법입니다.
서브쿼리는 주로 다른 테이블에서 데이터를 가져와야 할 때, 복잡한 조건으로 필터링해야 할 때, 혹은 그룹화된 데이터를 다시 필터링해야 할 때 사용됩니다
서브쿼리의 종류
SQL 서브쿼리는 크게 두 가지 유형으로 나눌 수 있습니다.
1. 인라인(Inline) 서브쿼리
인라인 서브쿼리는 메인 쿼리의 SELECT, FROM 또는 WHERE 절 안에 있는 서브쿼리를 말합니다. 일반적으로 서브쿼리는 WHERE 절 안에 사용되며, 메인 쿼리의 WHERE 절에 있는 조건식과 서브쿼리의 결과를 비교하여 참인 레코드만 반환합니다.
예를 들어, 다음과 같이 WHERE 절에서 인라인 서브쿼리를 사용하여, sales 테이블에서 가장 많은 판매를 기록한 salesman_id를 찾을 수 있습니다.
SELECT *
FROM sales
WHERE salesman_id = (
SELECT salesman_id
FROM sales
GROUP BY salesman_id
ORDER BY COUNT(*) DESC
LIMIT 1
);
2. 중첩(Nested) 서브쿼리
중첩 서브쿼리는 서브쿼리 안에 또 다른 서브쿼리를 포함하는 것입니다. 이렇게 중첩된 서브쿼리는 메인 쿼리와 서브쿼리 사이의 데이터를 더 세부적으로 조작하고, 복잡한 데이터 추출을 가능하게 합니다.
예를 들어, 다음과 같이 중첩 서브쿼리를 사용하여, products 테이블에서 특정 카테고리(category)에 속한 상품 중에서 가격이 가장 비싼 상품의 이름을 찾을 수 있습니다.
SELECT name
FROM products
WHERE category = 'electronics'
AND price = (
SELECT MAX(price)
FROM (
SELECT *
FROM products
WHERE category = 'electronics'
) AS subquery
);
이와 같이 서브쿼리를 사용하면, 복잡한 데이터 추출이 가능해지며, 보다 정확하고 세부적인 질의를 수행할 수 있습니다.
서브쿼리 활용방법
서브쿼리는 SQL 문장 안에서 다른 SQL 문의 일부로 사용될 수 있기 때문에, 괄호로 둘러싸 주어야 합니다. 대부분의 경우 서브쿼리는 SELECT 문 안에서 사용됩니다.
예를 들어, products 테이블에서 가격이 가장 비싼 상품의 이름을 찾으려면 다음과 같이 서브쿼리를 사용할 수 있습니다.
SELECT name
FROM products
WHERE price = (
SELECT MAX(price)
FROM products
);
이 코드에서는, 서브쿼리를 사용하여 가장 높은 가격을 찾고, 이를 메인 쿼리에서 WHERE 절에 사용하여 가장 비싼 상품의 이름을 반환합니다. 이와 같이 서브쿼리를 사용하면 복잡한 조건으로 데이터를 필터링할 수 있으며, 보다 정교한 질의를 할 수 있습니다.
서브쿼리의 응용
1. IN 연산자
IN 연산자는 서브쿼리를 사용하여 특정한 값을 검색할 때 자주 사용됩니다. 예를 들어, 다음과 같이 IN 연산자를 사용하여 customers 테이블에서 독일(Germany)에 거주하는 고객의 주문(order)을 검색할 수 있습니다.
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE country = 'Germany'
);
2. EXISTS 연산자
EXISTS 연산자는 서브쿼리의 결과가 참인지 거짓인지만 판별하며, 서브쿼리의 결과가 참이면 메인 쿼리에서 조건식이 참이 되고, 거짓이면 조건식이 거짓이 됩니다. 예를 들어, 다음과 같이 EXISTS 연산자를 사용하여 orders 테이블에서 주문이 있는 고객(customer)을 검색할 수 있습니다.
SELECT *
FROM customers
WHERE EXISTS (
SELECT *
FROM orders
WHERE orders.customer_id = customers.customer_id
);
3. 스칼라 서브쿼리
스칼라 서브쿼리는 단일 값(스칼라 값)을 반환하는 서브쿼리를 말합니다. 예를 들어, 다음과 같이 스칼라 서브쿼리를 사용하여 orders 테이블에서 주문 수(order count)가 가장 많은 고객의 이름(name)과 주문 수(order count)를 검색할 수 있습니다.
SELECT name, (
SELECT COUNT(*)
FROM orders
WHERE orders.customer_id = customers.customer_id
) AS order_count
FROM customers
ORDER BY order_count DESC;
4. 서브쿼리와 조인
서브쿼리와 조인을 결합하여 더욱 복잡한 데이터 추출도 가능합니다. 예를 들어, 다음과 같이 서브쿼리와 조인을 사용하여 products 테이블에서 가격이 가장 비싼 상품의 이름(name)과 카테고리(category)를 검색할 수 있습니다.
SELECT products.name, products.category
FROM products
JOIN (
SELECT MAX(price) AS max_price
FROM products
) AS subquery
ON products.price = subquery.max_price;
이와 같이 SQL 서브쿼리를 적극적으로 활용하면, 보다 정확하고 세부적인 질의를 수행할 수 있습니다.
업무연계성
실제 업무에서 SQL 서브쿼리를 정말 많이 사용하는 것 같습니다.
제 경우 많은 고객 데이터를 접할 수 있기에 SQL을 통한 데이터 전처리가 필수적 입니다 (그냥 전체 테이블 데이터 다 내려받으면 컴퓨터 안돌아가요~~).
그래서 제가 추출(분석)하고자 하는 모수에 대해 특정짓는 부분에 대해 서브쿼리를 많이 사용하는 것 같습니다.
저도 이론은 부족하여, 정리하다 보니 조금 더 명료해지는 것 같습니다.
'데이터분석 > SQL' 카테고리의 다른 글
[금융권 SQL 실무] JOIN 함수 (22) | 2023.05.09 |
---|---|
[금융권 SQL 실무] 금융권 SQL 활용 (13) | 2023.05.08 |
[금융권 SQL 실무] Case When 절 (13) | 2023.05.02 |
[금융권 SQL 실무] WHERE 절 (9) | 2023.04.28 |
[금융권 SQL 실무] with 절 (13) | 2023.04.25 |
댓글