第一章 データベースを学ぶ

データベースってなんだろう?

データベースとは、検索や書き換え、分析などのデータ管理を目的としてさまざまな情報を蓄積したもの。ITの世界では、電子的な媒体にファイルなどの形式で保存、蓄積したものを指す。現在、分野を問わず広く用いられているのが、複数の表の形式でデータを管理するリーレーショナルデータベースである。

RDBの基本構造

・RDBには複数の表が入っており、個々の表をテーブル(table)という。
・個々のテーブルには名前(テーブル名)が付いている。
・テーブルは列(column)と行(row)で構成される。
・1つの行が1件のデータに対応し、列はそのデータの要素に対応する。
*列のことをカラムやフィールドと呼ぶこともある。

データベース管理システム(DBMS)

データベースは単なる情報の集まりに過ぎず、その実態はファイルである。ファイルに対してSQLで書かれた命令を送っても、検索や書き換えができるわけではない。私たちがSQLを送る相手は、データベースファイルではなく、データベース管理システムと呼ばれるプログラムである。DBMSはコンピュータ内で常に稼働してSQLを待ち受けており、届いた内容に従って、データベースファイルの内容を検索したり、書き換えたりする処理を実行してくれる。

代表的なRDBMS製品
分類RDBMS製品名提供元
商用製品Oracle Databaseオラクル社
DB2IBM社
SQL Serverマイクロソフト社
OSSMySQLオラクル社
PostgreSQLPostgreSQL Global Development Group
SQLiteD.Richard Hipp
H2 DatabaseThomas Mueller

通常、DBMSに対しては、ネットワーク経由でSQLを送る。この送信は各データベースが定める特有の手順に従う必要があるため、たとえばメールソフトなどを使ってSQLを送ることはできない。各データベース製品では、DBMSと通信を行うための専用プログラムが提供されている。

検索をしてみよう

SELECTには目的とする列名を、FROMには検索したいテーブル名を記述する。

すべての列を検索する
SELECT 列名
FROM テーブル名

すべての列を指定する場合「*」にすることで短縮できる。「*」には、すべての列という意味があるから。

条件付きの検索

SELECT文の最後にWHEREで始まる記述を加える。

(例)出勤額が、3000円を超える行だけ取得する
SELECT 日付, 費目, 出金額
FROM 家計簿
WHERE 出金額 > 3000

データを追加する

INSERT INTOで追加先のテーブルを、VALUESで追加するデータを指定する。

(例)3月の家賃の支払いを行として挿入する
INSERT INTO 家計簿
VALUES ('2013-02-25', '居住費', '3月の家賃', 0, 85000)

データを更新する

(例)2013年2月25日の出勤額を90000円に更新する
UPDATE 家計簿
SET 出金額 = 90000
WHERE 日付 = '2013-02-25'

データの削除をしてみる

(例)日付が2013年2月25日である行の削除
DELETE FROM 家計簿
WHERE 日付 = '2013-02-25'

ここまで紹介した4つの文のうち、SELECT、UPDATE、DELETEで始まる分の動作は、次のように整理できる。

3命令の動作

SELECT文 : ある条件を満たす行を探す⇒その行の内容を取得する
UPDATE文 : ある条件を満たす行を探す⇒その行の内容を書き換える
DELETE文⇒その行を削除する

第二章

SQLの基本ルール

●まずは、すべてのSQLに共通する基本ルールを押さえておこう。

SQLに共通する基本ルール1

・文の途中に改行を入れることができる。
・行の先頭や行の途中に半角の空白を入れることができる。

●SQLは文の途中で改行することが許されている。また、行の先頭や行の途中に空白を入れることも可能。これらのルールを活用して、読みやすく整形されたSQL文の記述を心がける。

SQLに共通する基本ルール2

・ハイフン2つ(--)から行末まではコメントになり、無視される。
・/*から*/まではコメントになり、無視される。

●最後に、SQL文に記述できる語句について、ルールを紹介しよう。

SQLに共通する基本ルール3

・SELECTやWHEREなどの命令に使う単語は、SQLとして特別な意味を持つ「予約語」である。
・予約語を記述する際は、大文字と小文字の区別はない。
・テーブル名や列名に予約語を利用することはできない。

データ型とリテラル

リテラル記述に関するルール

・「'」でくくらず記述されたリテラルは、数値情報として扱われる。
・「'」でくくられたリテラルは、基本的に文字列情報として扱われる。
・「'」でくくられ、'2013-02-25'のような一定の形式で記述されたリテラルは、日付情報として扱われる。

*たとえば、「123」と「'123'」では意味が異なる。前者は(ひゃくにじゅうさん)という数量を表す数値データであるのに対し、後者は(いち・に・さん)という3つの文字の並びを表す文字データである。

