내일배움캠프 사전캠프 온라인강의 SQL 3주차, 4주차
🚀 공부한 내용
문자 데이터 가공 (REPLACE, SUBSTRING, CONCAT)
- REPLACE
1 2 3 4
SELECT restaurant_name AS "원래 상점명", REPLACE(restaurant_name, 'Blue', 'Pink') AS "바뀐 상점명" FROM food_orders WHERE restaurant_name LIKE '%Blue Ribbon%';
- SUBSTRING
1 2 3 4
SELECT addr AS "원래 주소", SUBSTRING(addr, 1, 2) AS "시도" FROM food_orders WHERE addr LIKE '%서울특별시%';
‘SUBSTR’ 로 줄여쓸 수 있다.
- CONCAT
1 2 3 4 5 6
SELECT restaurant_name AS "원래 이름", addr AS "원래 주소", CONCAT(restaurant_name, '-', cuisine_type) AS "음식타입별 음식점", CONCAT('[', SUBSTRING(addr, 1, 2), '] ', restaurant_name) AS "바뀐 이름" FROM food_orders WHERE addr LIKE '%서울%'
문자 데이터 가공 후 GROUP BY
1
2
3
4
5
6
SELECT SUBSTR(addr, 1, 2) AS "지역",
cuisine_type,
AVG(price) AS "평균 금액"
FROM food_orders
WHERE addr LIKE '%서울%'
GROUP BY 1, 2
1
2
3
4
5
SELECT SUBSTR(email, 10) AS "도메인",
COUNT(*) AS "고객 수",
AVG(age) AS "평균 연령"
FROM customers
GROUP BY 1;
IF, CASE
- IF
1 2 3 4
SELECT addr AS "원래 주소", IF (addr LIKE '%평택군%', REPLACE(addr, '문곡리', '문가리'), addr) AS "바뀐 주소" FROM food_orders WHERE addr LIKE '%문곡리%';
1 2 3 4 5
SELECT SUBSTRING(IF(email LIKE '%gmail%', REPLACE(email, 'gmail', '@gmail'), email), 10) AS "이메일 도메인", COUNT(customer_id) AS "고객 수", AVG(age) AS "평균 연령" FROM customers GROUP BY 1;
- CASE
1 2 3 4 5 6 7 8 9 10
SELECT CASE WHEN delivery_time > 30 THEN price * 0.1 * IF(addr LIKE '%서울%', 1.1, 1) WHEN delivery_time > 25 THEN price * 0.5 * IF(addr LIKE '%서울%', 1.1, 1) else 0 END "수수료", restaurant_name, order_id, price, delivery_time, addr FROM food_orders;
CASE문 안에 IF문도 사용이 가능하다.
데이터타입 관련 에러가 났을 때 (CAST)
- 숫자로 변경
1
CAST(IF(rating = 'Not given', '1', rating) AS DECIMAL)
- 문자로 변경
1
CONCAT(restaurant_name, '-', CAST(order_id AS CHAR))
SUBQUERY
1
2
3
4
5
6
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 (LEFT JOIN, INNER JOIN)
- LEFT JOIN
1 2
SELECT * FROM food_orders LEFT JOIN payments ON food_orders.order_id = payments.order_id
1 2
SELECT * FROM food_orders f LEFT JOIN payments p ON f.order_id = p.order_id
payments 테이블에 값이 없더라도 다 가져온다.
- INNER JOIN
1 2
SELECT * FROM food_orders INNER JOIN payments ON food_orders.order_id = payments.order_id
두 테이블에 값이 있는 것만 가져온다.
🚀 회고
실무에서 정말 많이 썼던 문법들인데
까먹지 않도록 공부를 게을리하지 않아야겠다.