前回は、SQLの実験環境であるOracle Application Express(APEX)を使う準備をしました。今回からいよいよSQLの解説に入ります。最初に解説するのはSELECT文です。簡単なようで奥が深いので、心してかかってください。(編集部)
連載第1回で説明したように、この連載では最初にSELECT文について解説します。
SELECT文は、データベースからデータを取り出すための構文です。SELECT文では、単にデータを取り出すだけでなく、さまざまなキーワードを組み合わせて取り出すデータを制限したり、条件を付けたりすることができます。
SELECT文には、いくつもキーワードがありますが、今回は以下の3つをしっかり覚えてください。
まずは、表を指定して、その表にある全データを取り出してみましょう。表のすべての列データを指定するには、SELECTの後に「*(アスタリスク)」を指定します。構文は以下の通りです。
SELECT * ←すべての列のデータを(SELECT句) FROM 表名 ←どの表から(FROM句)(FROM句)
SELECT文の中で、SELECTキーワードに続いて列名を指定する部分を「SELECT句」、FROMで表名を指定する部分を「FROM句」と呼びます。
それでは、早速APEXで実行してみましょう。APEXには、サンプル表として、社員情報を格納した「EMP」表と、部門情報を格納した「DEPT」表が用意されています。まずは、EMP表とDEPT表それぞれの、すべてのデータを検索してみましょう。EMP表のデータをすべて検索するには以下のようなSQL文を実行します。
SELECT * FROM emp;
実行すると、図1のように表形式のデータが表示されます。
後述のように、SELECT句にすべての列名を列挙しても、同様の結果が得られます。
次に、DEPT表のデータを検索してみましょう。次のSQL文を実行してください。
SELECT * FROM dept;
実行すると、図2のように4行から成る表のデータが表示されます。
SELECT文の最後に指定している「;(セミコロン)」は、「ここで1つのSQL文が終わり」ということを示す記号です。この連載で使っているAPEXでは「実行」ボタンを押せば、「;」を省略してもSQL文を実行できますが、SQL*Plusなどのコマンドラインツールでは、最後に「;」を付ける必要があります。
上記のように、SELECT句に「*」を指定すると、表からすべての列データを取り出せます。しかし、実際の処理では、すべての列のデータを取得することはまれで、特定の列データだけを取得することの方が多いでしょう。SELECT句で列を指定してデータを取得するには、以下のように列名をカンマ(,)区切りで記述します。列挙した列名の末尾にはカンマを付けないということに気を付けてください。
SELECT 列名1, 列名2,・・・ ←どの列のデータを(SELECT句) FROM 表名 ←どの表から(FROM句)
では、SELECT句に「ENAME(社員名)」「HIREDATE(入社日)」「SAL(給与)」の3つの列を指定して、EMP表からデータを取得してみましょう。以下のSQL文を実行してみてください。
SELECT ename, hiredate, sal FROM emp;
下にある図3のように、SELECT句で指定した列だけが表示されました。
なお、SELECTやFROMなどのキーワードや、表名、列名は、大文字、小文字どちらで書いても問題ありません。また、SELECT文が長くなるようであれば、途中で改行しても問題ありません。このようなところは、SQLの柔軟さをよく表しています。
しかし、実際に仕事でSQL文を書くときは、ルールを決めて書き方を統一することをお勧めします。構文の書き方を統一しなければ、処理性能が低下してしまう可能性があるからです。詳しくは次回以降で説明します。
ここまでのSQL文では、表に入っているデータから、すべての行のデータが取得されました。しかし、実際の業務処理では、ある特定の行のデータだけを取得したいということもあります。
このようなときは、「WHERE」句を使用します。WHERE句に条件を指定すると、例えば「部門番号が10である社員のデータ」「給与が3000以上である社員のデータ」というように、取得するデータを、行単位で絞り込むことができます。構文は以下の通りです。
SELECT 列名1, 列名2, ←どの列のデータを(SELECT句) FROM 表名 ←どの表から(FROM句) WHERE 列名 比較演算子 条件値 ←どのような条件の行を(WHERE句)
EMP表からDEPTNO(部門番号)が10である社員のデータを検索するには、以下のようにSQL文を記述します。この例では、表示列をENAME、HIREDATE、DEPTNOに限定しています。
SELECT ename, hiredate, deptno FROM emp WHERE deptno=10;
WHERE句の「条件値」として、文字や日付データを指定するときは、注意が必要です。上記の「10」のように数値を指定する場合には必要ありませんが、文字や日付データを指定するときは、条件を単一引用符(')で囲む必要があります。
ENAMEが「KING」であるデータを探すSELECT文を実行してみます。エラーになる例と正しく実行できる例を見比べてみてください。まずはエラーになる例です。
SELECT ename, hiredate, deptno FROM emp WHERE ename=KING;
実行すると、図5のようにエラーが発生します。
次は、正しく実行できる例です。
SELECT ename, hiredate, deptno FROM emp WHERE ename='KING';
今度は、図6のように正しく実行できました。
また、日付は、データベースが認識できるフォーマットで指定する必要があります。日本語環境での初期設定はRR(年の下2桁)-MM(月)-DD(日)形式です。
条件を指定して検索する際には、条件としてイコール(=)以外にも、、代表的な比較演算子を使用することができます。例えば、給与が3000以上である社員のデータを検索するには、以下のようなSQL文を実行します。
SELECT ename, sal, deptno FROM emp WHERE sal>=3000;
実行すると、図7のような結果になります。
今回は、SELECT文の基本的な構文を使って、特定の列を指定して検索する方法や、特定の行を指定して検索する方法を説明しました。駆け足で第3回までやってきましたが、この連載の年内の更新はこれが最後です。年末年始の間、ぜひ条件をいろいろ変えてSQL文を何度も実行してみてください。習うことも大切ですが、慣れることはもっと大切です。
大学などでデータベースの勉強をしたことがある方や、情報処理試験を受験したことがある方は、「関係演算」や「選択」「射影」「結合」という言葉を聞いたことがあるかもしれません。
これらの概念は、1970年6月に、Edgar F. Codd博士が、自身の論文「A Relational Model of Data for Large Shared Data Banks」で発表したもので、現在のリレーショナルデータベース管理システムの理論的モデルになっています。
このように聞くと、なにか難しい概念であるように感じるかもしれませが、そんなことはありません。今回の記事の中で、代表的な関係演算が登場しました。
射影は、問い合わせによって戻される表の列を制限することを指します。つまりSELECT句に列名を指定し、特定列を取り出す操作がこれに当てはまります。
選択は、問い合わせによって戻される表の行を制限することを指します。つまりWHERE句に条件を指定して、特定行を取り出す操作を指します。
結合とは、表の間の関係を定義し、関係付けられた列と行を1つの結果として戻すことを指します。表の関係と結合については、次回以降で解説していきます。
業務でこういった用語を使うことはほとんどないと思います。しかし、何かの資格試験を受けるときなどに役立つかもしれません。
日本オラクル オラクルダイレクト所属。
須々木尚子(すすき なおこ)
オンラインセミナーの講師や、お客様への提案、案件の支援などを担当。著書に「Oracle SQLクイズ」(翔泳社)があります。
Copyright © ITmedia, Inc. All Rights Reserved.