-
[SQLite] 그룹화Software/SQLite 2017. 8. 21. 01:56반응형
데이터 그룹화
만약 현재 등록된 차량들의 수를 각 브랜드 별로 나타낸다고 했을 때 WHERE절을 이용하여 결과값을 도출하고자 한다면 브랜드의 수만큼 질의를 만들어야 할 수밖에 없다.
예) SELECT count(*) FROM cars WHERE brand = 'BMW';
그러나 GROUP BY를 사용하면 이런 문제를 매우 간단하게 해결 가능하다. GROUP BY 뒤에 그룹화 시킬 column 명을 적어 주면 해당 column별로 그룹화를 시킨 결과값을 반환한다. 아래의 그 예를 보면 더욱 더 쉽게 이해가 가능하다.
sqlite> SELECT brand, count(*) FROM cars GROUP BY brand;
brand count(*)
---------- ----------
Audi 1
BMW 2
Benz 2
Hyundai 1
Kia 4
GROUP BY 절에서 사용할 수 있는 구문은 SELECT 문에서 조회한 컬럼명이나 이를 이용한 식 형태로 이루어져야 한다. 또한 NULL값 역시 하나의 그룹으로서 조회 된다는 것을 유의해야 한다.
또한 GROUP BY 절에서 명시적인 컬럼명을 적는 대신 SELECT 문의 조회 컬럼의 상대적인 위치인 숫자를 통해서도 그룹화할 컬럼을 지정할 수 있다.
sqlite> SELECT brand, count(*) FROM cars GROUP BY 1;
brand count(*)
---------- ----------
Audi 1
BMW 2
Benz 2
Hyundai 1
Kia 4
SELECT 구문에 AS문을 사용한 경우 GROUP BY 절에서 해당 별칭을 그대로 사용해서 그룹화 할 수 있다.
sqlite> SELECT brand AS BR, count(*) FROM cars GROUP BY BR;
BR count(*)
---------- ----------
Audi 1
BMW 2
Benz 2
Hyundai 1
Kia 4
그룹이 하나 이상의 계층 구조를 가지고 있는 경우 GROUP BY 절에서 상위부터 순차적으로 컬럼을 입력해서 그룹화 할 수 있다.
sqlite> SELECT brand, price, count(*) FROM cars GROUP BY brand, price;
brand price count(*)
---------- ---------- ----------
Audi 1500000 1
BMW 1500000 1
BMW 1700000 1
Benz 1500000 1
Benz 1800000 1
Hyundai 1000000 1
Kia 1
Kia 500000 1
Kia 500000.356 1
Kia 1000000 1
그룹 필터링과 정렬
기본적으로 GROUP BY절과 WHERE절은 함께 사용이 가능하다.
sqlite> SELECT brand, count(*)
...> FROM cars
...> WHERE brand IN ('BMW', 'Kia')
...> GROUP BY brand;
brand count(*)
---------- ----------
BMW 2
Kia 4
그러나 WHERE절의 경우 개별 레코드에 대한 필터링만을 수행하기 때문에 만약 특정 조건을 만족하는 그룹만을 선별해서 조회하고 싶다고 한다면 WHERE절을 사용할 수 있다. 대신 이 때는 HAVING절을 이용해서 위와 같은 특정 조건을 필터링 할 수 있다.
sqlite> SELECT brand, count(*)
...> FROM cars
...> GROUP BY brand
...> HAVING count(*) >= 2;
brand count(*)
---------- ----------
BMW 2
Benz 2
Kia 4
물론 WHERE절과 HAVING절은 같이 사용 가능하다. WHERE절은 레코드가 그룹화되기 전에 개별 레코드에 대한 조건식을 수행하고, HAVING절은 데이터가 그룹화된 이후에 조회 조건식을 수행한다.
sqlite> SELECT brand, count(*)
...> FROM cars
...> WHERE brand IN ('BMW', 'Kia')
...> GROUP BY brand
...> HAVING count(*) >= 3;
brand count(*)
---------- ----------
Kia 4
위의 예를 보면 WHERE절을 통해 데이터 그룹화 전 brand가 'BMW', 'Kia'인 그룹을 먼저 필터링 한 후 해당 그룹내에서 HAVING절의 조건식을 만족하는 값을 필터링하는 것을 알 수 있다.
반응형'Software > SQLite' 카테고리의 다른 글
[SQLite] 기본키 (Primary Key) (0) 2017.09.16 [SQLite] 관계형 데이터베이스 (0) 2017.09.02 [SQLite] 내장함수 - 2 (0) 2017.08.20 [SQLite] 내장 함수 - 1 (0) 2017.08.14 [SQLite] Record 수정 및 삭제 (0) 2017.08.09 댓글