😎

【OracleSQL】COUNT関数

2024/04/07に公開

社内研修の練習問題での失敗からCOUNT関数の使い方を復習しようと思います。

COUNT関数

Oracle SQLの'COUNT関数'には3つの書式があります。

1.COUNT(*)

SELECT文の基準を満たす全ての表を戻します。

COUNT(*)例
SELECT COUNT(*)
FROM table_name;

重複する行および、いずれかの列にNULL値を含み行も含まれます。

2.COUNT(式)

COUNT(式)では、式によって指定される列にあるNULL以外の行を戻します。

COUNT(式)例
SELECT COUNT(column_name)
FROM table_name;

このクエリは、指定した列の非NULL値の数を返します。

3.COUNT(DISTINCT 式)

COUNT(DISTINCT 式)では、式がNULL以外で重複した値を除外した値の数を戻します。

COUNT(DISTINCT 式)例
SELECT COUNT(DISTINCT column_name)
FROM table_name;

DISTINCTキーワードを使用することで、列中の重複した値をカウントから除外することができます。

使用例

社内研修の練習問題にて自分が認識を誤り間違えた問題から例として残します。

問題

今は使われていない部門データの件数を確認します。
DEPARTMENTSテーブルに、EMPLOYEESテーブルで使用されていない部門IDが何件存在するでしょうか?

誤解答

SQL文
SELECT DEPARTMENT_ID
FROM  DEPARTMENTS
MINUS
SELECT DEPARTMENT_ID
FROM  EMPLOYEES;
出力結果
DEPARTMENT_ID
-------------
           10
           20
            :
            :
19行選択されました。

上記では、MINUS演算子を使用し件数を求めていますが、求められていない中身まで出力されてしまいます。今回は件数を求めることがメインになるので適していません。
今回の結果が19件だったためそこまでですが、結果が何千件とあるものを表示するには向きません。

MINUSとは

Oracle SQLのMINUS演算子は、2つのSELECT文の結果セットから一方の結果セットに存在するが他方には存在しない行を返すために使用されます。

件数を出力する解答例

SQL文
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