SQLのcount関数に条件指定する方法についてまとめています。
countはレコード数を取得する関数ですが、引数内で条件を指定し、1クエリで複数条件の件数を取得することが可能です。
count関数の引数に条件指定するサンプル
MySQLとPostgreSQLでは、count関数に3値論理式を指定することで、条件に合致したレコードのみをカウントすることが可能です。
select count(col1='Y' or null) from table;
テーブル「table」のカラム col1の内容が「Y」のレコードのみを数えるSQLです。count関数は、NULLではないレコードの件数を数えます。
col1=’Y’の場合は、TRUE or null=TRUE、’Y’以外の場合は、False or null=NULLとなるため、col1=’Y’の件数がカウントされます。count(col1=’Y’)のみだと、NULLではない全件のカウントを取得します。なお、count(*)は、NULLではない全件をカウントするための特殊な指定方法です。
MySQLでcountに条件式を指定する
実際に、MySQLで条件指定したcount関数を使ってSQLを実行してみましょう。
/* employeesテーブルから10件取得 */ 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) /* employeesテーブルの件数を取得 */ mysql> select count(*) from employees; +----------+ | count(*) | +----------+ | 300024 | +----------+ 1 row in set (0.09 sec) /* 下記指定だと、テーブル全件数の取得となる */ 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)
MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3.4.8 行のカウント
PostgreSQLでcount関数に条件を指定する
PostgreSQLでも、同様にcount()内に条件式を指定することが可能です。
下記のSQLは、actorテーブルから、first_nameカラムの1文字目がNで始まるレコードの件数を取得します。
dvdrental=# select * from actor where first_name like 'N%'; actor_id | first_name | last_name | last_update ----------+------------+-----------+------------------------ 2 | Nick | Wahlberg | 2013-05-26 14:47:57.62 44 | Nick | Stallone | 2013-05-26 14:47:57.62 50 | Natalie | Hopkins | 2013-05-26 14:47:57.62 166 | Nick | Degeneres | 2013-05-26 14:47:57.62 (4 rows) dvdrental=# select count(first_name like 'N%' or null) from actor; count ------- 4 (1 row)
なお、count関数に渡す条件は、where文で書き換えが可能です。
dvdrental=# select count(*) from actor where first_name like 'N%'; count ------- 4 (1 row)
特に理由がなければ、可読性を考えて条件はwhere句で指定するのが良いでしょう。単一のSQLで複数の条件のレコードをカウントする場合などは、count関数の引数に条件式を指定するとすっきり記述することが可能です。
dvdrental=# select count(first_name like 'N%' or null), count(last_name like 'B%' or null) from actor; count | count -------+------- 4 | 22 (1 row)
まとめ
- count関数の引数に条件式の指定が可能。
- count関数の条件式は、whereの条件指定に書き換えることができる。
- 1つのSQLで複数条件のcountの値を取得する場合は、count関数の条件式が役立つ。