数値データを文字列として格納してしまった場合、統計などの計算に使うことができなくなってしまいます。誤ったデータ形式で格納されないように、データベースには安全装置が備わっている。データベースでは、列ごとに格納できるデータの種類を表すデータ型を定めることになっている。

代表的なデータ型
データ種別区分代表的なデータ型名
数値整数値INTEGER型
小数DECIMAL型、REAL型
文字列固定長CHAR型
可変長VARCHAR型
日付と時刻DATETIME型、DATE型、TIME型

データ型

・テーブルの各列には、データ型が指定されている。
・列には、データで指定された種類の情報しか格納することはできない。
・利用可能なデータ型は、DBMS製品によって異なる。

例えば、CHAR(10)と指定されている列では、あらかじめ10バイトの領域が確保されており、格納するデータは常に10バイトになる。格納する文字列が10バイトに満たない場合は、文字列の右側に空白が追加され、10バイトピッタリに調整されて格納される。一方、VARCHAR型を指定された列では格納する文字列の長さを勝手に調整することはない。たとえば、VARCHAR(10)と指定した列では、3バイトや7バイトの文字列が入力された場合、それに合わせた領域が確保されるためそのままの長さで格納可能。最大長として10が指定したあるので、11バイトの文字列は格納できない。

SQLの命令体系

4つの重要なSQL文

データを操作する言語のSQLには、数えるほどしか命令はない。ほとんどのデータ操作は、SELECT、UPDATE、DALETE、INSERTの4つの命令で実現できてしまう。この4つのSQL命令は、DMLと総称される。

SQLの言語体系

・SQLでデータ処理を行うには、命令をたくさん覚える必要はない。
・4大命令だけで、ほとんどの処理を実現できる。

4つの命令に様々な修飾語のようなものを付加することで非常に複雑なデータ操作をできることが、SQLという言語の特徴。

SELECT文の基本構文

データベースから目的のデータを指定して取得することが役割。

SELECT 列名・・・→列名のデータを・・・取得しなさい

FROM テーブル名 →このテーブルから

(WHERE修飾)

ASによる別名の定義

SELECT文における列名やテーブル名の指定では、それぞれの記述の後ろに「AS+任意のキーワード」を付けることで、別名を定義することができる。

別名を付けるメリット

・結果表における列のタイトルを任意のものに変更できる。
・わかりにくい列名や長い列名でも、わかりやすく短い別名を付けて利用することができる。

UPDATE文の基本構文

すでにテーブルに存在するデータを書き換えるための命令。

UPDATE テーブル名 →このテーブルの情報を・・・更新しなさい

SET 列名1=値1, 列名2=値2・・・ →値1のデータで・・・列名1を

(WHERE修飾)

WHEREで目的の行を指定しないで実行してしまうと。すべての行に適用されてしまうので注意。「WHEREを伴わないUPDATE文」は、ほとんど使う機会がないでしょう。

DELETE文の基本構文

すでにテーブルに存在する行を削除するための命令。特定の列だけを指定することはできない。

DELETE →削除しなさい

FROM テーブル名 →このテーブルの情報を

(WHERE修飾)

DELETE文では列名を指定する必要がない。UPDATE文と同様、WHEREをつけなければすべての列が対象になってしまう。

INSERT文の基本構文

テーブルに新しいデータを追加するための命令。これまでの3つの命令とは異なり、テーブルの行を指定するしくみ(WHERE)はない。そのかわり、どこに、どのようなデータを追加するのかを指定する構造になっている。

INSERT INTO テーブル名 →このテーブルに

    (列名1, 列名2, 列名3・・・)→この列に

  VALUES (値1, 値2, 値3・・・)→このデータ

第三章

WHERE句の大切さ

SQL文の中でWHEREを使うことで、処理対象となる行の絞り込みができる。このWHEREキーワードから始まる一連の記述をWHERE句という。

WHERE句の基本

①処理対象行の絞り込みに用いる⇒WHEREを指定しないと「すべての行」が対象になる。

②SELECT、UPDATE、DELETE文で使用可能⇒INSERT文では使用できない。

③WHEREの後ろには条件式を記述する⇒絞り込み条件に沿った「正しい条件式」を記述する。

WHEREの後ろに記述できるのは、条件式と呼ばれる式だけです。

条件式

条件式とは、その結果が必ずになる式のことです。WHERE句に書けるのは、結果が必ず真(TRUE)または偽(FALSE)となる条件式。

WHERE句を含むSQL文を受け取ったDBMSは、テーブル中のすべての行について条件式が真になるか偽になるかをそれぞれ調べる。そして、真になった行についてのみ、SELECTやUPDATE、DELETEなどの処理を行う。

