-
SQL 기초 문법 2SQL 2024. 8. 6. 04:22
SQL
조건에 따라 포맷 다르게 변경하기
select from where group by order by
1. 데이터를 사용할 때 예전에 사용하던 값이어서 수정이 필요하거나 잘못된 값이어서 수정이 필요할 때가 있다.
2. 혹은 주소 데이터에서 전체 데이터가 아닌 부분 데이터 값만 필요할 때가 있다. 예를 들어 서울시 강남구 도곡동 어쩌구.. 일 때 [서울] 만 가져오고 싶다거나 하는.
3. 혹은 보고서를 작성할 때 사업장 명과 지역이 같이 나와야 할 때 '사업장' → '사업장 [지역]' 으로 문자 포맷을 변경해주고 싶을 때를 알아보자.
문자열 바꾸기 (replace)
replace(바꿀 컬럼, 현재 값, 바꿀 값)
코드를 예로 들면 이렇게 바꿔줄 수 있다.
(식당 명의 ‘Blue Ribbon’ 을 → ‘Pink Ribbon’ 으로 바꾸기)
select restaurant_name "원래 상점명", replace(restaurant_name, 'Blue', 'Pink') "바뀐 상점명" from food_orders where restaurant_name like '%Blue Ribbon%'
(주소의 ‘문곡리’ 를 → ‘문가리’ 로 바꾸기)
select addr "원래 주소", replace(addr, '문곡리', '문가리') "바뀐 주소" from food_orders where addr like '%문곡리%'
원하는 문자만 남기기 substr (substring)
substr(조회 할 컬럼, 시작 위치, 글자 수)
예시 주소에서, 주소 전체가 아닌 '서울' 만 남기기
select addr "원래 주소", substr(addr, 1, 2) "시도" from food_orders where addr like '%서울특별시%'
참고로 원래 주소 데이터는 아래 addr이고, substr(addr, 1, 2) 이 말은 → addr 컬럼의 첫번째 글자 '서' 를 시작으로 글자수 2개를 가져오겠다는 뜻, 즉 '서울' 가져오겠다는 말이다.
여러 컬럼의 문자를 합치기 count
concat (붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
- 붙일 수 있는 문자의 종류
- 컬럼
- 한글
- 영어
- 숫자
- 기타 특수문자
만약, 아래와 같이 서울시에 있는 음식점명 앞에 [서울]을 붙여서] 수정하고 싶을 때,
select restaurant_name "원래 이름", addr "원래 주소", concat('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름" from food_orders where addr like '%서울%'
이렇게 해줄 수 있다.
concat안에 있는 있는 걸 뜯어볼까?
('[', substring(addr, 1, 2), '] ', restaurant_name) "바뀐 이름"
1. [ → 이거 하나가 문자열이어서 ' ' 작은 따옴표 안에 넣어주고 쉽표로 구분해준거다.
2. substring(addr, 1, 2) → 위에서 설명한 문자열의 일부만 가져온 것이다. 여기서는 주소 컬럼 addr의 첫번째 글자 '서' 부터 2개, 즉, 서울
3. '] ' → 뒤에 띄어쓰기 까지 포함해줘서 작은 따옴표 안에 넣어줬다. 그래야 [서울] shake shack 이렇게 출력되니까.
4. restaurant_name → 이건 이미 있는 컬럼 이기 때문의 별도의 작은 따옴표 ' ' 가 필요 없다. 위의 데이터를 보면 알 수 있듯 애초에 concat을 쓴 이유가 레스토랑이름 앞에 [서울] 이라는 문자열을 붙이고 싶어서 넣어준거다.
5. "바뀐 이름" 은 새롭게 지정해 준 컬럼명이다.
조건에 따라 포맷을 다르게 변경해야 할 때
if 문
if(조건, 조건을 충족할 때 할 행동, 조건을 충족하지 못할 때 할 행동)
예를 들어 아래 코드는
if ( addr like '%평택군%' → 만약, '평택군' 이라는 문자열이 들어간 주소 데이터가 있으면,
, replace ( addr, '문곡리', '문가리' ) → addr(주소) 컬럼의 '문곡리'를 '문가리'로 바꾸고,
, addr ) → '평택군'이 들어간 주소 데이터가 없으면 그냥 addr 주소 데이터 그대로 둬.
라는 구문이다.
select addr "원래 주소", if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소" from food_orders where addr like '%문곡리%'
조건별로 적용할 값을 지정해 줄 때
case 문
case when 조건1 then 값(수식)1
when 조건2 then 값(수식)2
.
.
.
else 값(수식)3 end 새로 지정할 컬럼명예를 들어,
음식 타입을 ‘Korean’ 일 때는 ‘한식’, 그 외에는 ‘기타’ 라고 지정하고 → end 로 마무리 해준 다음, 그 전체 컬럼값을 '음식 타입'으로 정해주는 코드를 작성하면 아래와 같다.
select restaurant_name, cuisine_type "원래 음식 타입", case when cuisine_type='Korean' then '한식' else '기타' end as '음식 타입' from food_orders
다른 예로, 음식 단가를 주문 수량이 1일 때는 음식 가격, 주문 수량이 2개 이상일 때는 음식가격/주문수량 으로 지정해서 써줄수도 있다.
select order_id, price, quantity, case when quantity=1 then price when quantity>=2 then price/quantity end "음식 단가" from food_orders
이렇게 되면 단가별 음식 가격을 알 수 있다.
Data Type 오류 해결 방법
데이터타입을 변경해줘야 할 떄 (문자열 → 숫자 / 숫자 → 문자열)
--숫자로 변경 cast(if(rating='Not given', '1', rating) as decimal) --문자로 변경 concat(restaurant_name, '-', cast(order_id as char))
Subquery문
말 그대로 Query 안에 sub 로 들어간 구문
select column1, special_column from ( select column1, column2 from table1 ) a
사실.. 이건 해봐야 이해가 간다..
안해보고 설명만 들었을 땐.. 이게 뭐람... 하는 생각만 들었다.
암튼, '너 이따가 좀 덜 힘들게 내가 지금 작업 해놓는거야~' 하는 느낌이 서브쿼리문이다.
약간 뭐랄까.. 이따 갖다 쓰려고 자리 깔아놓는 느낌..?
'SQL' 카테고리의 다른 글
SQL 기초 문법 3 (0) 2024.08.06 SQL 기초 다지기 (0) 2024.08.02 - 붙일 수 있는 문자의 종류