티스토리 뷰
반응형
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;
반응형