基本的な比較演算子

記号の左右にある値を比較して、記号の意味が正しければ真、正しくなければ偽に「化ける」役割を持っている。SQLの実行によって演算子などが別の値に変化することを「化ける」と表現する。

主な比較演算子
比較演算意味
=左辺の値が等しい
<左辺は右辺より小さい
>左辺は右辺より大きい
<=左辺は右辺の値以下
>=左辺は右辺の値以上
<>左右の値が等しくない

NULLとは

・そこに何も格納されていない、未定義であることを表す。

・数字のゼロや空白文字とも異なる。

0とNULLでは若干意味合いが違う。入金額に0とあった場合、0円だけどども入金があったとなる。NULLの場合は、入金が発生しなかった、または不明を表す。

列の値がNULLであることを判定するためにはIS NULL演算子、NULLでないことを判定するためにはIS NOT NULL演算子を使う。

正しいNULLの判定方法
SELECT *
FROM 家計簿
WHERE 出金額 IS NULL

=などの比較演算子でNULLは判定できない。その理由。
①比較演算子は、もともと値と値を比較するためのもの。よって、「値ではないNULL」を比較すると、不明な結果であるUNKNOWNになる。
②WHERE句による絞り込みは、条件式がTRUEとなる行だけが選ばれる。条件式がFALSEやUNKNOWNとなる行は対象にならない。

LIKE演算子

文字列があるパターンに合致しているかチェックすることをパターンマッチングという。SQLではこのパターンマッチングにLIKE演算子を使う。

LIKE演算子に使えるパターン文字
パターン文字意味
%任意の0文字以上の文字列
_任意の1文字

「%」は0文字以上の任意の文字列を意味する記号なので、「%1月%」は1月を含む文字列を表す。「%1月」は、1月という文字で終わることを意味する。「1月_」は1月で始まり、その後ろに任意の1文字がある文字列を表す。

%や_の文字そのものを含む文字列を部分検索したいときには、ESCAPE句を併用した記述を行う。なぜなら、%や_は特殊な意味の文字として扱われてしまうから。

SELECT * FROM 家計簿 WHERE メモ LIKE '%100$%' ESCAPE '$'

今回のエスケープ文字$に続く%や_は、ただの文字である%や_として扱われます。

BETWEEN演算子

BETWEEN演算子では、値が「値1以上かつ値2以下」な場合真になる。値がちょうど値1や値2の場合も真になる点に注意。

100~3000円の出費を取得するSELECT文
SELECT *
FROM 家計簿
WHERE 出金額 BETWEEN 100 AND 3000

IN/NOT IN演算子

IN演算子は、値がカッコ内に列挙した複数の値(値リスト)のいずれかに合致するかを判定する演算子です。=演算子では、1つの値との比較しかできないが、IN演算子を使えば、一度にたくさんの値と比較できる。

IN演算子による複数値との比較

式 IN ( 値1, 値2, 値3・・・)

食費・交際費を取得するSELECT文
SELECT *
FROM 家計簿
WHERE 費目 IN ( '食費', '交際費' )

食費でも交際費でもない行を取得する場合はNOT INを使う。

論理演算子

1つの条件式ではうまく行を絞り込めない場合、論理演算子を用いて、複数の条件を組み合わせることができる。

AND演算子とOR演算子

・2つの条件式の両方が真の場合だけ、真となる。条件式1 AND 条件式2

・2つの条件式のどちらかが真ならば、真となる。条件式1 OR 条件式2

ANDとORは、両辺に条件式を必要とする演算子。一方、右辺しか必要としないNOT演算子も存在する。NOTを記述すると、右辺の条件式の結果は、真は偽に、偽は真に逆転する。

論理演算子で条件式を組み合わせる際は、演算子が評価される優先順位に注意を払う必要がある。①NOT、②AND、③ORの優先順位に従って処理されていく。条件式にカッコをつけることによって、評価の優先順位を引き上げることができる。

主キーとその必要性

まったく同じデータの2行があった場合、データとしてはこの2行は同じものであり、区別をする手段がなくテーブルの1行だけを消そうとしても消せない。よほど特殊なことがないかぎり、テーブル中に重複した行が格納されるようなことは避けるべきとされている。

「この値を指定することで、ある1行を完全に特定できる」という役割を担う列、主キーを必ず持つべきである。主キーとは、「社員番号」や「電話番号」などがある。

内容が重複する可能性がある列は主キーとして利用することはできない。しかし、単独では重複の可能性がある列でも、複数を組み合わせれば重複する可能性が実質なくなる場合がある。複数の列を1つの主キーとして扱うものを複合主キーという。