SQL GROUP BY 문에 대해 알아야 할 모든 것

SQL GROUP BY 문에 대해 알아야 할 모든 것

관계형 데이터베이스의 대부분은 데이터를 필터링하고 테이블을 결합하는 데서 나옵니다. 이것이 우리가 처음에 그러한 관계를 나타내는 이유입니다. 그러나 현대 데이터베이스 시스템은 또 다른 가치 있는 기술인 그룹화를 제공합니다.





그룹화를 사용하면 데이터베이스에서 요약 정보를 추출할 수 있습니다. 결과를 결합하여 유용한 통계 데이터를 생성할 수 있습니다. 그룹화를 사용하면 그림 목록의 평균화와 같은 일반적인 경우에 대한 코드를 작성하지 않아도 됩니다. 그리고 더 효율적인 시스템을 만들 수 있습니다.





GROUP BY 절은 무엇을 합니까?

GROUP BY는 이름에서 알 수 있듯이 결과를 더 작은 집합으로 그룹화합니다. 결과는 그룹화된 열의 각 고유 값에 대해 하나의 행으로 구성됩니다. 몇 가지 공통 값을 공유하는 행이 있는 일부 샘플 데이터를 보고 사용법을 표시할 수 있습니다.





아이폰 화면 녹화는 소리를 녹음합니까?

다음은 레코드 앨범을 나타내는 두 개의 테이블이 있는 매우 간단한 데이터베이스입니다. 다음을 통해 이러한 데이터베이스를 설정할 수 있습니다. 기본 스키마 작성 선택한 데이터베이스 시스템에 대해 NS 앨범 테이블에는 기본 키가 있는 9개의 행이 있습니다. ID 이름, 아티스트, 출시 연도 및 판매에 대한 열 및 열:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

NS 예술가들 테이블은 훨씬 더 간단합니다. id 및 name 열이 있는 7개의 행이 있습니다.



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

이와 같은 간단한 데이터 세트만으로도 GROUP BY의 다양한 측면을 이해할 수 있습니다. 물론 실제 데이터 세트에는 훨씬 더 많은 행이 있지만 원칙은 동일하게 유지됩니다.

단일 열로 그룹화

각 아티스트에 대해 몇 장의 앨범이 있는지 알고 싶다고 가정해 보겠습니다. 전형적인 것으로 시작 선택하다 Artist_id 열을 가져오는 쿼리:





SELECT artist_id FROM albums

예상대로 9개 행이 모두 반환됩니다.

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

이 결과를 아티스트별로 그룹화하려면 구문을 추가하세요. GROUP BY 아티스트 ID :





SELECT artist_id FROM albums GROUP BY artist_id

다음 결과를 제공합니다.

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

결과 집합에는 7개의 행이 있으며, 이는 앨범 테이블. 각각의 독특한 아티스트 아이디 단일 행이 있습니다. 마지막으로 실제 개수를 얻으려면 다음을 추가하십시오. 세다(*) 선택한 열에:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

결과는 ID가 있는 아티스트에 대해 두 쌍의 행을 그룹화합니다. 2 그리고 6 . 각 데이터베이스에는 두 개의 앨범이 있습니다.

관련된: 초보자를 위한 필수 SQL 명령 치트 시트

집계 함수로 그룹화된 데이터에 액세스하는 방법

당신은 사용했을 수 있습니다 세다 기능 이전, 특히 세다(*) 위와 같은 형태. 집합의 결과 수를 가져옵니다. 이를 사용하여 테이블의 총 레코드 수를 얻을 수 있습니다.

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT는 집계 함수입니다. 이 용어는 여러 행의 값을 단일 값으로 변환하는 함수를 나타냅니다. 그들은 종종 GROUP BY 문과 함께 사용됩니다.

단순히 행 수를 계산하는 대신 그룹화된 값에 집계 함수를 적용할 수 있습니다.

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

위에 표시된 아티스트 2와 6의 총 판매량은 여러 앨범의 판매량을 합한 것입니다.

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

여러 열로 그룹화

