본문 바로가기

DBMS

[DBMS] 11

GROUP BY

- ~별(예 : 포지션 별 평균 키)

- SELECT [컬럼명] FROM [테이블명]

   WHERE [조건식]

   GROUP BY [컬럼명]

   HAVING [조건식]

※ WHERE 절에서 조건을 처리할 수 있다면 반드시 WHERE 절에서 먼저 처리해준다.

(ex)

1. PLAYER 테이블에서 포지션 검색(NULL 제외)

SELECT "POSITION" FROM PLAYER
WHERE "POSITION" IS NOT NULL
GROUP BY "POSITION";

 

2. PLAYER 테이블에서 몸무게가 80 이상인 선수들의 평균 키가 180 이상인 포지션 검색

SELECT "POSITION" FROM PLAYER
WHERE WEIGHT >= 80 
GROUP BY "POSITION"
HAVING AVG(HEIGHT) >= 180;

 

3. PLAYER 테이블에서 TEAM_ID가 'K01'인 선수 중 POSITION이 'GK'인 선수

SELECT * FROM 
(
	SELECT * FROM PLAYER WHERE TEAM_ID = 'K01'
)
WHERE "POSITION" = 'GK';

SELECT * FROM PLAYER WHERE TEAM_ID = 'K01' AND "POSITION" = 'GK';

 

4. PLAYER 테이블에서 평균 키보다 작은 선수 검색

SELECT * FROM PLAYER
WHERE HEIGHT < (SELECT AVG(HEIGHT) FROM PLAYER);

 

5. PLAYER 테이블에서 전체 평균 키와 포지션별 평균 키 구하기

SELECT "POSITION", AVG(HEIGHT), (SELECT AVG(HEIGHT) FROM PLAYER) FROM PLAYER
WHERE "POSITION" IS NOT NULL
GROUP BY "POSITION";

 

결과

 

※ CASE문으로 변경(+ 평균키를 반올림하여 소수점 두번째 자리까지 출력)

SELECT
	ROUND(AVG(CASE "POSITION" WHEN 'GK' THEN HEIGHT END), 2) AS GK,
	ROUND(AVG(CASE "POSITION" WHEN 'DF' THEN HEIGHT END), 2) AS DF,
	ROUND(AVG(CASE "POSITION" WHEN 'FW' THEN HEIGHT END), 2) AS FW,
	ROUND(AVG(CASE "POSITION" WHEN 'MF' THEN HEIGHT END), 2) AS MF,	
	ROUND(AVG(HEIGHT), 2) AS "전체 평균"
FROM PLAYER;

 

결과

 

SUB QUERY

- FROM절 : IN LINE VIEW

- SELECT절 : SCALAR

- WHERE절 : SUB QUERY

(ex)

 Rollback을 수동으로 변경

1. PLAYER 테이블에서 NICKNAME이 NULL인 선수들은 정태민 선수의 닉네임으로 바꾸기

UPDATE PLAYER
SET NICKNAME = (SELECT NICKNAME FROM PLAYER WHERE PLAYER_NAME = '정태민')
WHERE NICKNAME IS NULL;

 

2. EMPLOYEES 테이블에서 평균 급여보다 낮은 사원들의 금액 10% 인상

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE SALARY < (SELECT AVG(SALARY) FROM EMPLOYEES);

 

3. PLAYER 테이블에서 평균 키보다 큰 선수들 삭제

DELETE FROM PLAYER
WHERE HEIGHT > (SELECT AVG(HEIGHT) FROM PLAYER);

'DBMS' 카테고리의 다른 글

[DBMS] 13  (0) 2021.11.06
[DBMS] 12  (0) 2021.11.05
[DBMS] 10  (0) 2021.11.03
[DBMS] 09  (0) 2021.11.02
[DBMS] 08  (0) 2021.11.01