코테를 준비하면서 sql문법도 같이 공부하고 있는데 HAVING, WHERE, IN이 헷갈려서 그 차이점을 알아보려고 한다. 이거 헷갈리는 바람에 코테 1문제 못 풀었다..슬퍼~~
where은 sql의 가장 기본 문법 중 하나라고 할 수 있다.
SELECT * FROM student WHERE gpa >= 3.5;
라고 하면, student테이블에서 gpa가 3.5이상이라는 조건을 만족하는 행을 찾아줘!라는 뜻이다.
having
은 group by
와 함께 쓰이며 기능은 where과 동일하다. group by와 같이 쓰이므로
SELECT * FROM student GROUP BY grade HAVING gpa >= 3.5;
는
student 테이블에서 grade(학년)별로 그룹을 묶고, gpa가 3.5이상인 행이 포함된 행을 찾는다.
where은 모든 절에 대해서 조건을 만족하는지 검사하지만, having은 그룹 내에서 조건을 만족하는지 검사한다.
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일 빌릴 수 있는 숙소의 아이디와 그 총액을 구해라
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사용과 카운트 걸기) 까지는 생각했는데 그걸 적절한 위치에 넣지 못하여 결국 풀지 못했다 ㅠㅠ
- where절에서 1일부터 5일까지 값을 갖고있는 행들을 추리고
- 그 행들을 room_id별로 그룹화한다.
- 그리고 그룹 별로 행의 갯수가 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;