発生しやすいエラー①



発生しやすいエラー①

SQLを作成し実行する過程では様々なエラーが発生します。ここでは、間違えやすいエラーとその対処法について説明します。

1.NULL値の検索

NULLの検索ですが、一番間違えやすいのは、’= NULL’により検索でしょう。次の例を見てみます。

支店表

SELECT * FROM 支店 WHERE 定休日 = NULL;

結果は以下のとおりとなります。

この場合は、’= NULL’ではなく、NULL述語を使用します。ただしいSQLは以下のとおりとなります。

SELECT * FROM 支店 WHERE 定休日 IS NULL;

結果は以下のとおりとなります。

2.文字列型の列を集計関数で実行

次は文字列型の列に対しての集計関数の利用です。ここも支店表を使います。

支店表

つぎのSQLを実行してみます。

SELECT SUM(支店名) 面積合計 FROM 支店;

結果は以下のとおりとなります。

このSQLは、支店表にある支店の店舗面積の合計を求めようとしています。しかし、支店名という文字列型の列を引数に指定しているため正しく集計されませんでした。正しくは以下のようにします。

SELECT SUM(店舗面積) 面積合計 FROM 支店;

結果は以下のとおりとなります。

3.WHERE句の中で集計関数を使用①

支店表を使います。以下のSQLを実行してみます。

SELECT 支店名 FROM 支店 WHERE 店舗面積 = MAX(店舗面積);

結果は以下のとおりとなります。

エラーとなった原因は、WHERE句の中で集計関数を使用使用したためです。正しくはサブクエリを使って以下のようにします。

SELECT 支店名 FROM 支店 WHERE 店舗面積 = (SELECT MAX(店舗面積) FROM 支店);

結果は以下のとおりとなります。

 

4.WHERE句の中で集計関数を使用②

地域表を使い、以下のSQLを実行します。

地域表

SELECT 地域,AVG(店舗面積) FROM 地域
WHERE AVG(店舗面積) < 700
GROUP BY 地域;

結果は以下のとおりとなります。

一般に、WHERE句とGROUP BY句を指定すると、検索条件が実行されてからグループ化が行われます。本来、集計関数は、グループ化が行われてから値を返すものです。このクエリでは、グループ化が行われる前に、検索条件の中で使われようとしたから正しく実行できませんでした。このような場合は、WHERE句を使わずにHAVING句を使用して条件指定を行います。正しくは以下のようにします。

SELECT 地域,AVG(店舗面積) FROM 地域
GROUP BY 地域
HAVING AVG(店舗面積) < 700;

結果は以下のとおりとなります。

5.通常の列名と集計関数を同時に指定した

地域表に対して以下のSQLを実行します。

SELECT 支店名,SUM(店舗面積) FROM 地域
WHERE 社員数 >= 100;

結果は以下のとおりとなります。

このSQLでは、社員数が100人以上の支店名と、その支店の店舗面積の合計を同時に求めようとしています。その為に、SELECT句に支店名列とSUM関数を一緒に指定してエラーとなっています。地域表には社員数>=100を満たす支店が3つあります。しかし、集計関数は結果を1つしか返しません。このように通常の列と、集計関数を同時に指定することはできません。
但し、GROUP BY句を使う場合は、通常の列と集計関数を同時に使うことができます。次のSQLをみてみます。

SELECT 地域,SUM(店舗面積) FROM 地域
GROUP BY 地域;

結果は以下のとおりとなります。

このSQLでは、支店の店舗面積の合計を地域ごとに集計しています。その為、GROUP BY句を使って地域毎に支店をグループ化し、12件の情報を4件のグループ化に集約したうえでグループ毎にSUM関数を実行して店舗面積の合計を求めています。このような使い方をすればSQLは正しい結果を返すことができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です