SQL 문법6 GROUP BY, HAVING, ORDER BY 문법

DIORJJ·2024년 1월 5일

SQL

목록 보기
6/13
post-thumbnail

SQL 5DAY

SQL 문법6 GROUP BY, HAVING, ORDER BY 문법

GROUP BY

집계함수 종류


실습문제

나의 풀이

1).
SELECT 학생ID, ROUND(AVG(성적), 1) AS 평균성적 -- 어떤걸 그룹화 해서 뽑는지 SELECT에 꼭써줘야한다.
FROM 성적표
GROUP BY 학생ID; 
-- GROUP BY 에서 학생ID별로 그룹해줬으니 SELECT 문에서도 똑같이 학생ID를 써줘야함.

2).
SELECT 직원ID, MAX(연봉) AS 최고, MIN(연봉) AS 최저
FROM 직원
GROUP BY 직원ID; -- 이거 굳이 안써도 된다. 모든 튜플을 하나의 그룹으로 판단한다.

SELECT MAX(연봉) AS 최고연봉, MIN(연봉) AS 최저연봉
FROM 직원;  -- 이게 정답.

3).
SELECT 소속반, COUNT(소속반) AS 반별인원 -- COUNT(*) 써도됨. 근데 이걸 왜 * 전체 범위로 해도 되는거니?
FROM 수강생정보
GROUP BY 소속반;

SELECT 소속반, COUNT(*) AS반별인원
FROM 수강생정보
GROUP BY 소속반;

나의 풀이

4).
SELECT 학생ID, AVG(성적)
FROM 성적표
WHERE 과목 = '영어' OR 과목 = '국어'
-- WHERE 과목 IN ('영어', '국어') 도 가능.
-- WHERE 과목  NOT IN ('수학') 도 가능.
-- WHERE 과목 != '수학' 이것도 가능.
GROUP BY 학생ID;

5).
SELECT 부서ID, SUM(연봉)
FROM 직원
GROUP BY 부서ID;

6).
SELECT A.직원ID, COUNT(B.연락처) -- 그룹화 해준걸 카운트 해준다.
FROM 직원 A, 직원연락처 B  -- 이것만 쓰면 카티션 조인 발생 (각테이블 행 갯수 곱)
WHERE A.직원ID = B.직원ID(+) -- JOIN 기준은 A 테이블 연락처 없는 사람도 나와야 하므로.
GROUP BY A.직원ID;  -- 이걸 기준으로 그룹화

-- JOIN 한게 어떻게 나오나 표좀 볼려고
SELECT A.직원ID, B.연락처
FROM 직원 A, 직원연락처 B  -- 이것만 쓰면 카티션 조인 발생 (각테이블 행 갯수 곱)
WHERE A.직원ID = B.직원ID(+);

-- 위 답을 ANSI문법으로 변경
SELECT A.직원ID, COUNT(B.연락처)
FROM 직원 A LEFT OUTER JOIN 직원연락처 B
ON (A.직원ID =  B.직원ID) -- JOIN 
GROUP BY A.직원ID; 

HAVING

나의 풀이

1).
SELECT 소속반, COUNT(소속반)
FROM 수강생정보
GROUP BY 소속반
HAVING COUNT(소속반) >= 3;

2).
SELECT 부서ID, MAX(연봉)
FROM 직원
GROUP BY 부서ID
HAVING MAX(연봉) = 7500;

3).
SELECT 학생ID, ROUND(AVG(성적),1) AS 평균성적
FROM 성적표
GROUP BY 학생ID
HAVING AVG(성적)IS NOT NULL;  --HAVING 에서 걸러서 마지막 진짜 원하는 출력은  SELECT 에서 출력해줌.

ORDER BY

예제코드

SELECT *
FROM 직원
-- ORDER BY 연봉; -- 오름차순 - ASC = 어센딩 오름차순이 디폴트 이다.
ORDER BY 연봉 DESC; -- 디센딩 약자. 오름차순 약자.  

SELECT 부서ID, 연봉 -- 이렇게 쓰면 출력 안됨. 하나씩 그룹으로 묶엇는데 연봉 2개씩 나올수가 없음.
FROM 직원
GROUP BY 부서ID;
--ORDER BY 연봉;


-- 또하나의 예
SELECT 부서ID, SUM(연봉)
FROM 직원
GROUP BY 부서ID
ORDER BY 연봉;  
-- 이러면 실행안됨. 그룹으로 묶이면 각 그룹 하나씩만 출력, SELECT문에서 합계연봉만 보고싶은데
-- 정렬은 마지막으로 실행되므로 어차피 그룹으로 묶인 연봉은 정렬 안된다고 생각하고 SUM으로 계산된 SUM(연봉)을 정렬해라.

-- 따라서 아래처럼 작성.
SELECT 부서ID, SUM(연봉) -- 난 합계된 연봉을 출력하고 싶어.
FROM 직원
GROUP BY 부서ID
ORDER BY SUM(연봉); -- 이리 작성하면 합계연봉이 정렬된 순서로 출력됨.


-- 그룹화된 부서별ID 순서로 정렬된 출력.
SELECT 부서ID
FROM 직원
GROUP BY 부서ID
ORDER BY 부서ID;


-- 아래처럼 작성 가능.
SELECT 직원ID , 이름 , 연봉 AS 직원들의연봉,
연봉 * 0.1 AS 보너스
FROM 직원
ORDER BY 직원들의연봉, 4;


0개의 댓글