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 |