SQLのレコード数取得についてまとめています。
SQLのレコード 数を取得する方法
レコードを取得する方法を、サンプルを交えて紹介します。MySQLのサンプルデータベースEmployeesを使用しています。
SQLのレコード数取得の基本
レコード数を取得するには、count()関数を使います。以下は、employeesテーブルの全件数を取得するサンプルです。
mysql> select count(*) from employees; +----------+ | count(*) | +----------+ | 300029 | +----------+ 1 row in set (0.17 sec)
【関連記事】
▶SQL countのサンプルコード集 複数テーブル件数を一発で取得する
SQLの重複を除いてレコード件数を取得する
SQLの重複を除いて件数をカウントするには、distinctを組み合わせます。以下のサンプルは、肩書(titles)テーブルから、部署ごとの肩書の種類の数を抽出すします。
titlesテーブルと、dept_emp(部署・社員紐付けテーブル)、departments(部署テーブル)をjoinで複数テーブル結合し、部署名(dept_name)で、group byによるグルーピングをおこなっています。
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を組み合わせてデータ種類をカウントする
重複しているレコード数をカウントする
先ほどとは逆に、重複しているレコード数をカウントするサンプルです。salaries(給与)テーブルに2件以上のデータを持つ(昇給を一度でもしたことのある)社員番号(emp_no)を抽出します。
having count(*) > 1 で、データが2件以上のデータに絞込をしています。
サブクエリなどを使うよりも、比較的クエリのレスポンスが速いです。
select emp_no, max(to_date) as to_date, count(*) from salaries b group by emp_no having count(*) > 1 limit 10; +--------+------------+----------+ | emp_no | to_date | count(*) | +--------+------------+----------+ | 10001 | 9999-01-01 | 17 | | 10002 | 9999-01-01 | 6 | | 10003 | 9999-01-01 | 7 | | 10004 | 9999-01-01 | 16 | | 10005 | 9999-01-01 | 13 | | 10006 | 9999-01-01 | 12 | | 10007 | 9999-01-01 | 14 | | 10008 | 2000-07-31 | 3 | | 10009 | 9999-01-01 | 18 | | 10010 | 9999-01-01 | 6 | +--------+------------+----------+ 10 rows in set (0.00 sec)
count()のカッコ内に条件を指定する
count()の対象条件は、select文のwhereに記述することができますが、count()の引数に指定することも可能です。
以下は、employees(社員)テーブルから、gender(性別)がM(男性)のデータの件数をカウントするサンプルです。
引数にgender=’M’と指定すると全件を取得してしまうので、gender=’M’ or null と指定する必要があります。
初見だと何を指定しているのかわかりづらいため、無用なバグを避けるためにもselect文のwhereに条件を記述するのが良いでしょう。
mysql> select count(gender='M') from employees; +-------------------+ | count(gender='M') | +-------------------+ | 300024 | +-------------------+ 1 row in set (0.04 sec) /* gender='M'の件数のみの指定 mysql> select count(gender='M' or null) from employees; +---------------------------+ | count(gender='M' or null) | +---------------------------+ | 179973 | +---------------------------+ 1 row in set (0.08 sec)
【関連記事】
▶SQL countの条件は引数内に記述できる 単クエリで複数の件数を取得する方法
まとめ
- SQLのレコード数カウントはcount()を使う
- distinctなどを組み合わせて、重複なし、重複した数のカウントが可能。
- count()の引数内に条件指定が可能だが、メリットは少ない