【OracleSQL】COUNT関数
社内研修の練習問題での失敗からCOUNT関数の使い方を復習しようと思います。
COUNT関数
Oracle SQLの'COUNT関数'には3つの書式があります。
1.COUNT(*)
SELECT文の基準を満たす全ての表を戻します。
SELECT COUNT(*)
FROM table_name;
重複する行および、いずれかの列にNULL値を含み行も含まれます。
2.COUNT(式)
COUNT(式)では、式によって指定される列にあるNULL以外の行を戻します。
SELECT COUNT(column_name)
FROM table_name;
このクエリは、指定した列の非NULL値の数を返します。
3.COUNT(DISTINCT 式)
COUNT(DISTINCT 式)では、式がNULL以外で重複した値を除外した値の数を戻します。
SELECT COUNT(DISTINCT column_name)
FROM table_name;
DISTINCTキーワードを使用することで、列中の重複した値をカウントから除外することができます。
使用例
社内研修の練習問題にて自分が認識を誤り間違えた問題から例として残します。
問題
今は使われていない部門データの件数を確認します。
DEPARTMENTSテーブルに、EMPLOYEESテーブルで使用されていない部門IDが何件存在するでしょうか?
誤解答
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
MINUS
SELECT DEPARTMENT_ID
FROM EMPLOYEES;
DEPARTMENT_ID
-------------
10
20
:
:
19行選択されました。
上記では、MINUS
演算子を使用し件数を求めていますが、求められていない中身まで出力されてしまいます。今回は件数を求めることがメインになるので適していません。
今回の結果が19件だったためそこまでですが、結果が何千件とあるものを表示するには向きません。
MINUSとは
Oracle SQLのMINUS演算子は、2つのSELECT文の結果セットから一方の結果セットに存在するが他方には存在しない行を返すために使用されます。
件数を出力する解答例
SELECT COUNT(DEPARTMENT_ID)
FROM DEPARTMENTS
WHERE DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID
FROM EMPLOYEES);
COUNT(DEPARTMENT_ID)
--------------------
19
上記のように、COUNT
関数を使用し副問合せ(サブクエリ)にして合わせることで中身は表示されずに件数だけ求めることができます。
副問合せ(サブクエリ)とは
Oracle SQLの副問合せ(サブクエリ)は、他のSQL文の中で使用されるSELECT文のことを指します。副問合せは、主要なSQL文が必要とするデータを提供するために使用されます。
SELECT column_name(s)
FROM table_name
WHERE column_name operator (SELECT column_name(s)
FROM table_name
WHERE condition);
副問合せは、WHERE句やFROM句、SELECT句など、SQL文のさまざまな部分で使用することができます。
MINUSを使用した別解答
先ほどの誤解答で使用したMINUS
を使用したパターンも可能です。
SELECT COUNT(*)
FROM (SELECT DEPARTMENT_ID
FROM DEPARTMENTS
MINUS
SELECT DEPARTMENT_ID
FROM EMPLOYEES);
感想
OracleSQLの勉強を始め、どのパターンでどの関数を使うのかがまだまだですが、まずは「こんな関数があったな~」くらいの認識で探し出す引き出しだけ覚えることに専念し、数をこなしてよく使用するものなどを覚えていければと思います。
今回のように答えが複数ある中でよりシンプルなものを探し出せるよう頑張ります。
参考
Oracle Database 10g 入門 SQL基礎Ⅰ
Discussion