SQLアタマアカデミー
第4回 行か列か,それが問題だ~スカラサブクエリの使い方 (1)スカラ値とは何か
はじめに
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 | マーク |
サブクエリが返す値は,通常はテーブル,つまり複数行のレコードです。これは明らかに非スカラ値です。しかし,一定の条件を加えることで,サブクエリの戻り値をスカラ値にコントロールすることができます。この場合のサブクエリをスカラサブクエリと呼ぶわけです。そしてこのとき,サブクエリをスカラ値とまったく同じように式の内部で扱うことができるため,応用が広がっていくのです。
それでは,さっそくスカラサブクエリを使ってみましょう。
- 注1)
- 「スカラー値」と伸ばして表記することもあります。
SQLアタマアカデミー
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (5)集合指向と手続き型
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (4)OLAP関数と集約関数を組み合わせる
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (3)OLAP専用関数
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (2)OLAP関数の基本構文
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (1)OLAP関数とは何か
- 第10回 結合大全 (5)非等値結合
- 第10回 結合大全 (4)自己結合
- 第10回 結合大全 (3)外部結合
- 第10回 結合大全 (2)内部結合
- 第10回 結合大全 (1)クロス結合

