SQL countについてまとめています。
SQL countの構文
SQLのcountはレコードの件数を数えます。count(*)とすると、対象レコードの全数を数えられます。
mysql> select count(*) from employees; +----------+ | count(*) | +----------+ | 300029 | +----------+ 1 row in set (0.17 sec)
SQL countの使い方
複数の条件で対象レコードの件数をcountする
count(カラム名=値 or null)という指定で、各条件にマッチしたレコードの件数を1つのSQLで取得できます。以下は、employees(社員)テーブルから、gender=M(男性)、gender=F(女性)、emp_no(社員番号)が400,000以上の件数を取得するSQLです。
mysql> select count(gender='M' or null),count(gender='F' or null), count(emp_no>400000 or null) from employees; +---------------------------+---------------------------+------------------------------+ | count(gender='M' or null) | count(gender='F' or null) | count(emp_no>400000 or null) | +---------------------------+---------------------------+------------------------------+ | 179974 | 120051 | 100000 | +---------------------------+---------------------------+------------------------------+ 1 row in set (0.26 sec)
【関連記事】
▶SQL countのサンプルコード集 複数テーブル件数を一発で取得する
重複を取り除いてcountする(distinct)
同じレコード(重複)を除いてカウントするには、distinctと組み合わせます。下記は、部署名(dept_name)ごとの、役職(title)の種類をカウントするSQLです。
SELECT dept_name, count(distinct title) FROM `titles` left join dept_emp on titles.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no group by dept_name order by dept_name +--------------------+-----------------------+ | dept_name | count(distinct title) | +--------------------+-----------------------+ | Customer Service | 7 | | Development | 7 | | Finance | 3 | | Human Resources | 3 | | Marketing | 3 | | Production | 7 | | Quality Management | 5 | | Research | 7 | | Sales | 3 | +--------------------+-----------------------+ 9 rows in set (3.58 sec)
【関連記事】
▶SQL distinctとcountを組み合わせてデータ種類をカウントする
集計区間を限定して件数をカウントする(over)
巨大データのデータ分析の目的で、overを使って集計区間を限定してレコード件数をカウントすることが可能です。
以下は、SQL Serverの例です。部署ごとに給与の最小、最大、平均、社員数を出力しています。
SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary ,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name; Name MinSalary MaxSalary AvgSalary EmployeesPerDept ----------------------------- --------------------- --------------------- --------------------- ---------------- Document Control 10.25 17.7885 14.3884 5 Engineering 32.6923 63.4615 40.1442 6 Executive 39.06 125.50 68.3034 4 Facilities and Maintenance 9.25 24.0385 13.0316 7 Finance 13.4615 43.2692 23.935 10 Human Resources 13.9423 27.1394 18.0248 6 : :
参考)COUNT (Transact-SQL) – SQL Server | Microsoft Docs
overは、最近では主要のDBMS(Oracle、MySQL、SQL Server、PostgreSQL)すべてが対応しています。
【関連記事】
▶SQL overは、分析関数 ビッグデータの集計区間を制限しレスポンスを上げる
まとめ
- count(*)は、対象のレコード件数をすべてカウントする
- count(カラム名=値 or null)で複数のカウントを1つのSQLで実行できる
- distinctと組み合わせることで重複を除外してカウントが可能