SQL & Database

[SQL] SQL 기초 COUNT(), SUM(), MAX()/MIN(), AVG(), ROUND()

chul542 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: 계산된 값에 조건을 추가.