はじめに
SQLでテーブルのデータを操作するとき、データが行として表現されているか、列として表現されているかによって、同じ結果を得るにも、SQLの効率が大きく変わってきます。そのことは、前回の「列持ちテーブル」でも説明したとおりです。
このとき重要になるのが、行と列を変換する技術です。SQLはこのための便利な機能をいくつか用意しています。本稿では、その中でもCASE式と並んで重要なスカラサブクエリという機能を中心に解説します。
私たちがSQLにおいてサブクエリを使うとき、通常、構造的にはテーブルと同じであると考えています。だから、FROM句でテーブルの代わりにサブクエリを使うこともできます。違うのは、ただデータの保存形式だけであり、それはSQLの構文には影響を与えません。
しかし、実はサブクエリがテーブル、すなわち「関係」としての構造をとらない例外的なケースがひとつだけあります。それが今回取り上げるスカラサブクエリです。この技術は、基本的なイメージを理解することは難しくありません。そのため、本連載でもこれまで特に説明せずに使ってきました。しかし、特に相関サブクエリと組み合わせた場合の動作には注意が必要であり、また、うまく使うとなかなかおもしろい応用を持っています。今回は、この技術をマスターしましょう。
- 稼働環境
- Oracle 9i以降
- SQL Server 2005以降
- DB2
- Postgre SQL
- My SQL 5.0以降
筆者が実際に動作確認を行った環境は「Oracle10.2.0.1」「DB2 9.5」「SQL Ser ver 2005」「Postgre SQL 8.3」「My SQL 5.0」です。
スカラ値とは何か~単体と複合~
スカラサブクエリについての話を始める前に、まず「スカラ値(scalar value)」(注1)について解説しておきましょう。scalarは「単体」を意味します。別にデータベースの専門用語というわけではなく、広く数学やコンピュータ分野全般で使われます。最も簡単にイメージできるのは、プログラミング言語におけるchar、int、fl oatといった単一の値だけを保持するデータ型でしょう。反対に、配列、リスト、レコードなど複合的な値を保持するデータ型は、非スカラ型と呼ばれます。
SQLにおいても話は同じで、テーブルの特定の1行の特定の1列―誤解を恐れずにExcelライクな言葉を使えば「セル」―に保持される値をスカラ値と呼びます。なぜそうなるかというと、これはリレーショナルデータベースのテーブルが必ず第一正規形を満たさなければならないからです。反対に言うと、第一正規形とは「テーブルに含まれる値がすべてスカラ値であること」という制約なのです(図1)。
図1 スカラ値と第一正規形の関係
すべてスカラ値=第一正規形
id | name |
001 | カーター |
002 | ケント |
003 | ジェニー |
004 | ケリー |
005 | マーク |
非スカラ値を含む=第一正規形でない
id | name |
001 | カーター |
002 | ケント スーザン |
003 | ジェニー |
004 | ケリー |
005 006 | マーク |
サブクエリが返す値は、通常はテーブル、つまり複数行のレコードです。これは明らかに非スカラ値です。しかし、一定の条件を加えることで、サブクエリの戻り値をスカラ値にコントロールすることができます。この場合のサブクエリをスカラサブクエリと呼ぶわけです。そしてこのとき、サブクエリをスカラ値とまったく同じように式の内部で扱うことができるため、応用が広がっていくのです。
それでは、さっそくスカラサブクエリを使ってみましょう。