SQL

[SQL] SQL 고급 기능 완전 정복 - UNION부터 CASE문까지

프론트 개발자 김현중 2025. 1. 9. 06:58
728x90

SQL의 진정한 힘은 데이터를 다양한 방식으로 조합하고 변형할 수 있는 고급 기능들에 있다고 생각한다.

이번 글에서는 UNION, GROUP BY 등의 고급 기능들을 정리하고자 한다.


UNION으로 결과 합치기

UNION은 여러 SELECT 문의 결과를 하나로 결합할 때 사용되고, 중복된 행은 자동으로 제거된다.

-- 모든 고객과 직원의 이메일 목록 생성
SELECT email FROM customers
UNION
SELECT email FROM employees;

-- 중복 포함하려면 UNION ALL 사용
SELECT email FROM customers
UNION ALL
SELECT email FROM employees;

GROUP BY로 데이터 그룹화하기

데이터를 특정 열을 기준으로 그룹화하고 집계 함수를 적용할 수 있다.

-- 부서별 평균 급여와 직원 수 계산
SELECT 
    department,
    COUNT(*) as employee_count,
    AVG(salary) as avg_salary,
    MAX(salary) as max_salary
FROM employees
GROUP BY department;

HAVING으로 그룹 필터링

GROUP BY의 결과를 필터링할 때는 WHERE 대신 HAVING을 사용한다.

SELECT 
    category,
    COUNT(*) as product_count,
    AVG(price) as avg_price
FROM products
GROUP BY category
HAVING COUNT(*) > 10 AND AVG(price) > 1000;

EXISTS로 서브쿼리 조건 확인

특정 조건을 만족하는 데이터가 존재하는지 확인할 때 사용한다.

-- 주문이 있는 고객만 선택
SELECT * FROM customers c
WHERE EXISTS (
    SELECT 1 FROM orders o
    WHERE o.customer_id = c.id
);

ANY와 ALL 연산자

서브쿼리의 결과와 비교할 때 사용한다.

-- 어떤 부서의 평균 급여보다 높은 급여를 받는 직원
SELECT * FROM employees
WHERE salary > ANY (
    SELECT AVG(salary)
    FROM employees
    GROUP BY department
);

INSERT SELECT로 데이터 복사하기

SELECT 문의 결과를 다른 테이블에 삽입할 수 있다.

INSERT INTO premium_customers
SELECT *
FROM customers
WHERE yearly_purchase > 1000000;

CASE문으로 조건부 값 반환

조건에 따라 다른 값을 반환할 때 사용한다.

SELECT 
    product_name,
    price,
    CASE 
        WHEN price < 1000 THEN 'Budget'
        WHEN price < 5000 THEN 'Mid-range'
        ELSE 'Premium'
    END as price_category
FROM products;

NULL 함수 활용하기

NULL 값을 다루는 다양한 함수들이 있다.

-- IFNULL: NULL을 다른 값으로 대체
SELECT 
    name,
    IFNULL(phone, 'No Phone') as contact

-- COALESCE: 여러 값 중 첫 번째 non-NULL 값 반환
SELECT 
    COALESCE(mobile, phone, email, 'No Contact')
FROM customers;

주석 사용하기

코드의 가독성과 유지보수를 위해 주석을 적절히 활용한다.

-- 단일 행 주석
SELECT * FROM orders;

/* 여러 줄 
주석 작성 가능 */

 


연산자 활용하기

다양한 연산자를 사용하여 데이터를 조작할 수 있다.

-- 산술 연산자
SELECT 
    product_name,
    price,
    quantity,
    price * quantity as total

-- 비교 연산자
SELECT * FROM products
WHERE price <= 1000;

-- 논리 연산자
SELECT * FROM orders
WHERE status = 'pending'
AND order_date >= '2024-01-01';

 

728x90