SQL 1주차 요약
SELECT * → 모든 데이터 조회
FROM 테이블명
SELECT 컬럼1, 컬럼2 FROM 테이블명; → 일부 컬럼만 조회
컬럼 AS 별명 또는 컬럼 "별명" → 컬럼명에 별명 부여 가능
WHERE 컬럼 = 값 : 조건 필터링
예) age = 21, gender = 'female'
문자 비교 시 '작은따옴표' 사용
비교연산자: =, <>, >, >=, <, <=
BETWEEN A AND B : 범위 조건
IN (A, B, C) : 다중 값 조건
LIKE : 부분 문자열 검색 ('김%', '%Next%', '%임')
논리 연산자
AND : 그리고 (모든 조건 만족)
OR : 또는 (하나라도 만족)
NOT : 부정
에러 메시지 원인을 읽고 문제 해결
테이블/컬럼 이름 오류
작은 따옴표 누락 등
에러 메시지는 학습의 일부!
1주차 과제 예시
"상품 준비시간 20~30분이고, 한식점의 식당명과 고객번호 조회"
SQL 2주차 강의 요약
연산자: +, -, *, /
집계 함수:
SUM(컬럼) : 합계
AVG(컬럼) : 평균
COUNT(컬럼) 또는 COUNT(*) : 개수
MIN(컬럼) / MAX(컬럼) : 최소/최대값
COUNT(DISTINCT 컬럼) : 중복 제거 후 개수
SELECT COUNT(order_id)
FROM food_orders
WHERE price >= 30000
SELECT AVG(price)
FROM food_orders
WHERE cuisine_type = 'Korean'
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 컬럼 [DESC]
ORDER BY MAX(price) DESC
ORDER BY MAX(price)
2주차 과제 예시
"음식 종류별 최대/최소 주문 금액을 조회하고, 최소금액 기준 내림차순 정렬"
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(cuisine_type='Korean', '한식', '기타')
예: 연령 + 성별 기반 분류
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주차 과제 예시
배달 시간 지연 여부 판단
SQL 4주차 강의 요약
REPLACE, SUBSTRING, CONCAT → 문자열 포맷팅
IF, CASE WHEN → 조건별 처리
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
음식 타입 + 지역별 수수료율 계산
수량, 금액 조건에 따른 할인율 계산
여러 테이블을 공통 컬럼 기준으로 연결
LEFT JOIN: 기준 테이블은 모두 포함, 매칭 안 되는 값은 NULL
INNER JOIN: 양쪽에 모두 있는 값만 포함
고객 + 주문 데이터 결합
주문 + 결제 정보 결합 (수수료율 등)
연령 조건에 따라 할인 계산 등
식당별 평균 음식 주문 금액 & 고객 평균 연령 기준으로 그룹 분류
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로 시간별/성별/연령별 피벗 가능
MAX(IF(hh='15', cnt_order, 0)) AS "15"
날짜 형식 변경: DATE_FORMAT(date, '%Y-%m-%d')
연/월별 집계
DATE_FORMAT(date, '%Y') AS year,
DATE_FORMAT(date, '%m') AS month
음식 타입별 + 연령대별 주문건수 피벗
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;