"내일배움캠프-사전캠프" SQL 완강!

신주연·2025년 5월 1일
0

SQL 1주차 요약

*기초 SQL 문법

SELECT * → 모든 데이터 조회

FROM 테이블명

SELECT 컬럼1, 컬럼2 FROM 테이블명; → 일부 컬럼만 조회

컬럼 AS 별명 또는 컬럼 "별명" → 컬럼명에 별명 부여 가능

*데이터 필터링 (WHERE절)

WHERE 컬럼 = 값 : 조건 필터링

예) age = 21, gender = 'female'

문자 비교 시 '작은따옴표' 사용

*비교 및 특수 조건

비교연산자: =, <>, >, >=, <, <=

BETWEEN A AND B : 범위 조건

IN (A, B, C) : 다중 값 조건

LIKE : 부분 문자열 검색 ('김%', '%Next%', '%임')

  • 논리 연산자
    AND : 그리고 (모든 조건 만족)

    OR : 또는 (하나라도 만족)

    NOT : 부정

*에러 대처

  • 에러 메시지 원인을 읽고 문제 해결

  • 테이블/컬럼 이름 오류

  • 작은 따옴표 누락 등

에러 메시지는 학습의 일부!

1주차 과제 예시

"상품 준비시간 20~30분이고, 한식점의 식당명과 고객번호 조회"

  • SELECT restaurant_name, customer_id
    FROM food_orders
    WHERE food_preparation_time BETWEEN 20 AND 30
    AND cuisine_type = 'Korean';

SQL 2주차 강의 요약

➕ SQL 계산 및 집계 함수

  • 연산자: +, -, *, /

  • 집계 함수:

  • SUM(컬럼) : 합계

  • AVG(컬럼) : 평균

  • COUNT(컬럼) 또는 COUNT(*) : 개수

  • MIN(컬럼) / MAX(컬럼) : 최소/최대값

  • COUNT(DISTINCT 컬럼) : 중복 제거 후 개수

* 실습 예시

  1. 30,000원 이상 주문건 수

SELECT COUNT(order_id)
FROM food_orders
WHERE price >= 30000

  1. 한식 평균 음식 가격

SELECT AVG(price)
FROM food_orders
WHERE cuisine_type = 'Korean'

GROUP BY – 범주별 계산

  • 특정 컬럼 기준으로 그룹화하여 집계 수행

SELECT cuisine_type, SUM(price)
FROM food_orders
GROUP BY cuisine_type

  • 음식점별 최대 주문금액

SELECT restaurant_name, MAX(price)
FROM food_orders
GROUP BY restaurant_name

ORDER BY – 정렬

  • 정렬 기준 설정

ORDER BY 컬럼 [DESC]

  • EX) 가격 최대값 기준 내림차순

ORDER BY MAX(price) DESC

  • EX) 가격 최대값 기준 오름차순

ORDER BY MAX(price)

완성된 SQL 기본 구조

  • SELECT ...
    FROM ...
    WHERE ...
    GROUP BY ...
    ORDER BY ...

2주차 과제 예시

"음식 종류별 최대/최소 주문 금액을 조회하고, 최소금액 기준 내림차순 정렬"

  • SELECT cuisine_type,
    MIN(price) AS min_price,
    MAX(price) AS max_price
    FROM food_orders
    GROUP BY cuisine_type
    ORDER BY MIN(price) DESC

SQL 3주차 강의 요약

문자 가공 함수

  • REPLACE(컬럼, '기존값', '바꿀값'): 문자열 치환

  • SUBSTRING(컬럼, 시작위치, 길이): 일부 문자 추출

  • CONCAT(값1, 값2, ...): 문자열 결합

문자 + 집계 함수 실습

  • 서울 지역 음식점의 음식 종류별 평균 가격

SELECT SUBSTRING(addr, 1, 2), cuisine_type, AVG(price)
FROM food_orders
WHERE addr LIKE '%서울%'
GROUP BY 1, 2;

  • 이메일 도메인별 고객 수와 평균 나이

SELECT SUBSTRING(email, 10), COUNT(customer_id), AVG(age)
FROM customers
GROUP BY 1;

조건문 (IF, CASE)

  • IF(조건, 참일 때, 거짓일 때)

예: IF(cuisine_type='Korean', '한식', '기타')

  • CASE WHEN ... THEN ... ELSE ... END

예: 연령 + 성별 기반 분류

  • CASE
    WHEN age BETWEEN 10 AND 19 AND gender='male' THEN '10대 남자'
    ...
    END

조건별 수수료·할증 계산 예시

  • 서울 + 배달시간에 따라 수수료 계산

CASE
WHEN delivery_time > 25 AND delivery_time <= 30 THEN price 0.05 IF(addr LIKE '%서울%', 1.1, 1)

END

  • 평일/주말 + 음식 수량에 따라 할증 계산

IF(day_of_the_week='Weekday', 3000, 3500) * IF(quantity <= 3, 1, 1.2)

데이터 타입 오류 해결

  • 숫자 변환: CAST(... AS DECIMAL)

  • 문자 변환: CAST(... AS CHAR)

