1. 기본 SQL 문법
1.1 데이터 조회 (SELECT)
SELECT column1, column2
FROM table_name
WHERE column1 = 'value'
ORDER BY column2 DESC
LIMIT 10;
- SELECT → 특정 컬럼 조회
- WHERE → 조건 지정
- ORDER BY → 정렬 (기본 오름차순, DESC 사용 시 내림차순)
- LIMIT → 결과 개수 제한
1.2 중복 제거 (DISTINCT)
SELECT DISTINCT column1 FROM table_name;
- 특정 컬럼에서 중복된 데이터를 제거한 결과 조회
2. 집계 함수 (Aggregation Functions)
2.1 기본 집계 함수
SELECT COUNT(*) AS total_count, SUM(sales) AS total_sales,
AVG(sales) AS avg_sales, MIN(sales) AS min_sales, MAX(sales) AS max_sales
FROM sales_table;
- COUNT(*) → 행 개수 카운트
- SUM(column) → 값들의 합
- AVG(column) → 평균값
- MIN(column) / MAX(column) → 최소 / 최대값
3. 그룹화 및 필터링
3.1 GROUP BY
SELECT category, COUNT(*) AS product_count, SUM(price) AS total_revenue
FROM products
GROUP BY category
HAVING total_revenue > 10000
ORDER BY total_revenue DESC;
- GROUP BY → 같은 값을 가진 데이터를 그룹화
- HAVING → WHERE와 유사하지만 GROUP BY 집계 결과를 필터링
4. JOIN (테이블 조인)
4.1 INNER JOIN (교집합)
SELECT o.order_id, c.customer_name, o.order_total
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id;
- 두 테이블의 공통된 데이터만 반환
4.2 LEFT JOIN (왼쪽 테이블 전체 + 오른쪽 매칭 데이터)
SELECT c.customer_name, o.order_total
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
- LEFT JOIN을 사용하면 customers 테이블의 모든 데이터가 포함되며, orders 테이블에 없는 데이터는 NULL이 반환됨.
4.3 RIGHT JOIN (오른쪽 테이블 전체 + 왼쪽 매칭 데이터)
SELECT c.customer_name, o.order_total
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id;
- RIGHT JOIN을 사용하면 orders 테이블의 모든 데이터가 포함됨.
5. 윈도우 함수 (Window Functions)
5.1 RANK() 및 DENSE_RANK()
SELECT customer_id, order_total,
RANK() OVER (ORDER BY order_total DESC) AS rank,
DENSE_RANK() OVER (ORDER BY order_total DESC) AS dense_rank
FROM orders;
- RANK() → 같은 순위가 있을 경우 순위를 건너뜀 (ex. 1,1,3)
- DENSE_RANK() → 순위를 건너뛰지 않음 (ex. 1,1,2)
5.2 ROW_NUMBER()
SELECT customer_id, order_total,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_total DESC) AS row_num
FROM orders;
- ROW_NUMBER() → 각 그룹 내 행 번호 부여 (PARTITION BY를 사용하면 그룹별 번호 부여)
6. 서브쿼리 (Subqueries)
6.1 SELECT 안에서 서브쿼리 사용
SELECT customer_id, (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) AS order_count
FROM customers;
- 특정 고객의 주문 개수를 계산하여 고객 테이블에 추가
6.2 EXISTS 사용
SELECT customer_name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
- EXISTS를 사용하면 서브쿼리에서 해당 값이 존재할 경우만 조회
7. CASE 문 (조건문)
SELECT order_id, order_total,
CASE
WHEN order_total >= 1000 THEN 'High Value'
WHEN order_total BETWEEN 500 AND 999 THEN 'Medium Value'
ELSE 'Low Value'
END AS order_category
FROM orders;
- 조건에 따라 새로운 컬럼 값을 설정 가능
8. 데이터 변형 및 문자열 함수
8.1 문자열 변형
SELECT UPPER(name) AS upper_name, LOWER(name) AS lower_name, LENGTH(name) AS name_length
FROM users;
- UPPER() → 대문자 변환
- LOWER() → 소문자 변환
- LENGTH() → 문자열 길이 반환
8.2 CONCAT() 문자열 연결
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
- 여러 문자열을 결합하여 하나의 값으로 반환
9. 날짜 및 시간 함수
9.1 현재 날짜 및 시간
SELECT NOW(), CURDATE(), CURTIME();
- NOW() → 현재 날짜 및 시간 반환
- CURDATE() → 현재 날짜만 반환
- CURTIME() → 현재 시간만 반환
9.2 날짜 차이 계산
SELECT DATEDIFF(NOW(), '2023-01-01') AS days_since;
- DATEDIFF() → 두 날짜 사이의 차이 반환
9.3 날짜 더하기/빼기
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS one_week_later;
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month;
- DATE_ADD() → 특정 기간 추가
- DATE_SUB() → 특정 기간 감소
10. 트랜잭션 관리
10.1 트랜잭션 사용 (ROLLBACK & COMMIT)
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE user_id = 2;
COMMIT; -- 데이터 적용
- START TRANSACTION → 트랜잭션 시작
- COMMIT → 변경 사항 저장
- ROLLBACK → 변경 사항 취소
마무리
위의 SQL 문법과 함수들은 데이터 분석 및 애플리케이션 개발에서 필수적으로 활용되는 기능들입니다. 특히 JOIN, 윈도우 함수, 서브쿼리, 트랜잭션 처리 등의 개념은 실무에서 자주 사용됩니다.
'데이터 > SQL' 카테고리의 다른 글
[MySQL vs. Hive] 날짜 관련 SQL 함수 총정리 (0) | 2025.03.06 |
---|