데이터/SQL

SQL 초보 문법 가이드

glasslego 2025. 3. 6. 17:00

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