MySQLの基本
MySQLの仕組み
MySQLでは、テーブルやインデックスのまとまりをデータベースと呼んでいます。インデックスとは、テーブルの検索速度を向上させるためのものです。スキーマという概念も、MySQLではデータベースと同じものをさす言葉として使われます。
データベース内に作成したテーブル(表)は、ディスク上に作成されたファイルのようなものだと考えられます。OSで多数のファイルを作るとき、ファイルの種類、目的、所有者などに応じて複数のディレクトリ(フォルダ)に分けて保存する、というのが普通です。
データベースでも、多数のテーブルを作るときに、テーブルの目的や所有者に応じて格納場所を別にすることで、分類できます。そのための仕組みがスキーマです。多くのデータベースにはスキーマ所有者という概念がありますが、MySQLには所有者の概念はありません。(図1-1.)
クエリとトランザクション
MySQLに限らず、データベースは、使用者が命令を発行することによって動作しています。この命令のことを、一般に、クエリと言います。
そして、そのクエリの集合を、トランザクションと言います。それらのクエリがすべて適用できた場合のみデータベースに反映します。ひとつでも適用に失敗したクエリがあった場合は、そのまとまりすべてのクエリの結果は反映されません。
トランザクションが必要となる簡単な例として、銀行の入出金システムを例にして考えてみましょう。銀行の業務の中では、指定の口座から別の口座にお金を移動させることが多くあります。(図1-2.)
たとえば、Aさんの口座から50万円をBさんの口座に、という具合です。このような処理を行う場合は、Aさんの口座残高を減らす処理と、Bさんの口座残高を増やす処理を連続して行う必要があります。
仮にトランザクションを利用せずにこの連続処理を実行し、Bさんの口座に対する処理に失敗した場合、問題が発生してしまいます。Aさんの口座からは預金が減る一方、Bさんの口座残高は増えず、お金が消えてしまうことになり、データに不整合が発生するからです。このような問題は、トランザクションを利用して解決することができます。(図1-3.)
先の例で言えば、Aさんの口座に対する処理、Bさんの口座に対する処理を1つのトランザクションとしてまとめ、すべての処理が成功した場合にのみ、口座に対する変更内容を確定するようにします。また、処理が一部でも失敗した場合は、すべての処理が取り消されます。このため、口座に対する変更は発生せず、データの整合性が維持されます。
コミットとロールバック
データベースのユーザーは、このトランザクションにおいて、大きく分けて2つの処理を行うことが出来ます。ひとつが、コミット(COMMIT)、そしてもうひとつがロールバック(ROLLBACK)です。
処理を確定する場合にはコミットします。一方、データベースに対する変更処理をすべて取り消す場合、ロールバックを行います。
注意したいのは、コミットされると、ロールバックによる処理の取消を行うことができなくなる点です。このため、処理の取消を行う場合は、コミットを行う前にROLLBACK文を実行する必要があります。
なお、同一パッケージないには、同じ名前のクラスが存在してはいけません。逆にいえば、パッケージが異なれば、同じクラス名が存在してもかまいません。(図1-4.)
データ型
数値に関するデータ型
MySQLでは、様々なデータ型が利用できます。ここでは、まずその一部として、数値関連のデータ型を紹介します。(表1-1.1-2.)
表1-1.整数型型 | バイト | 最小値 | 最大値 |
---|---|---|---|
TYNYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INTEGER | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
表1-2.浮動少数点型
型 | バイト | 最小値 | 最大値 |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38~ -1.175494351E-38 | 1.175494351E-38~ 3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308 ~-2.2250738585072014E-308 | 2.2250738585072014E-308 ~1.7976931348623157E+308 |
文字列型
続いて、文字列型を紹介します。(表1-3.)
表1-3.文字列型型 | バイト | 特徴 |
---|---|---|
CHAR | 255 | 固定長文字列 |
VARCHAR | 255 | 可変長文字列 |
TEXT | 65535 | 文章に利用 |
CHARは例えば長さを5とした場合CHAR(5)と入力します。仮に、「DOG」という3文字をここに格納すると、長さはあくまで5文字にこ残りの2文字スペースが入ります。これを固定長といいます。データを取り出すときはこのスペースは削除されます。
一方VAECHARはVARCHAR(5)と入力しますが、CHARの時と同様「DOG」という3文字を格納しても、カラムの長さは3文字で表現されます。ただし、両方とも、指定した文字列を超えた範囲の値が入力されると、オーバーした分がカットされますので、注意が必要です。
日付・時刻型
表1-4.日付・時刻型型 | 内容 | 範囲 |
---|---|---|
DATETIME | 日付と時刻 | ’1000-01-01 00:00:00’~ ’9999-12-31 23:59:59’ |
TIMESTAMP | 日付と時刻 | ’1970-01-01 00:00:01.000000’UTC~ ’2038-01-19 03:14:07.999999’ |
DATE | 日付 | ’1000-01-01’~’9999-12-31’ |
TIME | 時刻 | ’-838:59:59~838:59:59’ |
YEAR | 時刻 | ’1901~2155’ |
日付・時刻型の入力には「”」ダブルクォーテーションまたは「’」シングルクォーテーションを入力します。MySQLには、この他にも様々なデータ型が存在しますが、ほとんどのケースがここで紹介したデータ型で対処できるといってよいでしょう。
NULL型
データ型について説明すると同時に、どのデータ型でも現れる、NULL(ヌル)値について説明しておきましょう。NULL値はデータが存在しないことを表す値です。文字列における空文字''や数値における0とは異なります。
テーブルを作成し、データを作成したものの、列情報を挿入する際に、情報が追加されなかった列などがNULLになります。
SQL命令
SQL命令の種類
続いて、MySQLのSQL文について説明します。MySQLに限らず、SQLの命令には、大きく分けて、DDL、DML、DCLの3種類が存在します。
一つ目はDDL(Data Definition Language:データ定義言語)です。データベースやテーブルを作成するときに使います。二つ目はDML(Data Manipulation Language:データ操作言語)で、データを操作するときに使います。例えば、テーブルからデータを取得したり、テーブルにデータを追加するときに必要です。最後はDCL(DataControl Language:データ制御言語)です。トランザクション制御(データの整合性を保つための機能)などに使用します。(表5-1.)
表1-5.主なSQLの命令の分類名前 | 略称 | 命令 | 内容 |
---|---|---|---|
データ定義言語 | DDL | CREATE | データベース・テーブルの生成 |
ALTER | テーブルの変更 | ||
DROP | データベース・テーブルの削除 | ||
データ操作言語 | DML | INSERT | レコードの追加 |
DELETE | レコードの削除 | ||
UPDATE | レコードの更新 | ||
SELET | レコードの取得 | ||
データ制御言語 | DCL | COMMIT | 更新処理の確定 |
ROLLBACK | 更新処理の放棄 | ||
SAVEPOINT | セーブポイントの設定 |
SQLの予約語
予約語とは、SQLの命令として定義されている単語などで、半角のアルファベット文字が使われています。表1-5.の主なSQLの命令の分類で挙げたSQLはすべて予約語です。
大文字と小文字の区別
MySQLでは、テーブル名や列名を指定する際、大文字と小文字の違いは無視します。ただ、テーブル内部のデータに関しては区別されるので注意が必要です。そのため、以下のSQL文は全て同じ意味のものとみなされます。
大文字と小文字の区別SELECT * FROM sample; select * from sample; SELECT * FROM SAMPLE;
ただ、一般的にリレーショナルデータベースの種類によってはテーブル名の大文字・小文字を区別することがあるので注意が必要です。
ここではSQL文を読みやすくするために、予約語であるSQLのキーワードを大文字で、その他についてはテーブルに定義されている通りに記述するものとします。
リテラル
SQL文中に書かれる具体的なデータのことをリテラルと呼びます。SQLではテーブル内部のデータ等をSQL文にリテラルとして記述します。リテラルには、以下のような種類と、記述のルールがあります。(表1-6.)
表1-6.SQLのリテラル名前 | 内容 | 記入例 |
---|---|---|
数値リテラル | 数値を表すリテラルを数値リテラルと呼びます。 数値リテラルは半角数字で表記します。 | 101 2015 |
文字リテラル | 文字列を表すのが文字リテラルです。 「 ' (シングルクォーテーション)」か「 "(ダブルクォーテーション) 」で囲みます。 数字も「 ' 」や「 " 」で囲めば文字列リテラルになります。 | 'abcdef' 'あいうえお' '123456' |
日付リテラル | 日付や時刻を表すリテラルです。 文字列リテラルと同じように「 ' 」か「 " 」で囲みます。 | '1972-12-05' '2015-10-04 12:11:40' |
また、各データ型とリテラルの対応は、以下のようになります。(表1-7.)
表1-7.リテラルと対応するデータ型リテラル | データ型 |
---|---|
数値リテラル | TINYINT,SMALLINT,MEDIUMINT,INTEGER,BIGINTほか |
文字リテラル | CHAR,VARCHAR,TEXTほか |
日付リテラル | DATE,DATETIME,TIMESTAMPほか |
以上を踏まえ、2日目以降は、実際にこれらの命令を駆使して、テーブルを作成・変更したり、その中のデータを検索する方法について学習します。