[SQL] SQL 기초 COUNT(), SUM(), MAX()/MIN(), AVG(), ROUND()
SQL을 이용한 계산
- COUNT(): rows의 수를 count함
- SUM(): column의 합의 계산
- MAX() / MIN(): 가장 큰/작은 수
- AVG(): columns의 평균
- ROUND(): column의 값을 반올림
COUNT
-테이블의 rows를 가장 빠르게 계산 하는 방법은 COUNT
-column의 이름을 argument로 받아서 non-empty 값을 가진 coulmn의 개수를 구함
SELEC COUNT(*)
FROM table_name;
-모든 rows를 count하기 위해 *를 넣어줌
-COUNT는 중복된 값을 포함해서 count를 하기 때문에 unique value만 세기 위해서는 다음과 같이 DISTINCT를 넣어주면 된다.
SELECT COUNT(DISTINCT category)
FROM fake_apps;
SUM
-column 값의 합을 반환해줌
SELECT SUM(downloads)
FROM apps;
-count는 non-empty value를 가진 rows들의 개수를 구하기 위한 것이고 sum은 모든 값들의 합을 구하기 위한 것
Max / Min
-column에서 가장 큰 값과 작은 값을 반환
SELECT MAX(downloads)
FROM apps;
-가장 크고 작은 값이 여러 개 있으면 가장 위에 있는 rows가 반환 된다.
Average
-column의 이름을 매겨변수로 받아서 평균값을 반환한다.
SELECT AVG(downloads)
FROM apps;
-unique value의 합을 구하기 위해서는 DISTINCT를 이용하면됨
/* Returns 2.02365 */
SELECT AVG(price)
FROM apps;
/* Returns 4.15833.. */
SELECT AVG(DISTINCT price)
FROM apps;
ROUND
-기본적으로 SQL은 반올림 없이 가능한 정확하게 저장하려고 한다.
-ROUND를 이용해 읽기 쉽게 결과 table을 만들 수 있다.
-ROUND에는 2개의 arguments (column name, integer 소수점 자리)가 들어 간다.
SELECT ROUND(price, 0)
FROM apps;
Group BY 1
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 1999;
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 2000;
SELECT AVG(imdb_rating)
FROM movies
WHERE year = 2001;
-이렇게 다른 where 절을 통해서 여러 그룹의 숫자를 계산 할 때가 있다.
SELECT year,
AVG(imdb_rating)
FROM movies
GROUP BY year
ORDER BY year;
-GROUP BY는 SELECT와 함께 쓰여서 그룹으로 동일한 데이터를 정렬함
-GROUP BY는 WHERE절 뒤에 나오면서 ORDER BY 또는 LIMIT 앞에 나온다.
SELECT price, COUNT(*)
FROM apps
GROUP BY price;
--RESULT--
|price|COUNT(*)|
----------------
|0.0 | 73 |
|0.99 | 43 |
|1.99 | 42 |
|2.99 | 21 |
|3.99 | 9 |
SELECT CATEGORY, SUM(DOWNLOADS)
FROM APPS GROUP BY CATEGORY;
--Result--
|category |SUM(downloads)|
-------------------------
|Books |160864 |
|Business |178726 |
|Catalogs |186158 |
|Education |184724 |
|Entertainment |342333 |
|Finance |423535 |
|Food&Drink |323232 |
|Games |163433 |
|Health&Fitness |535323 |
-SELECT에 포함 안된 column으로 GROUP BY 해도 된다.
SELECT name, downloads
FROM apps
GROUP BY price;
이렇게 하면 각 price 그룹에서 최상단에 있는 것만 출력 된다
Group by 2
-계산된 결과로 group by를 하고 싶은 경우
SELECT ROUND(imdb_rating),
COUNT(name)
FROM movies
GROUP BY ROUND(imdb_rating)
ORDER BY ROUND(imdb_rating);
-하지만 이러한 쿼리는 time-consuming. 오류를 더 만들기 쉽고 쓰는데.
-이런 쿼리를 다음과 같이 표현 할 수 있다.
SELECT ROUND(imdb_rating)
COUNT(name)
FROM movies
GROUP BY 1
ORDER BY 1;
-1, 2, 3 …. 는 select 문의 첫번째, 두번째, 세번째.. 요소를 뜻한다.
-Group by의 순소는 select 문의 요소 순서를 안따라도 된다.
EX) GROUP BY 1, 2, 3 , GROUP BY 3, 1, 2
Having
-Group by에서 SQL은 어떤 group을 포함할껀지 뺄껀지 filter 할 수 있다.
-예를 들어 특정 조건에 의해 영화를 조회하는데 10개 이내로 하고 싶을 때
-우리는 rows를 제한하기 위한 것이 아니라 group을 제한하고 싶으므로 where를 쓸 수 없다.
-이때 HAVING을 써야 한다.
SELECT yearm
genre,
COUNT(name)
FROM movies
GROUP BY 1, 2
HAVING COUNT(name) > 10;
-계산된 property는 having을 각 rows는 where를 써야 한다.
-HAVING은 항상 GROUP BY 뒤에 나오고 ORDER BY, LIMIT 앞에 나온다.
-where절은 having 절과 함께 사용 될 수 있다.
SELECT pirce,
ROUND(AVG(downloads)),
COUNT(*)
FROM apps
GROUP BY price HAVING COUNT(*) > 10;
--Result--
|price|ROUND(AVG(downloads))|COUNT(*)|
--------------------------------------
|0.0 | 15762.0 | 73 |
|0.99 | 15972.0 | 43 |
|1.99 | 16953.0 | 42 |
|2.99 | 17725.0 | 21 |
|14.99| 19369.0 | 12 |
REVIEW
COUNT: row의 개수를 셈
SUM: COLUMN의 합을 구함
MAX/MIN: 가장 큰/작은 값을 구함
AVG: COLUMN의 평균을 구함
ROUND: COLUMN의 값들을 반올림함
GROUP BY: 하나 이상의 columns 데이터를 결합
HAVING: 계산된 값에 조건을 추가.