3주차 과제 예시

배달 시간 지연 여부 판단

  • SELECT order_id, restaurant_name, day_of_the_week, delivery_time,
    CASE
    WHEN day_of_the_week='Weekday' AND delivery_time>=25 THEN 'Late'
    WHEN day_of_the_week='Weekend' AND delivery_time>=30 THEN 'Late'
    ELSE 'On-time'
    END AS 지연여부
    FROM food_orders;

SQL 4주차 강의 요약

문자 변경/조건문 복습

  • REPLACE, SUBSTRING, CONCAT → 문자열 포맷팅

  • IF, CASE WHEN → 조건별 처리

🧮 Subquery (서브쿼리)

  • 쿼리 안에 쿼리를 넣어 복잡한 연산을 효율적으로 처리

SELECT order_id, restaurant_name, IF(over_time >= 0, over_time, 0) over_time
FROM (
SELECT order_id, restaurant_name, food_preparation_time - 25 over_time
FROM food_orders
) a

✅ 활용 예

  • 음식점 평균 단가로 수수료 구간별 부과
  • 배달시간에 따라 그룹 구분
  • 음식 타입 + 지역별 수수료율 계산

  • 수량, 금액 조건에 따른 할인율 계산

🔗 JOIN (조인)

여러 테이블을 공통 컬럼 기준으로 연결

  • 엑셀의 VLOOKUP 과 비슷한 개념

🔸 주요 JOIN 종류

  • LEFT JOIN: 기준 테이블은 모두 포함, 매칭 안 되는 값은 NULL

  • INNER JOIN: 양쪽에 모두 있는 값만 포함

✅ 활용 예

고객 + 주문 데이터 결합

주문 + 결제 정보 결합 (수수료율 등)

연령 조건에 따라 할인 계산 등

✅ 4주차 과제 예시

식당별 평균 음식 주문 금액 & 고객 평균 연령 기준으로 그룹 분류

SELECT restaurant_name,
CASE
WHEN price <= 5000 THEN 'price_group1'
WHEN price <= 10000 THEN 'price_group2'
WHEN price <= 30000 THEN 'price_group3'
ELSE 'price_group4'
END AS price_group,
CASE
WHEN age < 30 THEN 'age_group1'
WHEN age BETWEEN 31 AND 39 THEN 'age_group2'
WHEN age BETWEEN 40 AND 49 THEN 'age_group3'
ELSE 'age_group4'
END AS age_group
FROM (
SELECT a.restaurant_name, AVG(price) AS price, AVG(age) AS age
FROM food_orders a
INNER JOIN customers b ON a.customer_id = b.customer_id
GROUP BY 1
) t
ORDER BY 1;

SQL 5주차 강의 요약

값이 없거나 이상한 데이터 처리하기

  • 값이 없을 때 (NULL)

  • 제외: WHERE 컬럼 IS NOT NULL

  • 대체: COALESCE(컬럼, 기본값) 또는 IF(조건, 원래값, 대체값)

비정상 값 처리

  • 조건문으로 범위 지정

CASE WHEN age < 15 THEN 15
WHEN age > 80 THEN 80
ELSE age END
2. SQL로 Pivot Table 만들기
IF + GROUP BY로 시간별/성별/연령별 피벗 가능

  • EX) 시간대별 주문건수

MAX(IF(hh='15', cnt_order, 0)) AS "15"

Window Function (RANK, SUM)

  • RANK: 순위 매기기
  • RANK() OVER (PARTITION BY cuisine_type ORDER BY order_count DESC)
    SUM: 누적합 구하기
  • SUM(order_count) OVER (PARTITION BY cuisine_type ORDER BY order_count)

날짜 포맷 다루기

  • 날짜 형식 변경: DATE_FORMAT(date, '%Y-%m-%d')

  • 연/월별 집계

DATE_FORMAT(date, '%Y') AS year,
DATE_FORMAT(date, '%m') AS month

✅ 5주차 과제 예시

음식 타입별 + 연령대별 주문건수 피벗

SELECT cuisine_type,
MAX(IF(age=10, order_count, 0)) "10대",
MAX(IF(age=20, order_count, 0)) "20대",
MAX(IF(age=30, order_count, 0)) "30대",
MAX(IF(age=40, order_count, 0)) "40대",
MAX(IF(age=50, order_count, 0)) "50대"
FROM (
SELECT a.cuisine_type,
CASE
WHEN age BETWEEN 10 AND 19 THEN 10
WHEN age BETWEEN 20 AND 29 THEN 20
WHEN age BETWEEN 30 AND 39 THEN 30
WHEN age BETWEEN 40 AND 49 THEN 40
WHEN age BETWEEN 50 AND 59 THEN 50
END AS age,
COUNT(1) AS order_count
FROM food_orders a
INNER JOIN customers b ON a.customer_id = b.customer_id
WHERE age BETWEEN 10 AND 59
GROUP BY 1, 2
) t
GROUP BY 1;

0개의 댓글