SQLをより賢く使うための12のヒント

文:Susan Harkins  翻訳校正:石橋啓一郎
2009-06-30 08:00:00
  • このエントリーをはてなブックマークに追加

4: 必要なものだけを抽出する

 SELECT句でデータを抽出する際、アスタリスク(*)を使いたいと思うだろうが、本当にすべてのカラムを抽出する必要がある場合以外には使うべきではない。抽出するデータが多いほど、アプリケーションの実行速度は遅くなる。性能を最適化するためには、必要なカラムだけを抽出することだ。

5: さまざまな集計関数

 集計関数はSQLでもVBAでもサポートされているが、それらはまったく同じものではない。それらの関数は置き換え可能ではないが、どちらか一方を使える人は多い。表Aでは、Jet SQLとTransact-SQLのそれぞれのコンテクスト内での集計関数を比較している。

表A

T-SQL Jet VBA 説明 Null値を対象とするか
Avg Avg DAvg 指定した値の集合の平均値を返す Null値を除外
Count Count DCount 指定されたカラムのNull値ではない値の数を計算する Null値を除外
Count(*) Count(*) DCount(*) レコード数を計算する Null値も含める
Sum Sum DSum 指定されたカラムの値を合計する Null値を除外
Min Min DMin 最小値を返す Null値を除外
Max Max DMax 最大値を返す Null値を除外
First 指定されたカラムの最初のレコードの値を返す Null値も含める
Last 指定されたカラムの最後のレコードの値を返す Null値も含める
StDev StDev DStDev 標本標準偏差を返す Null値を除外
StDevP StDevP DStDevP 母標準偏差を返す Null値を除外
Var Var DVar 標本分散を返す Null値を除外
VarP VarP DVarP 母分散を返す Null値を除外

 SQLの集計関数を使える時には、VBAの定義域集計関数は使わないこと。VBAの定義域集計関数を使わなくてはならない場合は、どうしてもVBAの定義域集計関数を使わなくてはならない場合には、最善の性能を得るために、対象となるカラムにインデックスを作成しておくべきだ。SQLのGROUP BYではNull値は除外されないが、ほとんどのSQL集計関数はNull値を評価しないことに注意すること。もしNull値も評価対象としたいのであれば、それを式の中で指定する必要がある。

6: GROUP BYの注意点

 SQLのGROUP BY句は、データのグループ化の方法を定義するものだ。GROUP BY句を使用する場合に覚えておかなくてはならないことは、グループを定義するカラムあるいはそのグループのデータを集約するカラムだけを含めるということだ。つまり、GROUP BYには関係のないデータを指定することはできない。たとえば、特定の日付にいくつの注文があったかを知りたければ、次のようなステートメントを使えばよいだろう。

SELECT OrderDate, Count(OrderID) 

FROM Orders

GROUP BY OrderDate

 このクエリは、各日付ごとに1つのレコードを返す。各レコードには、日付とその日付に受けた注文の数が示されている。他のカラムを含めることはできない。

 GROUP BYはさまざまな形を取る。SELECT句の中で、グループ化するカラムを指定する必要はない。たとえば、上記のクエリからOrderDateを省略してもよく、その場合それぞれの日付の注文の数の値だけが返されることになる(ただし、その結果はあまり意味のないものだろう)。つまり、GROUP BYで指定したカラムがデータソースの中にありさえすればよく、SELECT句の中で指定されていなくてもエラーは生じない。その一方で、SELECT句でカラムを参照したら、そのカラムはGROUP BY句か集計関数の中に含める必要がある。たとえば、次のステートメントは、Freight(輸送費)カラムが集計関数にもGROUP BY句にも使われていないため、動作しない。

SELECT OrderDate, Count(OrderID) AS TotalForDate, Freight

FROM Orders

GROUP BY OrderDate

 実際には、このような形でカラムを指定しようとすることに意味はない。もしFreight(輸送費)のデータをGROUP BYのコンテクスト内に含めたいのであれば、たとえば次のように輸送費の値を集約した数値が必要なはずだ。

SELECT OrderDate, Count(OrderID) Max(Freight) 

FROM Orders

GROUP BY OrderDate

 Jet SQLではメモ型(Memo)やOLEオブジェクト型(OLE Object)のカラムをグループ化することはできない。それに加え、これは当然のことだが、GROUP BY句をUPDATEステートメントで使うことはできない。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]