프로그래머스 백앤드 데브코스 2주차 과제 리뷰

SSIN·2021년 8월 15일
0

programmers TIL

목록 보기
3/3
post-thumbnail

내 불안한 SQL 과 그걸 지켜보는 멘토님😨

As 키워드를 통한 변수명을 기준으로 삼지마라

SELECT animal_type as type, count(*) as count
from animal_ins
group by type
order by type;
  • 보통 Select 쿼리는 group by 이후에 실행되므로, select 절에서 만든 alias를 모를 수 있습니다(mysql 말고 다른 DBMS에서는 아예 문법적으로 불가능하다 합니다).

  • order by의 경우, select 이후에 실행되지만 가독성을 위해 정확한 컬럼명을 명시해주는게 좋습니다.

  • 또한 As 문에서 정의한 변수명을 특정 키워드의 기준으로 삼는다면, 변수명 이기 때문에 유지보수성에 문제가 생길 수도 있습니다.(아무 생각없이 변수명을 바꾸면!? Holymoly😱)

select 절에는 가급적 서브쿼리를 넣지마라

SET @hour := -1;
select 
    (@hour := @hour + 1) as Hour, 
    (select count(*) from animal_outs where hour(datetime) = @hour) as Count
from animal_outs  // 
where @hour < 23;
  • select 절 내의 서브쿼리는 hour가 0 ~ 23인 동안 계속 데이터를 select 할 것이니, 굉장히 비효율적인 쿼리입니다.
  • 1개의 레코드 조회가 아닌이상, select 절에는 서브쿼리를 가급적 사용하지 않습니다.
  • 차라리 with recursive 문으로 기준이 되는 컬럼을 만들고 select 하는 것이 복잡도가 더 낮을 것입니다.

case when을 활용해보자

  • 원래 코드
SELECT 
  animal_type, 
  ifnull(name, "No name") as name, 
  sex_upon_intake
from animal_ins;
  • case when을 활용
select 
    animal_type,
    case
        when name is null then "No name"
        else name
    end as Name,
    sex_upon_intake
from animal_ins
profile
수다떠는거 좋아하는 개발준비생

0개의 댓글