티스토리 뷰

반응형

https://ko.khanacademy.org/computing/computer-programming/sql/more-advanced-sql-queries/pt/restricting-grouped-results-with-having

CREATE TABLE exercise_logs
    (id INTEGER PRIMARY KEY AUTOINCREMENT,
    type TEXT,
    minutes INTEGER, 
    calories INTEGER,
    heart_rate INTEGER);

INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("biking", 30, 115, 110);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("biking", 10, 45, 105);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("dancing", 15, 200, 120);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("dancing", 15, 165, 120);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("tree climbing", 30, 70, 90);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("tree climbing", 25, 72, 80);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("rowing", 30, 70, 90);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("hiking", 60, 80, 85);

SELECT * FROM exercise_logs;

 

 

AS의 사용

 

만약에 각 운동별로 얼마나 많은 칼로리를 소모했는지 알고 싶다면?

집계 쿼리 SUM으로 calories를 묶어줘야 한다.

 

 

SELECT type,SUM(calories)

SELECT type,SUM(calories) FROM exercise_logs GROUP BY type;

 

만약에 SUM(calories)를 다시 이름을 주고 싶다면?

AS를 사용하면 된다.

SELECT type,SUM(calories) AS total_calories FROM exercise_logs GROUP BY type;

 

HAVING의 사용

그렇다면 여기서 알고 싶은 것은, 어떤 운동들이 전체를 통틀어 150칼로리 이상 소모했는지.

 

여기서 WHERE을 쓰기 위해서는 GROUP 앞에 써야 한다.

SELECT type,SUM(calories) AS total_calories FROM exercise_logs
    WHERE calories >150
    GROUP BY type;
type	total_calories
dancing	365

이 결과는 이상하게 나온다. 정확히는 1개만 나온다.

 

전체를 다 표시하고 싶다.

그렇다면 HAVING을 사용해야 한다.

 

이러면 WHERE을 지우고, GROUP BY뒤에 HAVING을 넣는다.

SELECT type,SUM(calories) AS total_calories FROM exercise_logs
    GROUP BY type
    HAVING total_calories >150;
type	total_calories
biking	160
dancing	365

 

다른 결과를 보이지만, 헷갈리기 쉽다.

그룹으로 묶인 행에는 sum,min,max,avg 등 어떤 집계함수도 사용될 수 있다.

SELECT type, AVG(calories) AS avg_calories FROM exercise_logs
    GROUP BY type
    HAVING avg_calories > 70
    ;

 

 

COUNT 함수

 

모든 운동 중 두 번 이상 기록한 운동만 찾으려고 하면, COUNT를 사용한다.

count('컬럼명') >=2

SELECT type FROM exercise_logs GROUP BY type HAVING count(*) >=2;

 

 

반응형