[MySQL] WHERE,HAVING, IN 차이점

GyeongEun Kim·2023년 4월 13일
0

코테를 준비하면서 sql문법도 같이 공부하고 있는데 HAVING, WHERE, IN이 헷갈려서 그 차이점을 알아보려고 한다. 이거 헷갈리는 바람에 코테 1문제 못 풀었다..슬퍼~~

WHERE

where은 sql의 가장 기본 문법 중 하나라고 할 수 있다.
SELECT * FROM student WHERE gpa >= 3.5;라고 하면, student테이블에서 gpa가 3.5이상이라는 조건을 만족하는 행을 찾아줘!라는 뜻이다.

HAVING

havinggroup by와 함께 쓰이며 기능은 where과 동일하다. group by와 같이 쓰이므로
SELECT * FROM student GROUP BY grade HAVING gpa >= 3.5;
student 테이블에서 grade(학년)별로 그룹을 묶고, gpa가 3.5이상인 행이 포함된 행을 찾는다.

where은 모든 절에 대해서 조건을 만족하는지 검사하지만, having은 그룹 내에서 조건을 만족하는지 검사한다.

IN

SELECT * FROM student WHERE grade IN (3,4);
WHERE절에서 쓰이며 OR대신 쓰인다.

위의 쿼리를 OR을 사용해서 작성하면 SELECT * FROM student WHERE grade=3 OR grage=4;이다.

내가 틀린 코테 문제

예약가능한 숙소의 정보를 담은 테이블 available이 있다.

  • available_id : PK
  • date : 예약가능한 날짜
  • price : 가격
  • room_id : 숙소 아이디
  • title : 숙소 이름

문제

1월 1일부터 1월 5일까지 연속 5일 빌릴 수 있는 숙소의 아이디와 그 총액을 구해라

table

SELECT room_id, SUM(price) as price
FROM available
WHERE DATE(date) IN ('2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05')
GROUP BY room_id
HAVING COUNT(*) =5 ;

where과 in과 having의 적절한 조화,,,가 이루어진 문제였다. 어떻게 구현해야할지 큰 그림 (in사용과 카운트 걸기) 까지는 생각했는데 그걸 적절한 위치에 넣지 못하여 결국 풀지 못했다 ㅠㅠ

  1. where절에서 1일부터 5일까지 값을 갖고있는 행들을 추리고
  2. 그 행들을 room_id별로 그룹화한다.
  3. 그리고 그룹 별로 행의 갯수가 5개인 그룹을 선택한다!

이미 1~5일 외에 다른 날짜를 가지고 있는 행들은 걸러졌고, 행의 갯수가 5개라는말은 1일부터 5일까지의 행을 모두 갖고 있다는 말이니까!!

+) IN을 안쓰고 BETWEEN을 써도 된다!

SELECT room_id, SUM(price) as "price"
FROM available
WHERE date between "2022-01-01" and "2022-01-05"
GROUP BY room_id
HAVING count(date) >= 5;
profile
내가 보려고 쓰는 글

0개의 댓글