あなたのユーザーはSQLについてまったく知らないかも知れないが、その価値についてはしっている可能性が高い。SQLはあらゆる場所で使われており、学ぶのも簡単で、SQLを使ったソリューションは実装も簡単だ。SQLをあまり使わないにしろ、よく使うにしろ、SQLを賢く使えば、エラーを避け、性能を向上させることができる。
多くのSQLは各ベンダー独自の仕様を持っている。以下で紹介するヒントはJetとTransact-SQLで使えるものだが、ほとんどのSQL製品はこれに似ている。
1: AccessのSQLウィンドウでJet SQLを利用する
Accessユーザーは、クエリを作成するたびにSQLステートメントを作成している。ただ、彼らがそれを知らないだけだ。彼らが使っているクエリデザインウィンドウは、実際にはSQLを視覚的に表現したものだ。ほとんどのユーザーは、自分が必要とする適切なSQLステートメントを作ることはできないため、視覚的なインターフェースは助けになるが、これはあなたも便利に使えるものだ。もし頭の中だけでエラーのないSQLコードを作ることができないのであれば、このSQLウィンドウに助けてもらうといいだろう。
- クエリデザインウィンドウを使ってクエリを作成し、そのSQLウィンドウのコードを、VBAモジュールのコード内にコピーする。
- もしそのコードのクエリが、VBAの無意味なエラーメッセージを返すようであれば、そのSQLステートメントをSQLウィンドウにコピーして実行してみるとよい。Accessは通常、エラーに関してVBAよりもましな情報を返してくれる。
モジュールの中のSQLステートメントを、そのままSQLウィンドウにコピーしてはいけない場合もある。ステートメントに連結演算子や変数が含まれている場合、定義ステートメントの直後にDebug.Printステートメントを追加しておくとよい。そして、ステートメントのデバッグが必要な場合は、評価後のステートメントをイミディエイトウィンドウからコピーする。たとえば、次のコード中のステートメントには変数と連結演算子が含まれているため、そのままではSQLウィンドウで実行することはできない。
"SELECT * FROM " & tbl & " ORDER BY " & fld
しかし、このステートメントの後にDebug.Printステートメントを付けておけば、イミディエイトウィンドウから、次のような評価後の結果をコピーすることができる。
SELECT * FROM Employees ORDER BY HireDate
2: SQLの予約語
SQLにはキーワードなどのいくつかの予約語がある。カラム、テーブル、変数、あらゆるオブジェクトの名前には、これらの単語は使えない。SQLエンジンが予想していないコンテクストでこれらのキーワードが使われると、SQLエンジンは混乱しエラーになる -- あるいはもっとひどい場合には、正しくない結果が出る。
3: ALL、DISTINCT、DISTINCTROWの違い
SQLのSELECTステートメントは、ALL、DISTINCT、DISTINCTROWという3つの述語をサポートしている。デフォルトはALLで、指定された条件を満たすすべてのレコードを返す。DISTINCTは、返してくるカラムに含まれる値を1つだけに制限する。たとえば、次のステートメントを実行すると、LastNameの値1つにつき、1つのレコードしか返されない。
SELECT DISTINCT LastName
言い方を変えれば、もしJohn SmithとMary Smithにそれぞれ1つのレコードが存在する場合、上記のステートメントはSmithという名字(LastName)に関してどちらか1つのレコードしか返さない。ただし、DISTINCTは直後に指定されたカラムだけでなく、それ以降に指定されたすべてのカラムに対して適用される。つまり、次のステートメントを使った場合、John SmithとMary Smithのどちらについても1つのレコードを返す。これは、その2つのカラムを組み合わせれば、同じレコードは生成されないためだ。
SELECT DISTINCT LastName, FirstName
SELECT句で1つ以上のカラムが指定されている場合、返されたレコードの選択されたカラムの値の組み合わせは一意となる。
DISTINCTには、ユーザーが知っておくべき、いくつかの予想しにくい特徴がある。
- DISTINCTをアスタリスクと一緒に使ってはならない。カラムは名前で指定する必要がある。
- これは当然のことだが、DISTINCTを使ったクエリの結果は更新することができない。
DISTINCTがカラムに対して使われるのに対し、DISTINCTROWはレコードに対して使われる。(Transact-SQLではDISTINCTROWはサポートされていない)。この述語には、以下に挙げるようないくつかの独自の制約があり、これがトラブルシュートが困難なエラーの原因になる場合もある。
- クエリにテーブルが1つしかない場合、エンジンはDISTINCTROWを無視する。
- 使用するすべてのテーブルのすべてのカラムが指定された場合、エンジンはDISTINCTROWを無視する。
「IT業界を生き抜く秘密10箇条」 のバックナンバー
-
Window 7で使える優秀(+無料)な7つのアプリケーション
Windows 7を導入したという人も、かなり出てきたのではないだろうか。この記事では、Windows 7にインストールして使えるお勧めのソフトウェアを紹介する。 -
Windows 7用のセキュリティ対策ソフトウェア10選
-
Android携帯がiPhoneに優る10の理由
-
困った上司への対処法10選
-
ITプロジェクト失敗の6タイプ
- IT業界を生き抜く秘密10箇条 一覧へ »
企画特集
-
電力に"ふた"をする独自の省エネ機能とは!?
動的に電力割り当ても可能なHPの最新鋭ブレードに迫る -
グリー、3人のエンジニアが語る仕事への想い
連載第2話、元SIerに聞くリニューアルと開発の舞台裏 -
100万円で実現!中小企業の情報漏えい対策
中小企業の課題!?セキュリティ管理者不在でも大丈夫 -
大丈夫?あなたの会社のセキュリティ対策
中堅・中小企業のネットワーク・セキュリティを考える -
高まるiSCSIストレージへの注目度
ストレージシステムの4つの課題とiSCSI導入のメリット -
マネジメントの「コラム」と「コネタ」
今日のキーパーソンは誰? -
―エン・ジャパン厳選求人☆毎週更新―
ハンゲームの社長が語る・人材とサービスの在り方 -
企業ITシステムの企画、構築、運用のイロハ
戦略的なITシステムのために、今考えるべきポイント -
【最終警告】パンデミック対策特集
サービス品質を保証するためのリスクマネジメントとは -
急増するオンライン犯罪への解決策!
オンラインサービス保護ソリューション -
J-SOX法制定により内部統制の整備が急務に
重要性高まるActive Directoryの課題と対処法を公開中 -
VMware OEMベンダー6社を独占インタビュー
IBM、HP、NEC、DELL、日立、富士通のVMwareの取り組み -
容量制限によるメール消去は一切無し!
全てを保存するメールセキュリティSaaSが登場
ZDNet Japan イベント
- 開催日:2009年11月26日(木)
- イベント一覧へ»
-
13. ソースチェック
この4分間のビデオでは、Intel Parallel Studioの一部であるIntel C++コ... -
14. OpenMP 3.0
この3分間のビデオでは、Intel Parallel Composerで利用可能なOpeMP 3.0...
