일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- KPT
- #스파르타내일배움캠프
- diary
- #내일배움캠프
- Github_token
- 해우소
- 변수의 다양성
- 메서드
- GitHub
- Diary 해우소
- JVM
- 스파르타내일배움캠프
- Java
- 내일배움캠프
- 클래스
- Git
- Token
- #스파르타내일배움캠프TIL
- TiL_1st_0419
- 포맷은 최후의 보루
- 스파르타내일배움캠프TIL
- 생성자
- 객체지향 언어
- 인스턴스
- 회고록
- 감사기록
- static
- 스레드
- 성장기록
- Java의 이점
- Today
- Total
몬그로이
SQL 02 본문
if (조건, 조건을 충족시, 조건 미충족시)
select restaurant_name,
cuisine_type "원래 음식 타입",
if(cuisine_type='Korean', '한식', '기타') " 음식 타입"
from food_orders
* 음식 타입이 'Korean' 일 때는 한식, 아닐 때는 기타 로 적어줘
select addr "원래 주소",
if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소"
from food_orders
where addr like '%문곡리%'
*주소가 평택군을 포함할 때 문곡리를 문가리로, 아닐때는 그대로 적어줘
조합하여 사용하기
select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인",
from customers
group by 1
*email에 gmail 이 포함되어 있다면, email 이 gmail 인 경우 @gmail 로 바꿔주고(수정),
포함되어있지 않다면 email 그대로 써 줘
그리고 10번째 글자부터 불러와 줘(적어줘)
Case문 사용하기
select case when cuisine_type = 'Korean' then '한식'
when cuisine_type in ('Japanese', 'Chinese') then '아시아'
else '기타'end "음식타입",
cuisine_type
from food_orders
*cuisine_type 이 'Korean' 일 때는 '한식',
cuisine_type 이 'Japanese' 나 'Chinese' 라면 '아시아',
나머지는 '기타' 라고 적어줘
select order_id, price, quantity,
case when quantity=1 then price
when quantity>=2 then price/quantity end "음식 단가"
from food_orders
* 이후 다른 조건이 없을 때 else 생략 가능
10세 이상, 30세 미만의 고객의 나이와 성별로 그룹 나누기 (이름도 같이 출력)
select case when (age between 10 and 19) and gender='male' then '10대 남성'
when (age BETWEEN 10 and 19) and gender = 'female' then '10대 여성'
when (age BETWEEN 20 and 29) and gender = 'male' then '20대 남성'
when (age BETWEEN 20 and 29) and gender = 'female' then '20대 여성'
end
name, age, gender
from customers
where age BETWEEN 10 and 29
group by gender = 'female', gender = 'male'
음식 단가, 음식 종류 별로 그룹 나누기
(Korean = 한식, Japanese, Chinese, Vietnamese, Indian = 아시아식, 그 외 = 기타)
(가격 = 5000, 15000, 그 이상)
select restaurant_name, price/quantity "단가", cuisine_type, order_id,
case when (price/quantity <5000) and cuisine_type='Korean' then '한식1'
when (price/quantity between 5000 and 15000) and cuisine_type='Korean' then '한식2'
when (price/quantity > 15000) and cuisine_type='Korean' then '한식3'
when (price/quantity <5000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식1'
when (price/quantity between 5000 and 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식2'
when (price/quantity > 15000) and cuisine_type in ('Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '아시아식3'
when (price/quantity <5000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타1'
when (price/quantity between 5000 and 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타2'
when (price/quantity > 15000) and cuisine_type not in ('Korean', 'Japanese', 'Chinese', 'Thai', 'Vietnamese', 'Indian') then '기타3' end "식당 그룹"
from food_orders
지역과 배달시간을 기반으로 배달수수료 구하기(식당 이름, 주문 번호 함께 출력)
(지역: 서울, 기타 - 서울일 때는 시간 계산 *1.1, 기타일 때는 곱하는 값 없음
시간: 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%)
select case when delivery_time > 30 then price*0.1*if(addr like '%서울%', 1.1, 1)
when delivery_time > 25 then price*0.05
else 0 end "수수료",
restaurant_name, order_id, price , delivery_time , addr
from food_orders
주문 시기와 음식 수 기반으로 배달할증료 구하기
(주문 시기: 평일 기본료 = 3000, 주말 기본료 = 3500
음식 수 : 3개 이하 - 할증 없음, 3개 초과 - 기본료*1.2)
select case when day_of_the_week='weekday' then 3000*if(quantity>3, 1.2, 1)
when day_of_the_week = 'weekend' then 3500*if(quantity>3, 1.2, 1)
end "배달 할증료",
restaurant_name, order_id, day_of_the_week, quantity
from food_orders
data type
숫자처럼 보이지만 사실은 문자인 경우, 계산을 위해서 숫자로 바꿔야 한다면 캐스팅이 필요함
--숫자로 변경
cast(if(rating='Not given', '1', rating) as decimal)
--문자로 변경
concat(restaurant_name, '-', cast(order_id as char))
*columm 명 앞에 ABC, 123 으로 data type 에 대한 힌트가 있으니 잘 보고 사용하면 됨
다음의 조건으로 배달시간이 늦었는지 판단하는 값을 만들어주세요.
- 주중 : 25분 이상
- 주말 : 30분 이상
- SQL 문의 기본 구조로 시작
- 조건을 여러번 적용할 때 if, case 문 중 어떤 것을 이용할지 결정
- 조건에 ‘주중, 주말’ 조건과 ‘배달시간’ 조건을 동시에 줄 때 사용 할 논리연산자 결정
SELECT order_id, restaurant_name, delivery_time, day_of_the_week,
case when day_of_the_week = 'weekend' and delivery_time >= 25 then '늦음'
when day_of_the_week = 'weekday' and delivery_time >= 30 then '늦음'
else '늦지 않음' end "지연 여부"
FROM food_orders
잘못된 풀이 /오류남
SELECT case when day_of_the_week = 'weekend' then if(delivery_time >= 25, 늦음, 정상)
when day_of_the_week = 'weekday' then if(delivery_time >= 30, 늦음, 정상)
order_id, restaurant_name, delivery_time, day_of_the_week
FROM food_orders
case 문은 'when 뒤의 논리값이 "참일 경우" then 을 반환한다' 라는 논리 이므로
즉, '반환할 것'을 넣는 공간이기 때문에 if를 넣을 수 없으며
분리하고 싶다면 또 다시 when-then 으로 구분해 넣어야 함
'Organizing Docs > SQL Docs' 카테고리의 다른 글
SQL 05 (0) | 2024.06.29 |
---|---|
SQL 03 (0) | 2024.06.29 |
SQL04 (0) | 2024.06.29 |
SQL 01 (0) | 2024.06.27 |
SQL(Structured Query Language) (0) | 2024.05.25 |