SQLアタマアカデミー

第4回 行か列か,それが問題だ~スカラサブクエリの使い方 (1)スカラ値とは何か

この記事を読むのに必要な時間:およそ 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 スカラ値と第一正規形の関係

すべてスカラ値=第一正規形

idname
001カーター
002ケント
003ジェニー
004ケリー
005マーク

非スカラ値を含む=第一正規形でない

idname
001カーター
002ケント
スーザン
003ジェニー
004ケリー
005
006
マーク

サブクエリが返す値は,通常はテーブル,つまり複数行のレコードです。これは明らかに非スカラ値です。しかし,一定の条件を加えることで,サブクエリの戻り値をスカラ値にコントロールすることができます。この場合のサブクエリをスカラサブクエリと呼ぶわけです。そしてこのとき,サブクエリをスカラ値とまったく同じように式の内部で扱うことができるため,応用が広がっていくのです。

それでは,さっそくスカラサブクエリを使ってみましょう。

注1)
「スカラー値」と伸ばして表記することもあります。

著者プロフィール

ミック

SI企業に勤務するDBエンジニア。主にデータウェアハウス業務に従事している。自身のサイト「リレーショナル・データベースの世界」でデータベースとSQLについての技術情報を公開している。『Web+DB Press』で「SQLアタマアカデミー」を連載中。

著書:『達人に学ぶ SQL徹底指南書』(翔泳社、2008)訳書:J.セルコ『SQLパズル 第2版』(翔泳社、2007)

SQLアタマアカデミー:サポートページ

コメント

コメントの記入