-
[SQL] SQL 기초 COUNT(), SUM(), MAX()/MIN(), AVG(), ROUND()SQL & Database 2021. 10. 27. 09:58
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: 계산된 값에 조건을 추가.
'SQL & Database' 카테고리의 다른 글
[Tibero] 데이터 암호화 (0) 2023.04.07 [SQL] SQL 기초 (SELECT, AS, DISTINCT, WHERE, LIKE, IS NULL, BETWEEN, AND, OR, ORDER BY, LIMIT, CASE) (0) 2021.10.13 [SQL] SQL 기초 (CREATE TABLE, INSERT INTO, SELECT, ALTER TABLE, UPDATE, DELETE FROM) (0) 2021.09.30 [SQL] SQL의 간단한 역사 (0) 2021.09.15