SELECTを使用して答えを得る
著者:Melanie Caffrey
リレーショナル・データベースとSQLの基本に関するシリーズ記事のパート3
このシリーズ記事のパート2"リレーショナル・データのモデリングとアクセス"(Oracle Magazine、2011年11/12月)では、リレーショナル・データベースでデータ・エンティティ(表)を相互に関連付ける方法について紹介しました。論理モデルと物理的な実装において、意味のあるエンティティと十分な検討の上で選択されたデータ型を使用している場合に、さまざまなデータ・アクセス方法を選択できます。この記事では、問合せとも呼ばれるSQL SELECT文の目的と構造に焦点を当て、Oracle SQL DeveloperとOracle Application Expressを使用した問合せの作成方法と結果の参照方法について説明します(パート2で説明した概念についても簡単に確認しますが、パート2をお読みになってからパート3に進むことをお勧めします)。
一般的に、SQL問合せを記述する目的は、疑問に対する答えをデータベースから得ることです。たとえば、次のような疑問が考えられます。
これらの疑問に対する答えを得るために、SQL SELECT文を使用します。SELECT文は少なくとも2つの部分で構成されます。それは、SELECT構文のリストとFROM句です。SELECT構文のリストには、表示したい1つ以上の列または式を、1つ以上の表から選択して指定します(式については、このシリーズ記事で後ほど説明します)。また、FROM句には、必要な列データの取得元となる表を記述します。
SELECT文を記述する前に、関心のある情報がどの表に格納されているかを明らかにする必要があります。たとえば、すべての従業員の雇用日を把握する場合、まずは従業員情報がどの表に格納されているかを特定する必要があります。スキーマ・ダイアグラムを吟味して、従業員データがEMPLOYEEという表にあることが判明した場合は、次のようなSELECT文を使用できます。
リレーショナル・データベースの設計、概念、SQLに関する詳細の確認
Oracle Database概要11gリリース2 (11.2)
Oracle® Database SQL 言語リファレンス11g リリース1(11.1)
Oracle® SQL Developerユーザーズ・ガイド リリース2.1
その他の記事 SQLの基礎、パート1~2
Oracle Database, Express Edition 11g
SELECT first_name, last_name, hire_date
FROM employee
このSELECT構文のリストには、名(first name)、姓(last name)、雇用日(hire date)の3つの列が指定されています。この構文は、EMPLOYEE表に格納されているすべての従業員を対象としており、表の名前はFROM句で指定されています(SELECT構文のリストに複数の列を指定するには、列の名前をカンマで区切ります。読みやすくするために、各カンマの後に空白を挿入すると良いでしょう)。
この文を実行すると得られる結果セットは、リスト1のように、EMPLOYEE表のfirst_name列、last_name列、hire_date列にあるすべての値の一覧となります。
コード・リスト1:3つの列を指定したSELECT文の結果
SELECT first_name, last_name, hire_date
FROM employee
FIRST_NAME LAST_NAME HIRE_DATE
—————————— ——————————————— —————————————
Frances Newton 14-SEP-05
Emily Eckhardt 07-JUL-04
Donald Newton 24-SEP-06
Matthew Michaels 16-MAY-07
特定の表についてすべての列を表示する場合は、SELECT構文のリストにすべての列の名前を入力する代わりに、ワイルドカード文字のアスタリスク(*)を使用できます。以下に例を挙げます。
SELECT *
FROM employee
この文を実行すると、結果セットには、表に定義された順ですべての列が表示されます(リスト2を参照)。
コード・リスト2:すべての列を指定したSELECT文の結果
SELECT *
FROM employee
EMPLOYEE_ID FIRST_NAME LAST_NAME HIRE_DATE SALARY MANAGER DEPARTMENT_ID
——————————— —————————— ————————— —————————— —————— ——————— —————————————
37 Frances Newton 2005-09-14 75000
28 Emily Eckhardt 2004-07-07 100000
1234 Donald Newton 2006-09-24 80000 28 10
7895 Matthew Michaels 2007-05-16 70000 28 10
4 rows selected
この列の順序は、リスト3のようにDESCRIBEコマンドを実行したときの(またはOracle SQL Developerの「Columns」タブをクリックしたときの)表示順と同じです。
コード・リスト3:EMPLOYEE表の従業員情報を表示するためのDESCRIBEの結果
Name Null Type
——————————— ——————— ————————————
EMPLOYEE_ID NUMBER
FIRST_NAME VARCHAR2(30)
LAST_NAME VARCHAR2(30)
HIRE_DATE DATE
SALARY NUMBER(9,2)
MANAGER NUMBER
DEPARTMENT_ID NUMBER
7 rows selected
ワイルドカード文字のアスタリスクは、おもに非定型の問合せで使用してください。すなわち、プログラム・コード経由で問い合わせたことのないような答えをデータベースから得る必要がある場合に使用してください。プログラムのコード・ブロック内にSELECT文を記述する場合には(このシリーズの今後の記事で説明します)、SELECT構文のリスト内で対象の列の名前を指定することをお勧めします。
Oracle SQL DeveloperでのSELECT文の簡単な作成方法は、Connections NavigatorのTABLESノードからSQLワークシートに表の名前をドラッグ・アンド・ドロップすることです。この操作によって、編集可能なSELECT文がSQLワークシート内に自動的に作成されます。このSELECT構文のリストには、表のすべての列が含まれます。図1に、EMPLOYEE表をOracle SQL DeveloperのSQLワークシートにドラッグ・アンド・ドロップした結果を示します。
図1:EMPLOYEE表をSQLワークシートにドラッグ・アンド・ドロップした結果
図2は、SQLワークシートのアイコンです。
図2:SQLワークシートのアイコン・ツールバー
図2の一番左にある緑の矢印は、Execute Statementアイコンです。1つの文による結果を取得するには、その文上の任意の場所にカーソルを置き、このExecute Statementアイコンをクリックします。その結果は図3に示すResultsタブに表示されます。
図3:SQLワークシートのResultsタブ
このツールバーにある、用紙の画像に小さな緑の矢印を重ねたアイコンは、Run Scriptアイコンです。このアイコンをクリックすると、SQL*Plusのような、複数の文で構成されるスクリプトが実行されます(このスクリプトについては、シリーズの次回の記事で説明します)。その結果は図4に示すScript Outputタブに表示されます。
図4:SQLワークシートのScript Outputタブ
データベース・アクセス用のWebベース・インタフェースであるOracle Application ExpressのSQLワークショップのSQL CommandsウィンドウでもSELECT文を作成できます。SQLワークショップのSQL Commandsウィンドウにはドラッグ・アンド・ドロップ機能はありません。そのため、SQL文を明示的に入力する必要があります。その後、「Run」をクリックすると、図5に示すようにSQLワークショップのResultsセクションに結果セットが表示されます。この結果の形式は、SQLワークシートのResultsタブで使用される形式に似ています。図3と図5を比較すると確認できます。
図5:SQLワークショップのResultsセクション
Oracle Application ExpressのSQLワークショップのSQL CommandsウィンドウでSELECT文を作成する方法は、SQL*PlusでSELECT文を作成する方法と似ています(後者については、このシリーズの次回の記事で説明します)。
このシリーズの前回までの記事で説明したように、データベース設計の目標の1つは、冗長性を排除することです。しかし、データを選択する方法によっては、結果に重複する値が含まれることもあります。ただし、SELECT構文のリスト内でDISTINCTキーワードまたはUNIQUEキーワードを使用すれば、結果セット内の重複するデータを排除できます。
図6の例では、結果として4行返されますが、部門が割り当てられている従業員は2人のみです。Frances NewtonとEmily EckhardtのDEPARTMENT_IDはNULL値になっています。
図6:従業員の姓名データと対応する部門
EMPLOYEE表にある区別可能な(つまり一意の)DEPARTMENT_IDの値のみを表示する場合は、図7のようなSELECT文を作成できます。
図7:EMPLOYEE表に含まれるDEPARTMENT_IDの値のDISTINCTリスト
この例のように少数の行しか含まれない表の問合せにDISTINCTキーワードを使用することはおそらく不要です。全体的な結果からでも重複するデータが明白であるからです。しかし、数百、あるいは数千のEMPLOYEEレコードを含む表では、どの部門が表示されるか(または表示されないか)についてはまったく分かりません。
コードの書式が一貫しているほど、コードは読みやすくなります。コードが読みやすくなるほど、レビュー担当者が明らかなバグや潜在的なバグを発見して改善点を提案することが容易になります。すべての開発者がコード書式の標準に従うようにIT管理部門が要求している場合に、Oracle SQL Developerの書式設定機能を使用すれば、より簡単にそれらの規定を順守できます。
たとえば、この記事の例では、キーワードに大文字と小文字が混在しています。しかし、お使いの環境の標準では、特定の大文字と小文字のスタイルを使用するように定められていることもあります。Oracle SQL Developerでは、一貫性を維持するための各種手段が提供されています。最小限、文のキーワードをすべて大文字にするか、すべて小文字にするか、1文字目のみを大文字にするように設定できます。そのためには、文を選択して、図8のようにSQLワークシート内で右クリックして「To Upper/Lower/InitCap」を選択するか、[Ctrl]を押しながら引用符キーを押します。
図8:キーワードの大文字と小文字の変更
図8の方法によって文のキーワードを大文字に変更した結果は、図9のとおりです。
図9:キーワードの大文字と小文字を変更した結果
コードの書式設定を制御する別の方法もあります。SQLワークシート内で右クリックして「Format」を選択するか、[Ctrl]を押しながら[F7]を押します(Oracle SQL Developer Release 3.0.04以降は、このオプションを選択すると、SQLワークシート内のすべてのコードが影響を受けることに注意してください)。このオプションの環境設定を行うには、「Tools」→「Preferences」→「Database」→「SQL Formatter」→「Oracle Formatting」の順に選択し、「Edit」をクリックします。図10に、利用可能な書式設定オプションの一部を示します。
図10:Oracle SQL DeveloperのSQL Formatterのオプション
問合せに含める表を特定するためにスキーマ・ダイアグラムを参照することや、正しい文を作成するためにOracleドキュメント内で構文を検索することがたびたび必要になるでしょう。Oracle SQL Developerのコード補完機能がこれらのタスクを支援します。文の入力を中断すると、コード補完機能によって、選択可能な適切な表の名前、列の名前、コマンドの一覧が表示されます。図11は、この機能の実際の使用例です。
図11:Oracle SQL Developerのコード補完機能
Oracle SQL Developerの構文ハイライト表示は、コード内のSQL言語のキーワードを、表の名前、列の名前、その他の文の条件とは異なる色を使用して表示する機能です。この機能を有効にすると、デフォルトではSQL言語コマンドが青で表示され、その他の文の条件が黒で表示されます。図12に示すように、構文ハイライト表示機能によりコードの可読性が大幅に向上し、自分や他のメンバーがより簡単にエラーを特定できるようになります。
図12:Oracle SQL Developerの構文ハイライト表示
構文ハイライト表示や、この記事で説明したその他のOracle SQL Developerの書式設定機能は「Tools」→「Preferences」から編集または無効化できます。デフォルトでは、これらの機能は有効で、この記事で示した動作や結果を示すことになります。
この記事では、Oracle SQL Developer、およびOracle Application ExpressのSQLワークショップのSQL Commands機能を使用した単純なSQL SELECT文の作成方法と実行方法について説明しました。Oracle SQL Developerの書式設定、構文ハイライト表示、コード補完の各機能によって、コードの可読性や正確性が向上することも確認しました。
このSQLの基礎に関する次回の記事では、SQL文のWHERE句とORDER BY句について説明し、さらにオラクルのSQL*Plusツールについて詳しく見ていきます。
Melanie Caffreyはオラクルの上級開発マネージャーです。Expert PL/SQL Practices for Oracle Developers and DBAs(Apress、2011年)およびExpert Oracle Practices: Oracle Database Administration from the Oak Table(Apress、2010年)の共著者でもあります。