집계 함수

평균

1
2
SELECT AVG(budget)
FROM films;

최댓값

1
2
SELECT MAX(budget)
FROM films;

합계

1
2
SELECT SUM(budget)
FROM films;

WHERE 절과 집계함수의 조합

1
2
3
SELECT SUM(budget)
FROM films
WHERE release_year >= 2010;

2010이후에 나온 영화중 (budget)의 합계

Example

1
2
3
4
5
6
7
# 2000년과 2012사이에 나온 영화중 gross중 가장 좋은 값
SELECT MAX(gross)
FROM films
WHERE release_year BETWEEN 2000 AND 2012;

# A로 시작하는 영화중, gross가 평균값
select avg(gross) from films where title LIKE 'A%'

Select 산술

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT (4 * 3);

> 12

SELECT (4 / 3);

> 1

SELECT 45 / 10 * 100.0;

> 400

SELECT 45 * 100.0 / 10;

> 450.0

SELECT (4.0 / 3.0) AS result;

> result = 1.333333...
# 살수형 계산이기 때문에 소수점으로 나온다.

AS 앨리어싱

1
2
3
4
5
6
7
8
9
SELECT MAX(budget), MAX(duration)
FROM films;

# 이 쿼리를 처리하면, Query Result에는 구분할수가 없다.
# MAX - budget 결과 MAX - duration 결과가 나온다 (칼럼이름이 구분할수가없다.)

SELECT MAX(budget) AS max_budget,
MAX(duration) AS max_duration
FROM films;

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 영화 타이틀과 넷 프로핏(총 제작비 - 예산) 한 모든 필름을 출력.
select title, (gross - budget) as net_profit from films;

# 영화 타이틀과 재생시간을 가져오되, 재생시간은 시간으로 출력해야만 하고, 재생시간은 duration_hours으로 출력한다.
select avg(duration / 60.0) as avg_duration_hours from films;

# 모든 필름의 평균 재생시간을 가져오되 시간으로 출력할것.
select title, (duration / 60.0 ) as duration_hours from films

# 시민의 사망비율을 가져온다.
select count(deathdate) * 100.0 / count(*) as percentage_dead from people

# 가장오래된 영화년도와 가장 최신영화의 년도의 차이를 구하라
select MAX(release_year) - MIN(release_year) as difference from films

Order By

하나이상의 칼럼을 오름차순 또는 내림차순으로 정렬한다.

1
2
3
4
5
SELECT title
FROM films
ORDER BY release_year DESC;

# release_year을 내림차순 정렬하여 title 출력

ORDER BY가 기본값으로 텍스트 칼럼을 정렬한다면 알파벳 정렬

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 사람들의 이름을 알파벳순으로 정렬해서 출력
select name from people order by name ASC


# 2000년 또는 2012년에 나온 영화이름을 오름차순 정렬하여 출력
select * from films where release_year = 2000 OR release_year = 2012
order by release_year ASC

# 2015년에 개봉하지 않은 영화들 모든 칼럼을 duration에 정렬하여 출력
select * from films where release_year <> 2015 order by duration


# M자로 시작하는 영화들의 타이틀과 수익을 타이틀을 알파벳 정렬하여 출력
select title, gross from films where title LIKE 'M%' order by title ASC


select imdb_score, film_id from reviews order by imdb_score desc

# 모든 영화의 이름을 역순으로 출력
select title from films order by id desc


select birthdate, name from people order by birthdate asc, deathdate desc

select release_year, duration, title from films order by release_year asc, duration asc

select certification, release_year, title from films order by certification asc, release_year asc

select name, birthdate from people order by name asc, birthdate asc

Group By

결과를 하나 이상의 열로 그룹화.

1
2
3
4
SELECT sex, count(*)
FROM employees
GROUP BY sex
ORDER BY count DESC;

공통적으로 Group By는 집계 함수와 같이 사용한다.
Group By는 항상 after 절 이후에 나온다.
그리고 Group By 후엔 항상 Order by가 나온다. 그리고 Order by로 쿼리가 끝을 내야된다.

Example

1
2
3
4
5
6
7
8
9
10
11
12
# 매년 나오는 영화의 갯수 출력
select release_year, count(*) from films group by release_year order by release_year asc

# 매년 나오는 영화의 평균 시간
select release_year, avg(duration) from films group by release_year order by release_year asc


# 출시 년도와 매년 낮은 gross
select release_year, min(gross) from films group by release_year order by release_year

select release_year, country, max(budget) from films
group by release_year, country order by release_year, country

Having

집계 함수는 WHERE 절에서 사용할수가 없는데, 이를 사용하기 위해서 HAVING 절을 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT release_year
FROM films
GROUP BY release_year
WHERE COUNT(title) > 10; # invalid Query

SELECT release_year
FROM films
GROUP BY release_year
HAVING COUNT(title) > 10;


SELECT release_year, AVG(budget) AS avg_budget, AVG(gross) AS avg_gross
FROM films
WHERE release_year > 1990
GROUP BY release_year
HAVING AVG(budget) > 60000000;

Join

예를 들어서 설명하자면, films 테이블에서 영화 ID를 가지고 IMDB 정보인 reviews 테이블을 조회하고 싶을때,
SQL에서는 Join이라는 개념으로 가져온다.

1
2
3
4
5
SELECT title, imdb_score
FROM films
JOIN reviews
ON films.id = reviews.film_id
WHERE title = 'To Kill a Mockingbird';

‘To Kill a Mockingbird’라는 영화의 IMDB 점수를 가져온다.
조인에 대해서는 다음에 더 정리, Group By와 섞어쓰는것 대해서 더 공부를 해야겠다.