3주차 2강 내용 정리
REPLACE (바꿀 컬럼, 현재 값, 바꿀 값)
- 문자열 안에서 특정 문자를 다른 문자로 바꾸는 함수입니다.
select restaurant_name '원래 상점명',
replace (restaurant_name, 'Blue', 'Pink') '바뀐 상점명'
from food_orders
where restaurant_name like '%Blue Ribbon%';
SUBSTRING (대상 컬럼, 시작 위치, 글자 수)
- 문자열에서 일부분만 잘라서 추출할 때 사용합니다.
select addr '원래 주소',
substr(addr, 1, 2) '시도'
from food_orders
where addr like '%서울특별시%';
CONCAT (붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
- 여러 문자열을 하나로 이어붙이는 함수입니다.
select restaurant_name '식당명',
addr '주소',
concat('[',substr(addr, 1, 2),'] ', restaurant_name) '[지역]식당명'
from food_orders
where addr like '%서울%';
CONCAT( '[' -- 첫 번째 문자열 (왼쪽 대괄호)
, SUBSTR(addr, 1, 2) -- 두 번째 문자열 (주소에서 앞 두 글자)
, '] ' -- 세 번째 문자열 (닫는 대괄호 + 공백)
, restaurant_name -- 네 번째 문자열 (식당 이름) )
3주차 3강 내용 정리
select substr(addr, 1, 2) '지역',
cuisine_type '음식 종류',
avg(price) '평균 금액'
from food_orders
where addr like '서울%'
group by cuisine_type;
group by 1, 2; (컬럼 위치를 숫자로 작성해서 입력할 수 있다!)
위의 SQL문과 아래가 같은 결과값을 도출됐는데 차이가 무엇인지 알아봤더니
SQL에서 GROUP BY를 쓸 때 SELECT에 있는 컬럼 중 집계 함수(AVG, SUM 등)가 아닌 컬럼은
모두 GROUP BY 절에 포함해야 한다는 걸 알게 되었다.
그럼에도 오류가 발생하지 않은 이유는 그건 현재 조회하는 데이터가 단순해서 그런 것이라는 걸 확인했다.
select substr(email, 10) '도메인',
count(customer_id) '고객 수',
avg(age) '평균 나이'
from customers
group by 1;
어떻게 이메일 도메인들만 추출해낼 수 있을지 고민했는데, 글자수를 맞춰두신 것이었다... 하하
select concat('[', substr(addr, 1, 2), '] ', restaurant_name, ' (', cuisine_type, ') ') "음식점",
count(1) "주문건수"
from food_orders
group by 1;
SQL문이 길어져서 복잡해보이지만 배운 것들을 하나하나 활용하면 충분히 도달할 수 있었다.
달리기반 1번 퀘스트
select count(*) name_cnt
from users
where name like '김%';

내 생각대로 SQL문을 만들어서 퀘스트에서 요구한 값을 도출해냈는데, 정답을 확인하니 아래와 같았다.
SELECT count(distinct(user_id)) as name_cnt
FROM users
where substr(name,1,1) = '김'
중복된 값이 있었다면 아마 값이 달라져서 조금 더 고민해봤을텐데, 답을 보고나니 중복된 값도 포함될 수 있었음을 알았다.
substr 함수를 사용해 김씨만 추출한 것과 내가 작성한 제일 첫 자리가 김으로 시작하는 값을 찾은 것은 이름을 찾는 과정에선 같은 의미로 사용되었지만 이름이 아닌 다른 경우에선 달라질 수도 있겠다는 생각이 들었다.
그럴 경우는 없겠지만 '김 철수'가 아닌 '김치 철수' 라는 특이한 성을 가진 분이 계시다거나 하면 말이다...