공부일기/엑셀보다 쉬운 SQL

엑셀보다 쉬운 SQL 3주차 개발일지

pipiiiiii 2023. 11. 9. 20:49

SQL의 명령어 익히기

· 특정 문자를 다를 문자로 바꾸고 싶다면 replace를 사용하면 된다. 

ex)

 

· 원하는 문자만 남기고 싶다면 substr(=substring)를 사용하면 된다.

ex)

 

· 여러 컬럼의 문자를 합치고 싶다면 concat을 사용하면 된다. 

ex)

 → concat은 원하는 만큼 붙일 수 있다.

 

· 실습 

 - 서울 지역의 음식 타입별 평균 음식 주문 금액 구하기

 → 출력 : 서울, 타입, 평균 금액

 → 내 쿼리문 및 수정사항

→ group by에 사용된 1, 2는 select에 있는 컬럼을 의미한다. 

1은 첫번째 컬럼, 2는 두 번째 컬럼이다. 컬럼의 이름을 쓰지 않고 숫자로도 표현할 수 있다. 

 

· 실습

 - 이메일 도메인별 고객 수와 평균 연령 구하기 

 → 내 쿼리문 및 수정사항

→ substr을 사용할 때 ()안에 컬럼과 글자 시작 위치, 글자 수를 써야 하지만 만일 글자 시작 위치부터 끝까지 가져오고 싶다면 글자 시작 위치만 사용하고 글자 수는 적지 않은 상태로 괄호를 닫으면 된다. 

 

· 실습

 - '[지역(시도)] 음식점 이름(음식 종류)' 컬럼을 만들고, 총 주문 건수 구하기

 → 내 쿼리문 및 수정사항

 

· 조건에 따라 다른 방법은 적용하고 싶다면 if를 사용하면 된다. 

 → if는 if(조건, 조건 충족 시, 조건 미 충족시)로 사용하면 된다. 

ex) 

→ if는 다른 수식과 결합하여 사용할 수 있다. 

 

· 조건을 여러가지 지정하고 싶다면 case를 사용하면 된다.

 → case문은 case when 컬럼 = 조건 then 조건처럼 사용하면 된다. 

 → 위의 수식 중 when은 이런 경우에, then은 이렇게 해주세요를 뜻한다. 

 → case문은 조건별로 조건을 지정할 수 있다. 

ex) 

 → 위 쿼리문에서 else 는 when으로 지정한 조건들에 부합하지 않은 경우를 말하며, 없는 경우 생략이 가능하다. 

 → 위 쿼리문에서 end는 case를 끝낸다는 의미다. case문을 사용할 때 end를 꼭 써야 수식이 완료된다. 

ex) case 문에 다른 수식을 합쳐서 사용하는 경우

 → 중간에 적인 in은 조건이 2개 이상 포함한 경우 사용한다. 

 → 위 쿼리문의 예시처럼 in외에도 다양한 수식을 포함하여 사용할 수 있다. 

 

· 실습 

 - 10세 이상, 30세 미만 고객의 나이와 성별로 그룹 나누기(이름도 같이 출력) 

 → 내 쿼리문 및 수정사항

 → 쿼리문에서의 궁금증 : 왜 group by절이 아닌 where절을 사용하는 걸까?

 → 이유 : 문제에 10세 이상 30세 미만으로 조건이 정해져 있기 때문에 조건에 맞는 데이터만 가져오는 where절을 사용하는 것이다. group by절은 컬럼을 범주로 묶는 것이기 때문에  위 쿼리문처럼 작성된다면 case문 기준별로 묶어서 조회가 되기도 하지만, 10세 이상 30대 미만 외의 나이도 조회되기 때문에 문제의 의도와 다르게 결과가 나온다. 

 

· 실습

 - 음식 단가, 음식 종류별로 음식점 나누기 

 → 음식 종류 

① korean = 한식

② japanese, chinese, thai, vietnamese, indian = 아시아식

③ 그 외 = 기타

 → 가격 

① 5,000

② 15,000

③ 그 이상

 → 내 쿼리문 및 수정사항

 

· 실습

 - 지역과 배달 시간을 기반으로 배달수수료 구하기(식당 이름, 주문 번호도 함께 출력)

 → 지역 : 서울, 기타 / 서울일 때는 수수료 *1.1, 기타일 때는 곱하기 없음.

 → 시간 : 25분, 30분 / 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%

 → 내 쿼리문 및 수정사항

 

· 실습

 - 주문 시기와 음식 수를 기반으로 배달할증료 구하기

 → 주문 시기 : 평일 기본료 = 3,000 /  주말 기본료 = 3,500

 → 음식 수 : 3개 이하면 할증 없음 / 3개 초과면 기본료 * 1.2

 → 내 쿼리문 및 수정사항

 → 쿼리문에서의 궁금증 1  : then 뒤에 price를 쓰지 않으면 기본료를 더하는 곳이 지정되지 않아서 오류가 날 것이라고 생각했는데 오히려 써서 오류가 났다. 어떻게 어떤 컬럼인지 지정하지 않아도 price에 기본료가 더해지는 걸까?

 

 → 쿼리문에서의 궁금증 2 : 사칙연산을 써야 원하는 결과가 날 줄 알았는데 오히려 사칙연산을 써서 오류가 났다. 사칙연산에도 종류가 있는데 어떻게 지정하지 않아도 원하는 사칙연산이 적용되는 걸까?

 

 → 쿼리문에서의 궁금증 3 : if 앞에 *가 아닌 다른 사칙연산을 사용하면 사용한 사칙연산이 if절에 적용되는 걸까?

 → 궁금증 3의 해결 : 그렇다!! if 앞에 *가 아닌 다른 사칙연산을 적용하면 적용한 사칙연산으로 if절의 모든 내용이 반영된다. 그래서 if절 () 안에 사칙연산을 쓰지 않고 그 앞에 사용하는 것이다. 

 

· 숫자 컬럼 혹은 문자 컬럼을 바꾸고 싶다면 cast를 사용하면 된다.

 → 숫자에서 문자로 바꾸는 수식 : cast (컬럼 as char)

 → 문자에서 숫자로 바꾸는 수식 : cast (컬럼 as decimal)

 

· 3주 차 숙제

 - 다음의 조건으로 배달 시간이 늦었는지 판단하는 값을 만들기

 → 주중 : 25분 이상 / 주말 : 30분 이상

 → 내 쿼리문과 결괏값 

 

→ 정답 쿼리문과 결괏값

 

·3주 차 소감

 - 배운 수식들을 활용해 실습을 하면서 생각과 다른 점과 사용했을 때의 모습 등을 경험할 수 있어서 좋았다. 

그리고 역시나 1주 차와 2주 차는 아무것도 아니었다. 3주 차부터 배운 내용들은 실습 및 복습을 하면서도 '이게 맞나?'라는 의문을 가지고 쿼리를 작성하게 됐고, 작성한 후에 오류가 많이 나서 실습 하나당 많은 시간을 소요하게 됐다. 

그래도 이해가  안 되는 부분은 다양한 방법으로 시도해보기도 하고, 궁금한 부분은 직접 풀어가는 재미도 있어서 시간 가는 줄 모르고 강의를 들을 수 있었다. 

 

강의를 들으면서 가장 중요하다고 느낀 부분은 복습이었다. 

내가 이해를 잘해도 복습하지 않으면 기억이 잘 안 나고 그럼 쿼리문을 쓸 때 막혀서 시간이 오래 걸리게 되기 때문이다. 

남은 강의들을 들으면서 복습도 철저히 해야겠다는 것을 느낀 주차였다.