本記事は2016年6月発売『SQL 第2版 ゼロからはじめるデータベース操作』の「第1章 データベースとSQL」から抜粋したものです。掲載にあたり一部を編集しています。
1-1 データベースとは何か
- 大量の情報を保存し、コンピュータから効率良くアクセスできるように加工したデータの集まりのことを「データベース」と呼びます。
- データベースを管理するコンピュータシステムのことを、「データベース管理システム(略してDBMS)」と呼びます。
- DBMSを使うことにより、大量のデータを多人数でも安全かつ簡単に扱えます。
- データベースにはさまざまな種類がありますが、本書では「リレーショナルデータベース」を「SQL」という専用言語で操作する方法を学びます。
- リレーショナルデータベースは、「リレーショナルデータベース管理システム(略してRDBMS)」で管理します。
私たちのすぐそばにあるデータベース
皆さん、こんな経験をしたことはないでしょうか。
- 通っている歯医者から、「前回から半年経過したので、歯の健診に来てください」というハガキをもらった
- 以前利用した旅館やホテルから誕生日の前月に「誕生月の方にサービス!」というメール(またはハガキ)をもらった
- Web上のショッピングモールで買い物をしたら、メールで「おすすめ商品」のリストが送られてきた
これらが可能なのは、歯医者さんや旅館、ショッピングモールの経営者が、お客様の前回通院日や誕生日、購買履歴の情報を持っていて、なおかつ、それらを蓄積した膨大な情報からほしい情報(この場合はあなたの住所や嗜好)を素早く取り出すことのできる仕組み(コンピュータシステム)を持っているからです。もし、人の手を使って同じことを行なおうとしたら、どれほど時間がかかるかわかりません。
また、最近ではどこの図書館にもコンピュータが置かれ、本を検索できるようになっています。このシステムを利用すると、書名や出版年を手がかりに読みたい本がどこにあるのか、貸し出し中かどうかなどが瞬時にわかります。これができるのも、書名や出版年、保管されている棚の位置、貸し出し状況などの情報を保存し、必要に応じて取り出すことのできる仕組みのおかげです。
こうした情報をデータとして大量に保存し、かつコンピュータを使ってそれらに効率良くアクセスできるように加工したデータの集まりをデータベース(Database)、略してDBと呼びます。名前や住所、電話番号、メールアドレス、嗜好、家族構成などのデータをデータベースへ保存することで、いつでも簡単に迅速にほしいデータを取り出せるのです。また、データベースを管理するコンピュータシステムをデータベースマネジメントシステム(Database Management System)、略してDBMSと呼びます。
データベースが、システムの利用者から直接見えることは通常ありません。そのため、システムを利用しているときにデータベースの存在を意識することはほとんどありませんが、実際には銀行の口座管理から携帯電話のアドレス帳にいたるまで、社会のあらゆるシステムの中にデータベースがあると言っても過言ではありません(図1-1)。
なぜDBMSが必要なのか
さて、データを管理するために、なぜ専用のシステム(DBMS)が必要なのでしょうか。パソコン(コンピュータ)を使ってデータを管理するというのなら、テキストファイルやExcelのような表計算ソフトでもできそうですし、そのほうがずっと簡単な気がします。
たしかに、テキストファイルや表計算ソフトでデータを管理する方法は手軽なのですが、デメリットもあります。代表的なものを挙げてみましょう。
-
多人数でデータを共有するのに向かない
ネットワークにつながっているコンピュータ上にあるファイルは、共有する設定により、複数のコンピュータから読んだり編集したりできます。しかし、誰かがそのファイルを開いていると、ほかの人が編集しようとしてもできません。もしインターネットショップであれば、誰かが買い物をしているとほかの人が買い物できなくなってしまいます。
-
大量のデータを扱える形式になっていない
数十万件、数百万件といった大量のデータから瞬時にほしいデータだけを取り出すには、それに適した形式でデータを保存しておかなければなりませんが、テキストファイルやExcelシートなどはそのような形式になっていません。
-
読み書きを自動化するのにプログラミング技術が必要
コンピュータプログラム(以下、単にプログラム)を書くことでデータの読み出しや書き換えを自動化できますが、それにはデータの構造をきちんと理解したうえで、一定レベルのプログラミング技術が求められます。
-
万一の事故に対応できない
ファイル操作を誤って削除してしまったり、ハードディスクが故障して読み出せなくなったりして、大切なデータを失う恐れがあります。また、部外者でも簡単に読んだり持ち出したりできます。
DBMSは、これらのデメリットを解消する機能を持っています。そのため、大量のデータを多人数でも安全かつ簡単に扱えます(図1-2)。DBMSが必要な理由はこれなのです。
DBMSにはいろんな種類がある
さて、一口にDBMSといってもいろんな種類があります。主にデータの格納形式(データベースの種類)に従って分類されますが、現役のDBMSで採用されている格納方式はおおむね次の5種類です。
-
階層型データベース(Hierarchical Database:略称は特になし)
最も古くからあるデータベースの1つで、データを階層構造(木構造)で表現します。古くはデータベースの主流でしたが、次に挙げるリレーショナルデータベースの普及に伴い、現在では使用されるケースが少なくなっています。
-
リレーショナルデータベース(Relational Database:RDB)
「関係データベース」とも呼ばれ、現在最も広く利用されているデータベースです。長い歴史を持ち、誕生は1969年までさかのぼります。Excelシートのように列と行からなる2次元表の形式でデータを管理するため、理解しやすいという特徴があります(表1-1)。また、SQL(Structured Query Language:構造化問い合わせ言語)という専用の言語を用いてデータを操作します。
このような種類のDBMSのことを「RDBMS(Relational Database Management System)」と呼びます。代表的なRDBMSとしては、次の5つがあります。
- Oracle Database:Oracle社のRDBMS
- SQL Server:Microsoft社のRDBMS
- DB2:IBM社のRDBMS
- PostgreSQL:オープンソースのRDBMS
- MySQL:オープンソースのRDBMS(2010年からOracle社が開発元)
なお、Oracle Databaseは単純に「Oracle」と呼ばれることが多いため、本書でも以降「Oracle」と表記します。
-
オブジェクト指向データベース(Object Oriented Database:OODB)
プログラミング言語の中には、オブジェクト指向言語と呼ばれるタイプの言語があります。データとそれを操作する処理をまとめて「オブジェクト」という単位で管理するためにそう呼ばれます。オブジェクト指向データベースは、このオブジェクトを保存するデータベースです。
-
XMLデータベース(XML Database:XMLDB)
近年、インターネット上でやり取りされるデータの形式としてXMLが普及しています。このXML形式のデータを大量かつ高速に扱うために考えられたのがXMLデータベースです。
-
キー・バリュー型データストア(Key-Value Store:KVS)
検索に使うキー(Key)と値(Value)の組み合わせだけの単純な形でデータを保存するデータベースです。プログラミング言語の知識がある方であれば「連想配列」や「ハッシュ」を想像してもらうと近いでしょう。Googleなど、非常に膨大な量のデータを超高速に検索するWebサービスで使われ、近年注目を集めています。
本書で解説するのは、専用言語のSQLを使ってリレーショナルデータベースという種類のDBMSである「RDBMS」を操作する方法です。これ以降は、このRDBMSに絞って話を進めていきます。本書でデータベースやDBMSといったら、RDBMSを指すと考えてください。
なお、RDBMSの中にはXMLデータベースと同じようにXML形式のデータを扱えたり、オブジェクト指向データベースの機能を取り入れたりしたものがありますが、本書ではそうした拡張機能を使うためのSQLは取り上げません。それぞれのRDBMSに付属しているSQLのマニュアルやRDBMS別のSQL解説書などを参照してください。
1-2 データベースの構成
- RDBMSは一般に、「クライアント/サーバ型」のシステム構成で使用されます。
- データベースを読み書きするには、サーバであるRDBMSにクライアントからSQL文を送信します。
- リレーショナルデータベースでは、「テーブル」あるいは「表」と呼ばれる2次元表でデータを管理します。
- テーブルは、データ項目を表わす「列(カラム)」と、1件のデータを表わす「行(レコード)」からなります。データの読み書きはレコード単位で行なわれます。
- 列と行が交わる1つのマス目を本書では「セル」と呼びます。1つのセルには1つのデータしか入れられません。
RDBMSの一般的なシステム構成
RDBMSを利用する際のシステム構成は、クライアント/サーバ型(C/S型)と呼ばれる形態が最も一般的です(図1-3)。
サーバとは、ほかのプログラムからの要求を受け取り、それに応じて処理を行なうタイプのプログラム(ソフトウェア)、あるいはそのプログラムがインストールされたマシン(コンピュータ)のことです。コンピュータ上で動作し続けて、要求が届くのを待ちます。RDBMSもサーバの一種で、ハードディスクなどに保存されているデータベースからデータを取り出して返したり、指示された内容でデータを書き換えたりします。
一方、サーバに要求を出すプログラム(ソフトウェア)、あるいはそのプログラムがインストールされたマシン(コンピュータ)をクライアントと呼びます。RDBMSが管理しているデータベースにアクセスして、そのデータを読み書きするプログラムは、RDBMSのクライアントです。
RDBMSのクライアントは、サーバであるRDBMSにどんなデータを送ってほしいのか、どこのデータをどのように書き換えてほしいのかをSQLで書いた文(SQL文)を送信します。RDBMSはその文の内容に従って、要求されたデータを返信したり、データベースに保存されているデータを書き換えたりします。
クライアントとは、日本語で言えば「依頼人」、サーバは「給仕人」です。つまり、依頼人の出した命令を給仕人が実行する、という関係からついた名前です。
このように、リレーショナルデータベースの読み書きは、SQL文を使って行ないます。本書ではSQLを学習するために、記述したSQL文をRDBMSに送信し、その返信(データ)を受け取って表示するクライアントを利用します。詳しくは、第0章をご覧ください。
また、RDBMSは1台のコンピュータの中でRDBMSとそのクライアントを動かすこともできますし、RDBMSとクライアントを別々のコンピュータ上で動かすこともできます。その場合、ネットワークで両者をつなぐだけでなく、1つのRDBMSは複数のクライアントから利用できます(図1-4)。
保管しているデータベースを処理する必要があるため、一般にはクライアントを動かすコンピュータよりも高性能なコンピュータを使用します。特に巨大なデータベースを扱う場合には、複数のコンピュータを組み合わせることもあります。
このように、RDBMSにはさまざまなシステム構成がありますが、クライアントから送信するSQL文は基本的に変わりません。
テーブルの構造
RDBMSの構成をもう少し詳しく見てみましょう。前節で、リレーショナルデータベースはExcelシートのように列と行からなる2次元表の形式でデータを管理する、と説明しました。このデータを管理している2次元表のことを、リレーショナルデータベースではテーブル、あるいは単に表と呼びます。
テーブルは、図1-5のようにRDBMSが管理するデータベースの中に保存されます。1つのデータベースの中には、複数のテーブルを保存できます。
SQL文の内容に従ってクライアントに返信されるデータも、必ずテーブルと同じように2次元表の形になります。これもリレーショナルデータベースの特徴の1つで、結果が2次元表にならないSQL文は実行できません。
なお、図1-5にはデータベースが1つしかありませんが、複数のデータベースを作ることも可能で、用途によって使い分けることができます。
図1-6は、1-3節からはじめるSQLの学習で実際に使用する「商品テーブル」の内容です。
テーブルの列(縦)はカラムとも呼び、テーブルに保管するデータ項目を表わします。図1-6の商品テーブルには、商品IDから登録日まで6つの列があります。また、列にはExcelよりも厳しい制約があり、数値を入れると決めた列には数値だけ、日付を入れると決めた列には日付だけしか入れられません(1-4節で詳しく説明します)。
一方、テーブルの行(横)はレコードとも呼び、1件のデータに相当します。商品テーブルには全部で8行のデータがあります。リレーショナルデータベースでは、必ず行単位でデータを読み書きします。大切なルールですので覚えておきましょう。
図1-6のように行と列が交わる1つのマス目を、本書ではセルと呼ぶことにします。1つのセルの中には、1つのデータしか入れられません。図1-7のように、1つのセルの中に2つ(またはそれ以上)のデータを入れることはできません。このルールも大切なので覚えておきましょう。
1-3 SQLの概要
- SQLはデータベースを操作するために開発された言語です。
- SQLには標準規格がありますが、実際にはRDBMSごとに違いがあります。
- SQLでは、操作したいことを1つの文(SQL文)で記述し、RDBMSに向けて送信します。
- 原則的に、文末には区切りとしてセミコロン(;)をつけます。
- SQLはその目的によりDDL、DML、DCLに分類できます。
標準SQL
前節でも触れたとおり、本書で学習するSQL(Structured Query Language)はリレーショナルデータベース(以下、単にデータベースと呼びます)を操作するための言語です。もともと、データベースから効率良くデータを検索する(取り出す)ことを目的に開発された言語ですが、現在ではデータの検索だけでなく、データの登録や削除といったデータベース操作のほとんどをSQLで行なうことができます。
SQLにはISO(国際標準化機構)で定められた標準規格があり、それに準拠したSQLを標準SQLと呼びます(コラム「標準SQLと方言」を参照)。以前は、標準SQLに完全に準拠したRDBMSは少なく、RDBMSごとの「方言」でSQL文を書く必要がありました。そうすると、Oracleでは使えたSQL文が、SQL Serverでは使えない、またはその逆が起きる、という不便が起きてしまいます。最近は標準SQLのサポートが進んでいるので、これからSQLを学習する方は標準SQLでの書き方を覚えるようにしましょう。
本書も、基本的に標準SQLでの書き方を解説していきます。ただし、RDBMSによっては方言でしか書けないSQL文があります。その場合には、そのことを示して方言での書き方を別途紹介します。
SQLの文とその種類
SQLは、いくつかのキーワードと、テーブル名や列名などを組み合わせた1つの文(SQL文)として、操作の内容を記述します。キーワードは、最初から意味や使い方が決められている特別な英単語で、「テーブルを検索する」「このテーブルを参照する」などの意味を持つさまざまなものがあります。
またSQL文は、RDBMSに与える命令の種類により、次の3つに分類されます。
-
DDL(Data Definition Language)
DDL(データ定義言語)は、データを格納する入れ物であるデータベースやテーブルなどを作成したり削除したりします。DDLに分類される命令は次のとおりです。
CREATE:データベースやテーブルなどを作成する
DROP:データベースやテーブルなどを削除する
ALTER:データベースやテーブルなどの構成を変更する
-
DML(Data Manipulation Language)
DML(データ操作言語)は、テーブルの行を検索したり変更したりします。DMLに分類される命令は次のとおりです。
SELECT:テーブルから行を検索する
INSERT:テーブルに新規行を登録する
UPDATE:テーブルの行を更新する
DELETE:テーブルの行を削除する
-
DCL(Data Control Language)
DCL(データ制御言語)は、データベースに対して行なった変更を確定したり取り消したりします。そのほか、RDBMSのユーザがデータベースにあるもの(テーブルなど)を操作する権限の設定も行ないます。DCLに分類される命令は次のとおりです。
COMMIT:データベースに対して行なった変更を確定する
ROLLBACK:データベースに対して行なった変更を取り消す
GRANT:ユーザに操作の権限を与える
REVOKE:ユーザから操作の権限を奪う
これらのうち、実際に使われるSQL文の90%はDMLです。本書でも、DMLについての解説が中心です。
SQLの基本的な記述ルール
SQL文を書く際には、いくつかの記述ルールを守らなければなりません。とはいえ簡単なルールですので、ここで覚えておきましょう。
SQL文の最後に「;」をつける
1つのデータベース操作は、1つのSQL文で記述します。RDBMSでも、SQL文を1つずつ実行していきます。
文には当然、終わりを示す区切り文字が必要です。日本語の文なら句点(。)、英文ならピリオド(.)ですね。SQLでは文の区切り文字としてセミコロン(;)を使います。
大文字・小文字は区別されない
SQLでは、キーワードの大文字・小文字は区別されません。「SELECT」と書いても「select」と書いても同じように解釈されます。テーブル名や列名などについても同様です。
大文字と小文字のどちらで書くか(また混在させるか)は好みの分かれるところですが、本書では以下のルールでSQL文を記述していきます。
- キーワードは大文字
- テーブル名は頭文字のみ大文字
- そのほか(列名など)は小文字
ただし、テーブルに登録されているデータについては、大文字・小文字が区別されます。たとえば、「Computer」と登録したデータを「COMPUTER」や「computer」と同じに扱ったりはしません。
定数の書き方には決まりがある
SQL文では、文字列や日付、数値をじかに書く場面がたくさん出てきます。たとえば、テーブルに文字列や日付、数値などのデータを登録するSQL文を書くときなどです。
SQL文の中にじかに書く文字列や日付、数値などを定数と呼びます(「じょうすう」とも読みます)。定数の書き方には、次のような決まりがあります。
文字列をSQL文の中に記述する場合には、'abc'というようにシングルクォーテーション(')で文字列を囲んで、それが文字列であることを示します。
日付をSQL文の中に記述する場合には、文字列と同じくシングルクォーテーション(')で囲みます。ただし、日付はさまざまな表現形式('26 Jan 2010'や'10/01/26'など)があります。本書では、'2010-01-26'という'年-月-日'形式を使います。
一方、数値をSQL文の中に記述する場合には、何かの記号で囲む必要はありません。1000というように数値だけを書きます。
単語は半角スペースか改行で区切る
SQL文では、単語と単語の間を「半角スペース(空白)」または「改行」で区切ります。次のように単語の区切りをなくしてつなげて書くとエラーになり、正しく動作しません。
○ CREATE TABLE Shohin
× CREATETABLE Shohin
× CREATE TABLEShohin
ただし、「全角スペース」を単語を区切る文字として使うことはできません。エラーになったり予期せぬ動作をする原因となるからです。
COLUMN 標準SQLと方言
SQLの標準規格は、ANSI(米国規格協会)やISO(国際標準化機構)といった標準化団体により、数年に一度改訂されます。改訂では、構文の改訂や新機能の追加が行なわれます。
ANSIによりはじめてSQLの標準規格が策定されたのは1986年のことです。以降、数度の改訂が行なわれ、本書の執筆時点(2016年5月)では2011年に改訂された規格(SQL:2011)が最新です。改訂ごとに決められた規格は、規格化した年をとって「SQL:1999」「SQL:2003」「SQL:2008」などと呼ばれます。こうした標準規格に準拠したSQLが標準SQLです。
ただし、SQLの標準規格に「どのRDBMSも使えなければならない」という強制力はありません。標準SQLをサポートしたRDBMSは増えましたが、それでも標準SQLで書いたSQL文を実行できないことがあります。こうした場合には、そのRDBMSでしか実行できないSQLの「方言」を使って書くことになります。
実は、これには仕方のない事情もあります。昔は(といっても1980~1990年代のこと)、標準SQLで決められているSQLの機能がとても貧弱で、実務に使うには十分とはいえませんでした。RDBMSのベンダ(メーカーのこと)はその不足を補うため、独自に機能を追加せざるをえなかったのです。
とはいえ、これにはマイナスの面だけではなく、そうした独自機能の中で便利さが認められたものが標準SQLに取り込まれるという、プラスの面もありました。各ベンダとも、自社の強みと独自性をアピールするために、むしろ積極的に方言を作っていたふしがあります。
現在の標準SQLは、度重なる改訂を経て機能が非常に充実しました。これからSQLを学習する方は、まず標準SQLでの書き方を覚えましょう。