SELECT {컬럼 [AS 별칭] ... , 그룹함수(컬럼)} FROM 테이블
[WHERE 검색조건]
[GROUP BY 컬럼]
[ORDER BY 컬럼 [정렬옵션]]
SELECT deptno, name FROM professor ORDER BY deptno;
+--------+--------+
| deptno | name |
+--------+--------+
| 101 | 김도훈 |
| 101 | 성연희 |
| 101 | 이만식 |
| 101 | 전은지 |
| 102 | 염일웅 |
| 102 | 권혁일 |
| 201 | 이재우 |
| 202 | 남은혁 |
+--------+--------+
학과 번호로 그룹을 형성하면 교수의 이름은 어떻게 처리해야 할까?
GROUP BY 절에 명시되지 않은 컬럼은 반드시 집계함수를 사용해야한다.
SELECT deptno, name FROM professor GROUP BY deptno;
SELECT deptno, COUNT(name) FROM professor GROUP BY deptno;
+--------+-------------+
| deptno | COUNT(name) |
+--------+-------------+
| 101 | 4 |
| 102 | 2 |
| 201 | 1 |
| 202 | 1 |
+--------+-------------+
에러
SELECT deptno, COUNT(*), COUNT(comm) FROM professor GROUP BY deptno ;
+--------+----------+-------------+
| deptno | COUNT(*) | COUNT(comm) |
+--------+----------+-------------+
| 101 | 4 | 2 |
| 102 | 2 | 1 |
| 201 | 1 | 0 |
| 202 | 1 | 1 |
+--------+----------+-------------+
*값과 comm 컬럼값이 다른 이유는 컬럼은 null값 제외하기 때문이다.SELECT {컬럼 [AS 별칭] ... , 그룹함수(컬럼)} FROM 테이블
[WHERE 검색조건]
[GROUP BY 컬럼1, 컬럼2, ..., 컬럼n]
[ORDER BY 컬럼 [정렬옵션]]
SELECT deptno, grade, COUNT(*), AVG(weight) FROM student GROUP BY deptno, grade;
+--------+-------+----------+-------------+
| deptno | grade | COUNT(*) | AVG(weight) |
+--------+-------+----------+-------------+
| 101 | 4 | 2 | 82.0000 |
| 101 | 1 | 2 | 62.0000 |
| 101 | 3 | 1 | 88.0000 |
| 101 | 2 | 3 | 56.0000 |
| 102 | 2 | 1 | 48.0000 |
| 102 | 4 | 1 | 92.0000 |
| 102 | 1 | 1 | 68.0000 |
| 102 | 3 | 1 | 70.0000 |
| 201 | 1 | 3 | 65.3333 |
| 201 | 2 | 1 | 51.0000 |
+--------+-------+----------+-------------+
SELECT {컬럼 [AS 별칭] ... , 그룹함수(컬럼)} FROM 테이블
[WHERE 검색조건]
[GROUP BY 컬럼1, 컬럼2, ..., 컬럼n]
[HAVING 검색조선]
[ORDER BY 컬럼 [정렬옵션]]
*)의 결과가 4이하인 데이터도 모두 조회된다.SELECT grade, COUNT(*), AVG(height), AVG(weight) FROM student HAVING COUNT(*) > 4 ORDER BY height DESC;
에러. 별칭을 사용해야함
*) 의 결과가 4보다 큰 데이터만 조회되었다.SELECT grade, COUNT(*), AVG(height) avg_height, AVG(weight) avg_weight FROM student GROUP BY grade HAVING COUNT(*) > 4 ORDER BY avg_height DESC;
+-------+----------+------------+------------+
| grade | COUNT(*) | avg_height | avg_weight |
+-------+----------+------------+------------+
| 1 | 6 | 175.3333 | 64.6667 |
| 2 | 5 | 164.8000 | 53.4000 |
+-------+----------+------------+------------+
2 rows in set (0.00 sec)
정렬조건에 SELECT에서 수행한 연산이나 집계 결과를 활용해야 할 경우
SELECT절에서 별칭을 명시하고 이를 참조하면
정렬 과정에서 발생하는 불필요한 추가 연산을
방지할 수 있다.
주의 : AVG(height) DESC라고 쓰지 않는다.
SELECT deptno, grade, COUNT(*), MAX(height), MAX(weight) FROM student GROUP BY deptno, grade HAVING COUNT(*) >= 3 ORDER BY deptno;
+--------+-------+----------+-------------+-------------+
| deptno | grade | COUNT(*) | MAX(height) | MAX(weight) |
+--------+-------+----------+-------------+-------------+
| 101 | 2 | 3 | 171 | 72 |
| 201 | 1 | 3 | 184 | 70 |
+--------+-------+----------+-------------+-------------+
2 rows in set (0.00 sec)
SELECT deptno, AVG(sal), MIN(sal), MAX(sal) FROM professor
GROUP BY deptno;
+--------+----------+----------+----------+
| deptno | AVG(sal) | MIN(sal) | MAX(sal) |
+--------+----------+----------+----------+
| 101 | 372.5000 | 210 | 500 |
| 102 | 345.0000 | 240 | 450 |
| 201 | 320.0000 | 320 | 320 |
| 202 | 400.0000 | 400 | 400 |
+--------+----------+----------+----------+
SELECT deptno, AVG(weight) avg_weight, COUNT(*) FROM student
GROUP BY deptno
ORDER BY avg_weight DESC;
+--------+------------+----------+
| deptno | avg_weight | COUNT(*) |
+--------+------------+----------+
| 102 | 69.5000 | 4 |
| 101 | 68.0000 | 8 |
| 201 | 61.7500 | 4 |
+--------+------------+----------+
SELECT deptno, COUNT(*) FROM professor
GROUP BY deptno
HAVING COUNT(*) <= 2
ORDER BY deptno;
+--------+----------+
| deptno | COUNT(*) |
+--------+----------+
| 202 | 1 |
| 201 | 1 |
| 102 | 2 |
+--------+----------+