【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷



データを効率的に処理するエッセンスを教えます
連載:SQL実践講座(1)

SQLの基礎 「SELECT」文を覚えよう

篠原光太郎
2000/6/21

 本記事のおもな内容
 いろいろあるSQLの規格
 サンプルデータベースを操作してみる
 SELECT文の基本的な使い方
 WHERE句の使い方
 条件の指定方法

 リレーショナルデータベースシステム(RDBMS)も、今や、システムの構築には不可欠なものとなりました。皆さんが目にしているシステムや、管理しているシステムでも、RDBMSが使われていないシステムを探すほうが大変ではないでしょうか。RDBMSの普及にともない、RDBMSへのアクセス手段であるSQLも、日常的によく見かけるものとなりました。

 このSQL実践講座では、SQLの効率的な使い方をエッセンスにしてお伝えしていこうと考えています。SQLは、データを操作するために非常に簡単な構文で構成されているように見えます。ところが、実際に使い込んでいくと、一見簡単に取得できるように見えるデータが取得できない場面にぶち当たることがあると思います。また逆に、一見取得するのが難しいと思われるようなデータが、SQLを使うと数行でできてしまったりします。このあたりが、SQLの面白いところですね。

 この講座では、このような疑問を中心に、「SQLそのもの」について話を進めていこうと考えています。

いろいろあるSQLの規格

 SQLにはいくつかの規格があります。今現在でいちばん一般的なのは、SQL/92と呼ばれる規格でしょう。これは、ANSIとISOによって、1992年に制定された規格です。別名、「SQL2」とも呼ばれています。

 本講座で取り扱うマイクロソフトのMicrosoft SQL Server 7.0は、SQL/92に準拠しています。“準拠”ですので、多くの部分でSQL Server 7.0独自の部分が多数存在します。また、以前のバージョンとの互換性のために、SQL/89に準拠したSQL Server 6.5やSQL Server 6の文法も多くサポートしています(どのバージョンに基づいて文法解析するかは、SQL Serverに対して意図的に指定することができます)。

 本講座では、基本的にはSQL/92に基づいた記述をし、必要に応じてSQL/89やSQL Serve独自の記述方法を紹介していこうと考えています。これは、SQL/92に基づいているものと、基づいていないものを意識して使い分けることで、将来同じSQLをOracle用(など)に作成する際の「壁」を少しでも少なくしようという配慮です。

 また、SQLの最新版は、「SQL/99」(別名SQL3)です。昨年の1999年に規格化されました(SQL99の詳細についてはこちらを参照)。本講座でも随時取り上げて行きます。

環境の準備

 先ほども若干触れましたが、本講座では、マイクロソフトの「SQL Server 7.0」をベースに、例題のSQLを提供していきます。もし環境がない場合は、マイクロソフトのホームページで30日間の試用版を入手できますので、それを利用しても良いでしょう(ただし、ダイアルアップではダウンロードにかなり時間がかかりますが)。

 ところで、みなさんは「Northwind」というデータベースをご存知でしょうか? 言わずと知れた、SQL Serverのサンプルデータベースです。例題はこのDBを使用していきますので、もしインストールされていない場合は、ぜひ追加インストールしてください。容量自体も5M程度と、非常に小さなデータベースです。

 また、ツールとしては、SQL Server Enterprise Manager、クエリアナライザ(以前のバージョンではISQLと呼ばれてました)を中心に使っていこうと考えています。

サンプルデータベースを操作してみる

 では、SQL Server Enterprise Manager(以下、Enterprise Managerと略します)を起動して、Northwindデータベースの中身を調べてみましょう。Enterpriseマネージャの初期画面で、左側のペインの「ツリー」を、「Microsoft SQL Server→SQL Serverグループ→(サーバ名)→データベース→Northwind→テーブル」と順番に選択します。32個のテーブルが右側のリストされていますね。

画面1 SQL Server Enterprise Managerによるテーブルのリスト(クリックすると拡大画像を表示します)

 では、Ordersテーブルを選択して、「操作」メニューを開き、「テーブルを開く→全行を返す」を選択してみましょう。Ordersテーブルの中身が表示されたでしょうか。いちばん上の行に、左から順番に「OrderID」「CustomerID」……とデータのタイトルが表示されています。これを、「列(またはカラム)」と呼びます。これに対し、縦に並んでいるそれぞれのデータを、「行(またはロウ)」と呼びます。1行が1つのデータで、カラムがそれぞれの属性の値を表します。

画面2 Ordersテーブルの内容(クリックすると拡大画像を表示します)

 テーブルとは、このように行と列で表されるデータの集まりのことです。Orders、Customersなどは、それぞれ1つのテーブルですね。

