[SQL/Oracle] GROUP BY, ORDER BY, HAVING

오늘은 정말 자주 쓰이고 기본적이면서도 필수로 알아야하는 오라클/SQL의 GROUP BY, HAVING, ORDER BY절에 대해서 알아볼 것이다.

GROUP BY절


GROUP BY절부터 알아보자.

일반적으로 GROUP BY는 특정 그룹(포지션별, 팀별)별 데이터를 필요로 할 경우에 그룹함수와 함께 이용한다.

GROUP BY절 이용시 SELECT에 지정한 칼럼은 GROUP BY절에 모두 포함해야 한다.

SELECT [DISTINCT] 컬럼명 [ALIAS]

FROM 테이블명

[WHERE 조건식]

GROUP BY 컬럼이나 표현식;

그룹함수

그룹함수란 다중 행 함수의 일종으로 여러 행들의 그룹이 모여서 단 하나의 결과를 돌려주는 함수를 말하는데

WHERE절에서는 GROUP BY를 위해 사용하는 그룹함수를 절대 사용할 수 없다.

그룹함수

  1. COUNT(a) : a행(row)의 개수를 돌려준다.

  2. MAX(a) : a행(row)의 최대값을 돌려준다.

  3. AVG (a) : a행(row)의 평균값을 돌려준다.

사용 예시를 한번 본다면 아래는 선수들의 포지션별 평균키를 나타내는 쿼리문이다.

SELECT POSITION, AVG(HEIGHT)

FROM PLAYER

GROUP BY POSITION;

그 다음은 특정 팀 선수들의 포지션 별 인원이 얼마나 되는지 나타내주는 쿼리문이다.

SELECT POSITION, COUNT(PLAYER_NAME)

FROM PLAYER

WHERE TEAM_ID='K02'

GROUP BY POSITION;



HAVING절


그다음은 GROUP BY와 함께 쓰는 HAVING 절이다.

SELECT [DISTINCT] 컬럼명 [ALIAS]

FROM 테이블명

[WHERE 조건식]

GROUP BY 컬럼이나 표현식

HAVING 그룹조건식;

같은 조건절인 WHERE절과 HAVING절을 비교해보겠다.

WHERE절은 SELECT ~ FROM절에서 발췌된 데이터에 대한 제한조건을 부여하여 필요한 데이터만을 조회할 때 사용하는 조건절이다.

HAVING절은 그룹함수를 사용해 GROUP BY절을 사용할 때 그룹들에 대한 제한 조건이 필요하여 사용하는, 그룹에 대한 조건절이다.

위를 보면 SELECT의 조건은 WHERE절, GROUP BY절의 조건은 HAVING절이라는 것을 볼 수 있다.

그렇다면 HAVING절이 있을 때 수행되는 순서도 한번 알아보자

①WHERE : 발췌 대상 데이터가 아닌 것은 제거

②GROUP BY : 행들을 그룹화하고,

③GROUP FUNCTION : 그룹함수를 적용한다.

④HAVING : 마지막으로 그룹함수값의 조건에 맞는 것만 발췌하여 출력.



ORDER BY절


 SELECT [DISTINCT] 컬럼명 [ALIAS명]

 FROM 테이블명

 [WHERE 조건식]

 [GROUP BY 컬럼이나 표현식

 HAVING 그룹조건식]

 ORDER BY 칼럼이나 표현식[ASC 또는 DESC];

데이터 표출에 가장 중요하다고 볼 수도 있는 정렬이다.

아무리 유용한 데이터를 뽑아낸다고 해도 정렬되지 않은 데이터라면 사람이 해당 데이터를 이해하는데 많은 시간이 소모될 것이고 분석도 오래걸릴수밖에 없다.

이러한 불편함을 해소해줄 수 있는게 바로 ORDER BY절이다.

ORDER BY절은 조회된 결과의 데이터들을 정렬하여 보기 좋게 만들어준다.

여기서 ASC는 오름차순이고 DESC는 내림차순이다.

기본적으로 ORDER BY는 오름차순 정렬이되므로 ASC를 생략해도 된다.

ORDER BY 같은 경우에는 열의 이름 뿐 아니라 ALIAS를 써도 무방한데 이는 ORDER BY가 쿼리문 중에 가장 나중에 실행되는 쿼리문이기 때문이다.

또한 열의 숫자위치로 정렬하는 것도 가능함 여러 열을 기준으로 정렬하는 것 또한 가능하다.

기본 형태

SELECT * FROM table_name ORDER BY column_name;

ALIAS 사용

SELECT sal + comm AS TOTAL FROM emp ORDER BY TOTAL;

열의 숫자를 사용

SELECT * FROM table_name ORDER BY 3;

여러 열을 기준으로 사용

SELECT * FROM table_name ORDER BY 3,1 DESC;

Categories:

Updated: