본문으로 바로가기

MySQL GROUP BY/HAVING

category 데이터베이스/MySQL 2018. 12. 23. 15:34

MySQL GROUP BY

GROUP BY절은 함수와 함께 사용 됩니다.

 

함수로는 COUNT MAX MIN SUM AVG가 있습니다.

 

결과를 하나 이상의 열로 그룹화하는게 GROUP BY절의 목적입니다.

 

형태는

GROUP BY 구문

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

 

이런식으로 쓰이게 됩니다.

 

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4

Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

 

이러한 테이블이 있다고 하면

 

각 나라별을 그룹화해서 나라별 고객 수를 알고싶다면 GROUP BY절을 씁니다.

 

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;

나라를 GROUP BY로 그룹화 한 후 고객 테이블에서 각 나라에 해당하는 고객ID의 수를 COUNT함수를

이용하여 파악 할 수 있습니다.

 

위 테이블대로라면 이렇게 나오겠죠.

 

COUNT(CustomerID) Country

1

Germany

2

Mexico

1

UK

1

Sweden

 

 

 

좀더 응용을 해서 앞서 배운 LEFT JOIN과 GROUP BY절을 합쳐서 쓴다면

 

일단 두 테이블은

 

OrderID CustomerID EmployeeID OrderDate ShipperID
10248 90 5 1996-07-04 3
10249 81 6 1996-07-05 1
10250 34 4 1996-07-08 2
ShipperID ShipperName
1 Speedy Express
2 United Package
3 Federal Shipping

이 두테이블을 ShipperID로 LEFT 조인을 시키고 ShipperName을 그룹화 하여 해당 주문 수를

 

Count함수를 이용하여 나타낼 수 있습니다.

 

SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROMOrders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;

이렇게 구문을 쓴다면?? 결과는??

 

즉 ShipperName을 그룹화 했습니다. 각 테이블의 ShipperID가 같은 것을 토대로 JOIN하여

 

테이블이 나온 상태에서 해당 그룹화한 ShipperName과 주문수를 출력하겠죠. 위테이블대로라면

 

ShipperName이 그룹화 된 주문 수를 출력합니다.

 

ShipperName NumberOfOrders
Federal Shipping 1
Speedy Express 1
United Package 1

 

HAVING 절은 WHERE 절에서 함수를 사용 할 수 없기 때문에 나오게 됐습니다.

 

즉 WHERE 절 대신에 HAVING절을 사용하여 함수도 사용 할 수 있는 형태입니다.

HAVING 구문

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

이러한 형태로 쓰입니다.

 

간단한 예를 보자면

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;

나라를 그룹화하여 고객 수를 출력하는데 고객 수가 5명 이상인(WHERE절을 HAVING절로 함수를 이용)

 

국가만 포함하는 형태입니다.

 

즉 WHERE 절 대신에 HAVING 절을 써서 함수와 같이 이용한걸 볼 수 있습니다.

 

좀더 복잡한 경우

 

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM (Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;

내부 조인 후 성이름 을 그룹화 하여 해당 성에 따라 주문 수가 10개 이상인 것을 등록한 직원을 나열합니다.

 

LastName NumberOfOrders
Buchanan 11
Callahan 27
Davolio 29
Fuller 20

 

대략 이런식으로 나오게 되겠죠 ??

 

특정 직원을 선택하고 싶다면 위 구문에서 조인 후 WHERE 절을 넣습니다.

즉 LastName이 Davolio 또는 Fuller인 Where 절을 넣습니다.

 

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;

이렇게 쓰고

 

LastName NumberOfOrders
Davolio 29

 

이런식으로 나오겠죠 ?

'데이터베이스 > MySQL' 카테고리의 다른 글

MySQL ANY/ALL  (1) 2018.12.24
MySQL EXISTS  (0) 2018.12.23
MySQL 자체 조인(self join)  (1) 2018.12.22
MySQL 전체 외부 조인(FULL OUTER JOIN)  (0) 2018.12.22
eXERD 설치  (0) 2018.12.21