データベースとは、検索や書き換え、分析などのデータ管理を目的としてさまざまな情報を蓄積したもの。ITの世界では、電子的な媒体にファイルなどの形式で保存、蓄積したものを指す。現在、分野を問わず広く用いられているのが、複数の表の形式でデータを管理するリーレーショナルデータベースである。
・RDBには複数の表が入っており、個々の表をテーブル(table)という。
・個々のテーブルには名前(テーブル名)が付いている。
・テーブルは列(column)と行(row)で構成される。
・1つの行が1件のデータに対応し、列はそのデータの要素に対応する。
*列のことをカラムやフィールドと呼ぶこともある。
データベースは単なる情報の集まりに過ぎず、その実態はファイルである。ファイルに対してSQLで書かれた命令を送っても、検索や書き換えができるわけではない。私たちがSQLを送る相手は、データベースファイルではなく、データベース管理システムと呼ばれるプログラムである。DBMSはコンピュータ内で常に稼働してSQLを待ち受けており、届いた内容に従って、データベースファイルの内容を検索したり、書き換えたりする処理を実行してくれる。
分類 | RDBMS製品名 | 提供元 |
---|---|---|
商用製品 | Oracle Database | オラクル社 |
DB2 | IBM社 | |
SQL Server | マイクロソフト社 | |
OSS | MySQL | オラクル社 |
PostgreSQL | PostgreSQL Global Development Group | |
SQLite | D.Richard Hipp | |
H2 Database | Thomas Mueller |
通常、DBMSに対しては、ネットワーク経由でSQLを送る。この送信は各データベースが定める特有の手順に従う必要があるため、たとえばメールソフトなどを使ってSQLを送ることはできない。各データベース製品では、DBMSと通信を行うための専用プログラムが提供されている。
SELECTには目的とする列名を、FROMには検索したいテーブル名を記述する。
すべての列を指定する場合「*」にすることで短縮できる。「*」には、すべての列という意味があるから。
SELECT文の最後にWHEREで始まる記述を加える。
INSERT INTOで追加先のテーブルを、VALUESで追加するデータを指定する。
ここまで紹介した4つの文のうち、SELECT、UPDATE、DELETEで始まる分の動作は、次のように整理できる。
SELECT文 : ある条件を満たす行を探す⇒その行の内容を取得する
UPDATE文 : ある条件を満たす行を探す⇒その行の内容を書き換える
DELETE文⇒その行を削除する
●まずは、すべてのSQLに共通する基本ルールを押さえておこう。
・文の途中に改行を入れることができる。
・行の先頭や行の途中に半角の空白を入れることができる。
●SQLは文の途中で改行することが許されている。また、行の先頭や行の途中に空白を入れることも可能。これらのルールを活用して、読みやすく整形されたSQL文の記述を心がける。
・ハイフン2つ(--)から行末まではコメントになり、無視される。
・/*から*/まではコメントになり、無視される。
●最後に、SQL文に記述できる語句について、ルールを紹介しよう。
・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には、数えるほどしか命令はない。ほとんどのデータ操作は、SELECT、UPDATE、DALETE、INSERTの4つの命令で実現できてしまう。この4つのSQL命令は、DMLと総称される。
・SQLでデータ処理を行うには、命令をたくさん覚える必要はない。
・4大命令だけで、ほとんどの処理を実現できる。
4つの命令に様々な修飾語のようなものを付加することで非常に複雑なデータ操作をできることが、SQLという言語の特徴。
データベースから目的のデータを指定して取得することが役割。
SELECT 列名・・・→列名のデータを・・・取得しなさい
FROM テーブル名 →このテーブルから
(WHERE修飾)
SELECT文における列名やテーブル名の指定では、それぞれの記述の後ろに「AS+任意のキーワード」を付けることで、別名を定義することができる。
・結果表における列のタイトルを任意のものに変更できる。
・わかりにくい列名や長い列名でも、わかりやすく短い別名を付けて利用することができる。
すでにテーブルに存在するデータを書き換えるための命令。
UPDATE テーブル名 →このテーブルの情報を・・・更新しなさい
SET 列名1=値1, 列名2=値2・・・ →値1のデータで・・・列名1を
(WHERE修飾)
WHEREで目的の行を指定しないで実行してしまうと。すべての行に適用されてしまうので注意。「WHEREを伴わないUPDATE文」は、ほとんど使う機会がないでしょう。
すでにテーブルに存在する行を削除するための命令。特定の列だけを指定することはできない。
DELETE →削除しなさい
FROM テーブル名 →このテーブルの情報を
(WHERE修飾)
DELETE文では列名を指定する必要がない。UPDATE文と同様、WHEREをつけなければすべての列が対象になってしまう。
テーブルに新しいデータを追加するための命令。これまでの3つの命令とは異なり、テーブルの行を指定するしくみ(WHERE)はない。そのかわり、どこに、どのようなデータを追加するのかを指定する構造になっている。
INSERT INTO テーブル名 →このテーブルに
(列名1, 列名2, 列名3・・・)→この列に
VALUES (値1, 値2, 値3・・・)→このデータ
SQL文の中でWHEREを使うことで、処理対象となる行の絞り込みができる。このWHEREキーワードから始まる一連の記述をWHERE句という。
①処理対象行の絞り込みに用いる⇒WHEREを指定しないと「すべての行」が対象になる。
②SELECT、UPDATE、DELETE文で使用可能⇒INSERT文では使用できない。
③WHEREの後ろには条件式を記述する⇒絞り込み条件に沿った「正しい条件式」を記述する。
WHEREの後ろに記述できるのは、条件式と呼ばれる式だけです。
条件式とは、その結果が必ず真か偽になる式のことです。WHERE句に書けるのは、結果が必ず真(TRUE)または偽(FALSE)となる条件式。
WHERE句を含むSQL文を受け取ったDBMSは、テーブル中のすべての行について条件式が真になるか偽になるかをそれぞれ調べる。そして、真になった行についてのみ、SELECTやUPDATE、DELETEなどの処理を行う。
記号の左右にある値を比較して、記号の意味が正しければ真、正しくなければ偽に「化ける」役割を持っている。SQLの実行によって演算子などが別の値に変化することを「化ける」と表現する。
比較演算 | 意味 |
---|---|
= | 左辺の値が等しい |
< | 左辺は右辺より小さい |
> | 左辺は右辺より大きい |
<= | 左辺は右辺の値以下 |
>= | 左辺は右辺の値以上 |
<> | 左右の値が等しくない |
・そこに何も格納されていない、未定義であることを表す。
・数字のゼロや空白文字とも異なる。
0とNULLでは若干意味合いが違う。入金額に0とあった場合、0円だけどども入金があったとなる。NULLの場合は、入金が発生しなかった、または不明を表す。
列の値がNULLであることを判定するためにはIS NULL演算子、NULLでないことを判定するためにはIS NOT NULL演算子を使う。
=などの比較演算子でNULLは判定できない。その理由。
①比較演算子は、もともと値と値を比較するためのもの。よって、「値ではないNULL」を比較すると、不明な結果であるUNKNOWNになる。
②WHERE句による絞り込みは、条件式がTRUEとなる行だけが選ばれる。条件式がFALSEやUNKNOWNとなる行は対象にならない。
文字列があるパターンに合致しているかチェックすることをパターンマッチングという。SQLではこのパターンマッチングにLIKE演算子を使う。
パターン文字 | 意味 |
---|---|
% | 任意の0文字以上の文字列 |
_ | 任意の1文字 |
「%」は0文字以上の任意の文字列を意味する記号なので、「%1月%」は1月を含む文字列を表す。「%1月」は、1月という文字で終わることを意味する。「1月_」は1月で始まり、その後ろに任意の1文字がある文字列を表す。
%や_の文字そのものを含む文字列を部分検索したいときには、ESCAPE句を併用した記述を行う。なぜなら、%や_は特殊な意味の文字として扱われてしまうから。
今回のエスケープ文字$に続く%や_は、ただの文字である%や_として扱われます。
BETWEEN演算子では、値が「値1以上かつ値2以下」な場合真になる。値がちょうど値1や値2の場合も真になる点に注意。
IN演算子は、値がカッコ内に列挙した複数の値(値リスト)のいずれかに合致するかを判定する演算子です。=演算子では、1つの値との比較しかできないが、IN演算子を使えば、一度にたくさんの値と比較できる。
式 IN ( 値1, 値2, 値3・・・)
食費でも交際費でもない行を取得する場合はNOT INを使う。
1つの条件式ではうまく行を絞り込めない場合、論理演算子を用いて、複数の条件を組み合わせることができる。
・2つの条件式の両方が真の場合だけ、真となる。条件式1 AND 条件式2
・2つの条件式のどちらかが真ならば、真となる。条件式1 OR 条件式2
ANDとORは、両辺に条件式を必要とする演算子。一方、右辺しか必要としないNOT演算子も存在する。NOTを記述すると、右辺の条件式の結果は、真は偽に、偽は真に逆転する。
論理演算子で条件式を組み合わせる際は、演算子が評価される優先順位に注意を払う必要がある。①NOT、②AND、③ORの優先順位に従って処理されていく。条件式にカッコをつけることによって、評価の優先順位を引き上げることができる。
まったく同じデータの2行があった場合、データとしてはこの2行は同じものであり、区別をする手段がなくテーブルの1行だけを消そうとしても消せない。よほど特殊なことがないかぎり、テーブル中に重複した行が格納されるようなことは避けるべきとされている。
「この値を指定することで、ある1行を完全に特定できる」という役割を担う列、主キーを必ず持つべきである。主キーとは、「社員番号」や「電話番号」などがある。
内容が重複する可能性がある列は主キーとして利用することはできない。しかし、単独では重複の可能性がある列でも、複数を組み合わせれば重複する可能性が実質なくなる場合がある。複数の列を1つの主キーとして扱うものを複合主キーという。