TIL 통합

12/01 일지

네디0318 2023. 12. 1. 14:30

1. 카타

1)이름에 'el'이 들어간 동물 출력('dog'만) : and와 or의 순서

오늘 카타 문제를 풀면서 제일 순간적으로 당황했던 문제가 아닐까 싶다.

다름 아니라 and의 위치에 관한 것이었는데, '그리고'의 조건을 확실히 주려면 and가 무조건 or의 앞에 와야한다는 것을 제대로 깨달았다.

처음에 입력했던 코딩은 아래 내용이었는데

SELECT ANIMAL_TYPE, ANIMAL_ID, NAME
from  ANIMAL_INS
WHERE  NAME LIKE '%el%' OR '%El%' OR '%eL%' or '%el%' AND ANIMAL_TYPE = 'Dog'

 

 

이렇게 하니 계속 'Dog'뿐만 아니라 'Cat'도 조회됐다. 내가 분명 배웠던 대로 한 게 맞을텐데 뭐지..? 하면서 몇번이고 반복해서 코드를 돌려봤다가 or 뒤에 and가 오니 그 and 마져도 or에 걸려서 그저 여러 가능한 조건들 중 하나로 묶여버린걸까 하는 생각을 한참 뒤에 하게 됐다. 그래서 아래처럼 바꾸니 바로 원하던 대답이 나왔다.

결론은 and와 or의 위치를 주의할 것!

 

SELECT ANIMAL_TYPE, ANIMAL_ID, NAME
from  ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%' OR '%El%' OR '%eL%' or '%el%'

 

 

2)여러 정렬 기준

SELECT animal_id, name, datetime
from animal_ins
order by name asc, datetime desc

 

여러 정렬 기준을 어떻게 해야하나 잠깐 망설이고 고민했는데, 콤마 하나로 쉽게 해결됐다.

우선 이름으로 오름차순 정렬하고, 이름이 같은 동물일 경우 날짜 순으로 내림차순 하는 것이 과제였던 문제.

'이름 오름차순, 날짜 내림차순'이 아니라 '이름이 같을 경우 날짜로 내림차순'이라 순간 다른 함수가 들어가야하나 싶었지만, 따로 입력해야할 것은 없었기에 괜히 어렵게 생각했다 싶었다.

 

 

3)가장 빠른 날짜 구하기 : MIN() 먼저 사용해보기

 

-여러 문제에서 등장했던 유형. 날짜에도 MAX()나 MIN()을 사용할 수 있을까 싶었는데 아무 문제 없이 됐었다.

-limit과 서브쿼리 활용하기 : '가장 빠른(느린) 날짜/최고가(최저가)' 등을 묻는 문제의 질문/해설에서 단골로 등장한 유형. select 부분에 min/max()를 넣어주고 order 밑에 limit과 최저/최고 몇순위까지 출력하는지만 입력하면 되는 것 같다.

 

예)

select name
from anmimal_ins
where datetime = (select max(datetime) from animal_ins)

#또는

select name
from animal_ins
order by datetime asc
limit 1

 

4)Null 처리하기    : 답변에 많이 있는 coalesce와 ifnull함수 알아보기 =>추후 과제

*ifnull([칼럼명], 'null일 때의 값'

select ANIMAL_TYPE,
       IF(NAME IS NULL, 'No name', NAME) NAME,
       SEX_UPON_INTAKE
from ANIMAL_INS
ORDER BY ANIMAL_ID
#또는 아래처럼
select ANIMAL_TYPE,
       IFNULL(NAME, 'No name') NAME,
       SEX_UPON_INTAKE
from ANIMAL_INS
ORDER BY ANIMAL_ID

 

5) 흉부외과 또는 일반외과 의사 목록 출력하기

-in( )활용 : 조건문에서 여러 조건을 어떻게 하는지 생각하다가 and로 했는데 에러메시지가 떴었고, 결국 질문/답변을 참고하다가 in을 활용하면 된다는 것을 알았다.

캠프 참여 전에 혼자 파이썬 독학하면서 in을 봤던 것 같은데 복습하면서 활용법을 좀 더 몸에 익혀둬야할 듯 하다.

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d')
  FROM DOCTOR
  WHERE MCDP_CD IN ('CS', 'GS')
  ORDER BY HIRE_YMD DESC, DR_NAME ASC;