- MySQL 문법을 기준으로 서술한다.
ORDER BY
- 조회 결과를 특정 attribute(s) 기준으로 정렬하여 가져오고 싶을 때 사용한다.
- default 정렬 방식은 오름차순이다.
- 오름차순 정렬은 ASC로 표기한다.
- 내림차순 정렬은 DESC로 표기한다.
1
2
3
SELECT * FROM employee ORDER BY salary; -- 오름차순
SELECT * FROM employee ORDER BY salary DESC; -- 내림차순
SELECT * FROM employee ORDER BY dept_id ASC, salary DESC;
aggregate function
- 여러 tuple들의 정보를 요약해서 하나의 값으로 추출하는 함수
- 대표적으로 COUNT, SUM, MAX, MIN, AVG 함수가 있다.
- e.g. AVG(salary), MAX(birth_date)
- NULL 값들은 제외하고 요약 값을 추출한다.
1
SELECT COUNT(*) FROM employee; -- 임직원 수를 알고 싶을 때. 여기서 *(asterisk)는 tuple 자체를 의미
GROUP BY
1
SELECT W.proj_id, COUNT(*), MAX(salary), MIN(salary), AVG(salary) FROM works_on W JOIN employee E ON W.empl_id = E.id GROUP BY W.proj_id; -- 각 프로젝트에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고 싶을 때
- 관심있는 attribute(s) 기준으로 그룹을 나눠서 그룹별로 aggregate function을 적용하고 싶을 때 사용
- grouping attribute(s) : 그룹을 나누는 기준이 되는 attribute(s)
- grouping attribute(s)에 NULL 값이 있을 때는 NULL 값을 가지는 tuple끼리 묶인다.
HAVING
1
SELECT W.proj_id, COUNT(*), MAX(salary), MIN(salary), AVG(salary) FROM works_on W JOIN employee E ON W.empl_id = E.id GROUP BY W.proj_id HAVING COUNT(*) >= 7; -- 프로젝트 참여 인원이 7명 이상인 프로젝트들에 대해서 각 프로젝트에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고 싶을 때
- GROUP BY와 함께 사용한다.
- aggregate function의 결과값을 바탕으로 그룹을 필터링하고 싶을 때 사용한다.
- HAVING절에 명시된 조건을 만족하는 그룹만 결과에 포함한다.
SELECT 조회 Summary
1
2
3
4
5
6
SELECT attribute(s) or aggregate function(s) -- 실행 순서 : 6
FROM table(s) -- 1
[WHERE condition(s)] -- 2
[GROUP BY group attribute(s)] -- 3
[HAVING group condition(s)] -- 4
[ORDER BY attribute(s)]; -- 5
- select 쿼리에 각 절(phase)의 실행 순서는 개념적인 순서이다.
- select 쿼리의 실제 순서는 각 RDBMS에서 어떻게 구현했지는지에 따라 다르다.
- 성능을 위한 Optimizer가 실행 순서를 변경한다.