SQL

[1128 TIL] 알고리즘SQL 코드카타 , WHERE / HAVING의 차이

sjy0074 2024. 11. 28. 21:11

알고리즘 sql 코드카타 

오늘의 sql코드카타 연습 중 시행착오가 있었던 몇 가지 문제 해결 과정을 적어본다.

 

12번 문제 - 이름에 el 들어가는 개 찾기


-- 코드를 입력하세요
SELECT animal_id, name
from animal_ins
where animal_type = 'dog' , name like "%el%"
order by name

로 하면 실행되지 않는다. where 조건이 2가지 모두 충족해야 하므로  and 로 묶어주어야 한다.

 


SELECT animal_id, name
from animal_ins
where animal_type = 'dog' and name like "%el%"
order by name

 

16번 문제 - 경기도에 위치한 식품창고 목록 출력하기 


SELECT warehouse_id,
       warehouse_name,
       address,
       case when freezer_yn is null then 'N'
       else freezer_yn end freezer_yn
from food_warehouse
where address like "%경기%"
order by warehouse_id asc 

 

if 구문 쓰려고 시도했으나 실행되지 않았다. case when 쓰는게 맞다. else로 나머지들은 그대로 예/아니오로 놔둬야 하므로.

그리고 경기도 조건을 빼먹지 않아야함! 

주어진 문제를 꼼꼼하게 잘 읽고 어떤 식으로 조건을 줄지 찬찬히 이해하고 시작하는것이 중요하겠다.

 

 


 

 

3주차 SQL 라이브 세션 내용 및 아티클스터디 2회차 내용 

 

아티클 활동 내용을 아래와 같다.

  • group by: 많은 데이터를 유형별로 묶어서 설명하기 위해 사용
1)무엇을 기준으로?(group by 그룹핑할 기준이 될 열 이름)
그러나 group by 열1,열2 열의 순서는 비추천(쿼리 길거나 남이 볼 땐 이해어려움)

2)그룹핑하여 보고싶은 값의 내용은 무엇인가?(총계, 평균, 최대, 최소, 편차 등)
주의점 : 특정 열을 기준으로 그룹핑 한 뒤에는 더 이상 개별 데이터 나열x

  • having : 그룹핑한 뒤 조건별로 골라내기 위해 사용
group by뒤에 having 명령어 통해 그룹핑한 뒤에 특정조건 걸러냄
having 은 where과 마찬가지로 논리연산자, 비교, 범위 또는 목록, 나열 등을 조건으로 가질 수 있으며, 콤마(,)를 통해 연력하여 여러 개의 조건을 가질 수도 있음

  • sql 작성 순서와 실행순서 작성 순서 :

    select-from-where-group by-having-order by 실행 순서 : from-where-group by-having-select-order by

  • where과 having의 차이

    where는 group by보다 먼저 실행, having 은 group by뒤에 실행 (where은 원본 데이터에서 일단 조건에 맞는 것을 골라내고 그 남은 데이터에서 그룹핑함) (having은 일단 그룹핑한 뒤 그 중에서 조건에 맞는 것을 골라냄)

 

 


실제로 아티클에서 말한 것 처럼 데이터를 조회/추출하기 위한 sql의 구체적인 문법과 함수에서는 엑셀과 비교했을 때 사용법의 차이만 있을 뿐 , 엑셀에서 사용하던 함수와 그 문법 구조가 크게 다르지 않아 적응에 크게 어렵지 않았다.

쿼리구조에서 group by 대분류 이 부분을 기계적으로만 작성해왔고 왜인지 이유를 생각해보지 않았는데, 이 아티클에서 자세하게 풀어서 설명해줘서 좋았다.

쿼리의 아주 기본구조지만 이를 이해하고 사용하는 것과 단순암기하고 도구로만 사용하는 것의 차이를 느꼈다.

 

 

+

 

라이브 세션에서 where 구문과 having 구문 사용의 차이에 대해 이해가 살짝 덜 되어서 아티클스터디 때 관련 아티클을 정하여 스터디 진행하였다. 스터디 후에도 이해가 가지 않는 부분에 대해 여쭤보기 위해 조원들과 현경튜터님 찾아가서 자세한 설명을 듣고 완벽히 이해할 수 있었다..!

 

  • 거주하는 주(state)별로 고객수를 조회하고, 고객수가 10명 이상인 주(state)만 조회 (고객수가 큰 도시부터 정렬) 하는 문제의 경우 그룹핑을 해야하기 때문에 where절을 쓸 수 없고 그룹핑 후 사용할 수 있는 구문은 Having이기 때문에 순서에 맞춰 작성해야하는 점 유의하기

  • having 절에는 집계함수를 활용하여 구문 작성을 해야함
       별칭은 group by, having, order by 뒤에도 사용이 가능함

 

 

위의 예시를 통해 그룹핑이 우선일 때 WHERE절을 쓸 수 없으므로 WHERE은 HAVING을 대체할 수 없다는 것을 알았고, 반대로 WHERE들어갈 자리에 HAVING 넣어도 실행은 되지만, 우리는 약속으로 HAVING 뒤에 집계함수를 적기로 하였으므로 WHERE자리엔 WHERE로 적어야 함을 알았다.