이 글은 다음 유튜브 영상을 참조해 작성하였습니다.
ORDER BY
- 조회 결과를 특정 attribute(s) 기준으로 정렬하여 가져오고 싶을 때 사용한다
- default 정렬 방식은 오름차순이다
- 오름차순 정렬은 ASC로 표기한다
- 내림차순 정렬은 DESC로 표기한다
ORDER BY 예제
- 임직원들의 정보를 연봉 순서대로 정렬해서 알고 싶다
mysql> SELECT *
-> FROM employee
-> ORDER BY salary;
기본 정렬 방식은 ASC 즉 오름차순 정렬이다.
내림차순 정렬 방식은 다음과 같이 위 쿼리문 마지막에 DESC키워드를 적어주면 된다.
mysql> select *
-> from employee
-> order by salary desc;
만약 각 부서 정보별로 연봉순으로 정렬해 조회하고 싶다면 다음과 같이 쿼리문을 작성하면 된다.
mysql> SELECT * FROM employee ORDER BY dept_id ASC, salary DESC;
aggregate function
- 여러 tuple들의 정보를 요약해서 하나의 값으로 추출하는 함수
- 대표적으로 COUNT, SUM, MAX, MIN, AVG 함수가 있다
- (주로) 관심 있는 attribute에 사용된다 e.g.) AVG(salary), MAX(birth_date)
- NULL 값들은 제외하고 요약 값을 추출한다
aggregate function 예제
- 임직원 수를 알고 싶다
mysql> SELECT COUNT(*) FROM employee;
- 프로젝트 2002에 참여한 임직원 수와 최대 연봉과 최소 연봉과 평균 연봉을 알고 싶다
mysql> SELECT COUNT(*), MAX(salary), MIN(salary), AVG(salary)
-> FROM works_on W JOIN employee E ON W.empl_id = E.id
-> WHERE W.proj_id = 2002;
GROUP BY
위 예제에서 다룬 쿼리문을 모든 프로젝트에 대해서 구하고 싶다면 다음과 같이 GROUP BY를 사용해 바꿀 수 있다.
mysql> 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;
GROUP BY 정리
- 관심있는 attribute(s) 기준으로 그룹을 나눠서 그룹별로 aggreate function을 적용하고 싶을 때 사용
- grouping attribute(s) : 그룹을 나누는 기준이 되는 attribute(s)
- grouping attribute(s)에 NULL값이 있을 때는 NULL값을 가지는 tuple끼리 묶인다
HAVING
위 예제를 통해 HAVING을 사용했다.
mysql> 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;
HAVING 정리
- GROUP BY와 함께 사용한다
- aggregate function의 결과값을 바탕으로 그룹을 필터링하고 싶을 때 사용한다
- HAVING절에 명시된 조건을 만족하는 그룹만 결과에 포함된다
예제
- 각 부서별 인원수를 인원수가 많은 순서대로 정렬해서 알고 싶다
mysql> SELECT dept_id, COUNT(*) AS empl_count FROM employee
-> GROUP BY dept_id
-> ORDER BY empl_count DESC;
- 각 부서별 - 성별 인원수를 인원 수가 많은 순서대로 정렬해서 알고 싶다
mysql> SELECT dept_id, sex, COUNT(*) AS empl_count FROM employee
-> GROUP BY dept_id, sex
-> ORDER BY empl_count DESC;
- 회사 전체 평균 연봉보다 평균 연봉이 적은 부서들의 평균 연봉을 알고 싶다
mysql> SELECT dept_id, AVG(salary)
-> FROM employee
-> GROUP BY dept_id
-> HAVING AVG(salary) < (
-> SELECT AVG(salary) FROM employee
-> );
- 각 프로젝트별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균 연봉을 알고 싶다
mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
-> FROM works_on W JOIN employee E ON W.empl_id = E.id
-> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
-> GROUP BY W.proj_id;
프로젝트 ID 기준으로 정렬을 하고 싶을 시 맨 끝 ORDER BY키워드를 추가하면 된다.
mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
-> FROM works_on W JOIN employee E ON W.empl_id = E.id
-> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
-> GROUP BY W.proj_id
-> ORDER BY W.proj_id;
- 프로젝트 참여 인원이 7명 이상인 프로젝트에 한정해서 각 프로젝트별로 프로젝트에 참여한 90년대생들의 수와 이들의 평균 연봉을 알고 싶다
mysql> SELECT proj_id, COUNT(*), ROUND(AVG(salary),0)
-> FROM works_on W JOIN employee E ON W.empl_id = E.id
-> WHERE E.birth_date BETWEEN '1990-01-01' AND '1999-12-31'
-> AND W.proj_id IN (SELECT proj_id FROM works_on
-> GROUP BY proj_id HAVING COUNT(*) >= 7 )
-> GROUP BY W.proj_id
-> ORDER BY W.proj_id;
select로 조회하기 요약
SELECT attribute(s) or aggregate function(s)
FROM table(s)
[WHERE condition(s)]
[GROUP BY group attribute(s)]
[HAVING group condition(s)]
[ORDER BY attribute(s)];
SELECT 실행 순서
6. SELECT attribute(s) or aggregate function(s)
1. FROM table(s)
2. [WHERE condition(s)]
3. [GROUP BY group attribute(s)]
4. [HAVING group condition(s)]
5. [ORDER BY attribute(s)];
- select쿼리에서 각 절(phrase)의 실행 순서는 개념적인 순서이다
- select쿼리의 실제 실행 순서는 각 RDBMS에서 어떻게 구현했는지에 따라 다르다
'DATABASE' 카테고리의 다른 글
SQL로 데이터 조회하기! join의 의미와 여러 종류의 join들을 쉽게 정리해서 설명합니다! (4) (0) | 2023.02.25 |
---|---|
SQL로 데이터 조회하기! NULL의 의미와 three-valued logic이 무엇인지 배워봅니다! (0) | 2023.02.25 |
SQL로 데이터 조회. subquery 다양한 예제, IN, EXISTS, ANY, ALL연산자 (2) (0) | 2023.02.24 |
SQL로 데이터 조회하기! select를 활용해서 데이터를 읽어오는 기본적인 문법과 관련 키워드 (1) (0) | 2023.02.24 |
SQL로 DB에 데이터를 추가(insert)하고 수정(update)하고 삭제(delete)하는 방법 (0) | 2023.02.23 |