まずはSELECT文の基本的な使い方

 では、SQL文を使って、データの表示してみましょう。Enterprise Managerで、「ツール」メニューの「SQL Serverクエリアナライザ」を選択します。まず、右上の「DB」ドロップダウンリストで、「Northwind」データベースを選択します。そして、表示された画面で、次のSQLを入力してみましょう。

【例1
SELECT CustomerID, CompanyName FROM Customers

 入力したSQL文の実行は、「クエリ」メニューから「実行」を選択します(もちろん、アイコンを選択してもOKです)。すぐに結果が表示されるはずです。

画面3 クエリアナライザ(クリックすると拡大画像を表示します)

 SELECTは、データの取得をするためのSQL命令です。データの取得は、「照会」とも呼ばれます。CustomerID、CompanyNameは、それぞれ列の名前を指定します。この例のように複数の列を指定するときは、「,」で区切ります。SELECTとカラムの列の部分を、SELECT句、もしくは、SELECT文節と呼びます。

 SELECT句の後のFROMは、テーブルの指定をします。この例では、Customersテーブルを指定しています。今後の例では複数のテーブルを指定する場合がありますが、そのときはテーブル名を列名と同じように、「,」で区切ります。FROMとテーブル名の部分を、FROM句、もしくは、FROM文節と呼びます。

 この例のSQL文をまとめると、「Customersテーブルから、CustomerID、CompanyNameを取得しなさい」という命令であることになります。

 カラムの指定には、「*」という記号も使えます。これは、すべてのカラムを取得したいときに便利です。例えば、次のようなSQLを実行してみましょう。

【例2
SELECT * FROM Customers

 Customersテーブルの全データが、全列表示されたでしょうか?

WHERE句の使い方

 例1では、特に条件を指定しなかったので、取得されたデータはすべての行でした。SQLによるデータの取得では、欲しい情報の条件を指定することが出来ます。次のSQL文を実行してみましょう。

【例3
SELECT CustomerID, CompanyName, City
  FROM Customers WHERE City = 'London'

 新たに、WHEREという部分が追加されました。ここで、欲しい情報の条件を指定します。この例では、「City = 'London'」として、City列が'London'の行のみを取得するように指定しています。WHEREとその条件文を、WHERE句、もしくはWHERE文節と呼びます。

 WHERE句には、複数の条件を指定することも可能です。次のSQL文を実行してみましょう。

【例4
SELECT * FROM Orders
 WHERE CustomerID = 'QUICK' AND OrderDate > '1998/1/1'

 この例では、Ordersテーブルから、CustomerIDが'QUICK'で、かつ、OrderDateが1998年以降のものを取得しています。「かつ」ではなく、「または」で条件指定したい場合は、「OR」を使用します。

【例5
SELECT * FROM Orders
  WHERE CustomerID = 'QUICK' OR OrderDate > '1998/1/1'

 また、条件に合致しない行を指定したい場合は、条件をNOTで否定することが出来ます。

【例6
SELECT * FROM Orders WHERE NOT CustomerID = 'QUICK'


条件の指定の仕方

 例4では、「=」と「>」という記号で条件を指定しましたが、これ以外にも次のような条件を指定することが出来ます。

(1) 比較演算子
値の大小の比較をします

等しい
より大きい
より小さい
>=
より以上
<=
より以下
<>
等しくない

(2) BETWEEN条件
値が指定した2つの値の間にあるか否かを比較します。次の例では、Ordersテーブルから、OrderDateが1996/1/1から1997/12/31であるものを取得します。

【例7
SELECT * FROM Orders
  WHERE CustomerID = 'QUICK' AND
     OrderDate BETWEEN '1996/1/1' AND '1997/12/31'

(3) IN条件
値が指定した値のリストの中にあるかを比較します。次の例では、OrdersテーブルからCustomerIDが'QUICK'か'VINET'であるものを取得します。

【例8
SELECT * FROM Orders
  WHERE CustomerID IN ('QUICK', 'VINET')

(4) LIKE条件
文字の検索条件を指定します。ここで、%と_(アンダースコア)は特殊な意味が割り当てられており、%は「任意の文字数の任意の文字」、_は「1文字の任意の文字」を表します。たとえば、CustomerID LIKE 'Q%'は、CustomerIDがQで始まる文字を指定し、CustomerID LIKE 'Q_'は、CustomerIDがQで始まる2文字の文字を指定します。%と_は組み合わせての使用が可能です。

【例9
SELECT * FROM Orders WHERE CustomerID LIKE 'Q%'


今回のまとめ

 今回はごく基本的な、「SELECT文」を紹介しました。次回は、並び替えの仕方(ORDER BY)、集計の仕方(GROUP BY)を予定しています。


SQL実践講座 バックナンバー


「Master of IP Network総合インデックス」


ホワイトペーパーTechTargetジャパン

Master of IP Network フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています