Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

GROUP BY … HAVING 절

설명

SELECT 문으로 검색한 결과를 특정 컬럼을 기준으로 그룹화하기 위해 GROUP BY 절을 사용하며, 그룹별로 정렬을 수행하거나 집계 함수를 사용하여 그룹별 집계를 구할 때 사용한다. 그룹이란 GROUP BY 절에 명시된 컬럼에 대해 동일한 컬럼 값을 가지는 레코드들을 의미한다.

GROUP BY 절 뒤에 HAVING 절을 결합하여 그룹 선택을 위한 조건식을 설정할 수 있다. 즉, GROUP BY 절로 구성되는 모든 그룹 중 HAVING 절에 명시된 조건식을 만족하는 그룹만 조회한다.

SQL 표준에서는 GROUP BY 절에서 명시되지 않은 컬럼(hidden column)을 SELECT 컬럼 리스트에 명시할 수 없지만, CUBRID는 문법을 확장하여 GROUP BY 절에서 명시되지 않은 컬럼도 SELECT 컬럼 리스트에 명시할 수 있다. CUBRID에서 확장된 문법을 사용하지 않으려면 only_full_group_by 파라미터 값을 yes로 설정해야 한다. 이에 대한 자세한 내용은 구문/타입 관련 파라미터를 참고한다.

구문

SELECT ...

GROUP BY { col_name | expr | positoin } [ ASC | DESC ],...

          [ WITH ROLLUP ][ ORDER BY NULL ][ HAVING <search_condition> ]

  • col_name | expr | position : 하나 이상의 컬럼 이름, 표현식, 별칭 또는 컬럼 위치가 지정될 수 있으며, 각 항목은 쉼표로 구분된다. 이를 기준으로 컬럼들이 정렬된다.
  • [ ASC| DESC ] : GROUP BY 절 내에 명시된 컬럼 뒤에 ASC 또는 DESC의 정렬 옵션을 명시할 수 있다. 정렬 옵션이 명시되지 않으면 디폴트는 ASC가 된다.
  • search_condition : HAVING 절에 검색 조건식을 명시한다. HAVING 절에는 GROUP BY 절 내에 명시된 컬럼, 별칭, 집계 함수에서 사용되는 컬럼 또는 GROUP BY 절에서 명시되지 않은 컬럼(hidden columns)을 참조할 수 있다.
  • WITH ROLLUP : GROUP BY 절에 WITH ROLLUP 수정자를 명시하면, GROUP BY된 컬럼 각각에 대한 결과 값이 그룹별로 집계되고, 모든 결과 행에 대한 결과 값이 마지막 행에 추가로 출력된다.
  • ORDER BY NULL : GROUP BY 절에 ORDER BY NULL 수정자를 명시하면, GROUP BY에 의한 정렬 오버헤드를 회피할 수 있다.
예제

--creating a new table

CREATE TABLE sales_tbl

(dept_no int, name VARCHAR(20) PRIMARY KEY, sales_month int, sales_amount int DEFAULT 100);

INSERT INTO sales_tbl VALUES

(201, 'George' , 1, 450),

(201, 'Laura'  , 2, 500),

(301, 'Max'    , 4, 300),

(501, 'Stephan', 4, DEFAULT),

(501, 'Chang'  , 5, 150),

(501, 'Sue'    , 6, 150),

(NULL, 'Yoka'   ,4, NULL);

 

--selecting rows grouped by dept_no with ORDER BY NULL modifier

SELECT dept_no, avg(sales_amount) FROM sales_tbl

GROUP BY dept_no ORDER BY NULL;

      dept_no  avg(sales_amount)

================================

         NULL               NULL

          201                475

          301                300

          501                133

 

--conditions in WHERE clause operate first before GROUP BY

SELECT dept_no, avg(sales_amount) FROM sales_tbl

WHERE sales_amount > 100 GROUP BY dept_no;

      dept_no  avg(sales_amount)

================================

          201                475

          301                300

          501                150

 

--conditions in HAVING clause operate last after GROUP BY

SELECT dept_no, avg(sales_amount) FROM sales_tbl

WHERE sales_amount > 100 GROUP BY dept_no HAVING avg(sales_amount) > 200;

      dept_no  avg(sales_amount)

================================

          201                475

          301                300

 

--selecting and sorting rows with using column alias

SELECT dept_no AS a1, avg(sales_amount) AS a2 FROM sales_tbl

WHERE sales_amount > 200 GROUP BY a1 HAVING a2 > 200 ORDER BY a2;

           a1           a2

==========================

          301          300

          201          475

 

--selecting rows grouped by dept_no with WITH ROLLUP modifier

SELECT dept_no AS a1, name AS a2, avg(sales_amount) AS a3 FROM sales_tbl

WHERE sales_amount > 100 GROUP BY a1,a2 WITH ROLLUP;

           a1  a2                             a3

================================================

          201  'George'                      450

          201  'Laura'                       500

          201  NULL                          475

          301  'Max'                         300

          301  NULL                          300

          501  'Chang'                       150

          501  'Sue'                         150

          501  NULL                          150

         NULL  NULL                          310