SQLのカウントについてまとめてます。
SQLでカウントするには、COUNT関数を使う
SQLでデータの件数をカウントするには、count関数を使います。
以下は、MySQLでの使用例。MySQLのサンプルデータベースEmployeesを使用しています。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.01 sec) mysql> select count(*) from employees; +----------+ | count(*) | +----------+ | 300025 | +----------+ 1 row in set (1.20 sec)
【関連記事】
▶SQL countの条件は引数内に記述できる 単クエリで複数の件数を取得する方法
テーブルemployees(社員)の全件数はcount(*)で取得できます。select文のwhere以降で条件指定をして絞り込んだ件数を取得することも可能。
また、count()のカッコ内に条件を記述することができます。その場合、記述の仕方にコツがあります。性別が男性(gender=’M’)の件数を取得するために「count(gender=’M’)」と記述しても全件を取得してきてしまいます。「count(gender=’M’ or null)」と指定する必要があるんですね。
mysql> select count(gender='M') from employees; +-------------------+ | count(gender='M') | +-------------------+ | 300025 | +-------------------+ 1 row in set (0.04 sec) mysql> select count(gender='M' or null) from employees; +---------------------------+ | count(gender='M' or null) | +---------------------------+ | 179974 | +---------------------------+ 1 row in set (0.08 sec)
グルーピング後の件数をカウントする
group byでグルーピングした件数の取得も可能です。以下は、departments(部署)、dept_emp(部署・社員紐付けテーブル)、titles(役職)テーブルをjoinし、各部署の役職の数をカウントした例です。
たとえば、Customer Serviceには7種類の役職があり、Salesには3種類の役職があることがわかります。
役職の数をカウントするため、count(distince title)で重複した役職名を1つと見なしてカウントしているんですね。
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 (2.94 sec)
【関連記事】
▶SQL countのサンプルコード集 複数テーブル件数を一発で取得する | 「ポテパンスタイル」
まとめ
- count(*)で件数の取得が可能。whereで条件指定もできる
- count()のカッコ内に条件を指定できるが、指定方法が特殊なので注意
- count(distinct カラム名)指定で、重複データを1個と見なしてカウントできる