둘 이상의 열을 기준으로 그룹화할 수 있습니다. 여러 열이나 표현식을 쉼표로 구분하여 포함하기만 하면 됩니다. 결과는 이러한 열의 조합에 따라 그룹화됩니다.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

이것은 일반적으로 단일 열로 그룹화하는 것보다 더 많은 결과를 생성합니다.

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

우리의 작은 예에서 두 개의 앨범만 출시 연도와 판매량이 동일합니다(1977년 28개).

유용한 집계 함수

COUNT 외에도 여러 기능이 GROUP에서 잘 작동합니다. 각 함수는 각 결과 그룹에 속한 레코드를 기반으로 값을 반환합니다.

  • COUNT()는 일치하는 레코드의 총 수를 반환합니다.
  • SUM()은 주어진 열의 모든 값을 합산한 합계를 반환합니다.
  • MIN()은 주어진 열에서 가장 작은 값을 반환합니다.
  • MAX()는 주어진 열에서 가장 큰 값을 반환합니다.
  • AVG()는 평균 평균을 반환합니다. SUM() / COUNT()와 동일합니다.

GROUP 절 없이 다음 함수를 사용할 수도 있습니다.

Windows XP를 Windows 7로 무료 업데이트
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

WHERE 절과 함께 GROUP BY 사용

일반 SELECT와 마찬가지로 WHERE를 사용하여 결과 집합을 필터링할 수 있습니다.

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

이제 아티스트별로 그룹화된 1990년 이후에 출시된 앨범만 있습니다. GROUP BY와 독립적으로 WHERE 절과 함께 조인을 사용할 수도 있습니다.

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

그러나 집계된 열을 기반으로 필터링하려는 경우:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

다음과 같은 오류가 발생합니다.

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

집계 데이터를 기반으로 하는 열은 WHERE 절에 사용할 수 없습니다.

HAVING 절 사용

그렇다면 그룹화가 발생한 후 결과 집합을 어떻게 필터링합니까? NS 가지고 절은 다음과 같은 필요성을 다룹니다.

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

HAVING 절은 GROUP BY 다음에 옵니다. 그렇지 않으면 본질적으로 WHERE를 HAVING으로 간단히 대체합니다. 결과는 다음과 같습니다.

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

WHERE 조건을 사용하여 그룹화하기 전에 결과를 필터링할 수 있습니다. 그룹화 후 필터링을 위해 HAVING 절과 함께 작동합니다.

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

우리 데이터베이스의 한 아티스트만이 1990년 이후에 두 개 이상의 앨범을 발표했습니다.

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

결과를 GROUP BY와 결합

GROUP BY 문은 SQL 언어의 매우 유용한 부분입니다. 예를 들어 콘텐츠 페이지에 대한 데이터 요약 정보를 제공할 수 있습니다. 많은 양의 데이터를 가져오는 훌륭한 대안입니다. 데이터베이스는 설계 자체가 작업에 최적이기 때문에 이러한 추가 작업 부하를 잘 처리합니다.

그룹화와 여러 테이블을 조인하는 방법을 이해하면 관계형 데이터베이스의 기능을 최대한 활용할 수 있습니다.

공유하다 공유하다 트위터 이메일 SQL 조인을 사용하여 한 번에 여러 데이터베이스 테이블을 쿼리하는 방법

SQL 조인을 사용하여 쿼리를 간소화하고 시간을 절약하며 SQL 고급 사용자가 된 느낌을 받는 방법을 알아보세요.

Excel에서 글머리 기호를 추가하는 방법
다음 읽기 관련 항목
  • 프로그램 작성
  • SQL
저자 소개 바비 잭(게시된 기사 58건)

Bobby는 거의 20년 동안 소프트웨어 개발자로 일한 기술 애호가입니다. 그는 게임에 열정적이며 Switch Player Magazine에서 리뷰 편집자로 일하고 있으며 온라인 출판 및 웹 개발의 모든 측면에 몰두하고 있습니다.

바비 잭이 참여한 작품 더보기

뉴스레터 구독

기술 팁, 리뷰, 무료 전자책 및 독점 거래에 대한 뉴스레터에 가입하십시오!

구독하려면 여기를 클릭하세요.