SQL HAVING 句
1. SQL HAVING 句
HAVING 句は、集計関数(Aggregate Functions)に基づいた結果セットをフィルタリングするために使用されます。
個々の行をグループ化する「前」にフィルタリングを行う WHERE 句とは異なり、HAVING 句は集計が実行された「後」にグループに対してフィルタリングを行います。
1.1 HAVING の構文
SELECT カラム1, 集計関数(カラム2), カラム3, ...
FROM テーブル名
WHERE 条件 -- グループ化前のフィルタリング
GROUP BY カラム1, カラム3
HAVING 条件 -- グループ化および集計後のフィルタリング
ORDER BY カラム名;2. デモ用データベース
以下は、Northwind サンプルデータベースの「Customers(顧客)」テーブルからの抜粋です。
| 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 |
3. SQL HAVING の使用例
次の SQL は、国ごとの顧客数を返しますが、顧客数が 5 人より多い国のみを抽出します。
実行例:
SELECT Country, COUNT(CustomerID) AS [顧客数]
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;次の SQL は、顧客数が 5 人より多い国を、件数の多い順(降順)にソートして返します。
実行例:
SELECT Country, COUNT(CustomerID) AS [顧客数]
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;4. デモ用データベース(Orders & Employees)
以下は、Northwind サンプルデータベースの「Orders(注文)」テーブルからの抜粋です。
| 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 |
こちらは「Employees(従業員)」テーブルの抜粋です。
| EmployeeID | LastName | FirstName | BirthDate | Photo | Notes |
|---|---|---|---|---|---|
| 1 | Davolio | Nancy | 1968-12-08 | EmpID1.pic | 教育背景には学士号が含まれます... |
| 2 | Fuller | Andrew | 1952-02-19 | EmpID2.pic | AndrewはBTSを取得しました... |
| 3 | Leverling | Janet | 1963-08-30 | EmpID3.pic | Janetは学士号を取得しています... |
5. HAVING のさらなる応用例
次の SQL は、10 件を超える注文を登録した従業員を抽出します。
実行例:
SELECT Employees.LastName, COUNT(Orders.OrderID) AS 注文数
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;次の SQL は、従業員「Davolio」または「Fuller」が、25 件を超える注文を登録したかどうかを返します。
実行例:
SELECT Employees.LastName, COUNT(Orders.OrderID) AS 注文数
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;