MySQLの基本

MySQLの仕組み

MySQLでは、テーブルインデックスのまとまりをデータベースと呼んでいます。インデックスとは、テーブルの検索速度を向上させるためのものです。スキーマという概念も、MySQLではデータベースと同じものをさす言葉として使われます。

データベース内に作成したテーブル(表)は、ディスク上に作成されたファイルのようなものだと考えられます。OSで多数のファイルを作るとき、ファイルの種類、目的、所有者などに応じて複数のディレクトリ(フォルダ)に分けて保存する、というのが普通です。

データベースでも、多数のテーブルを作るときに、テーブルの目的や所有者に応じて格納場所を別にすることで、分類できます。そのための仕組みがスキーマです。多くのデータベースにはスキーマ所有者という概念がありますが、MySQLには所有者の概念はありません。(図1-1.)

図1-1.MySQLと他のデータベースの違い
MySQLと他のデータベースの違い

クエリとトランザクション

MySQLに限らず、データベースは、使用者が命令を発行することによって動作しています。この命令のことを、一般に、クエリと言います。

そして、そのクエリの集合を、トランザクションと言います。それらのクエリがすべて適用できた場合のみデータベースに反映します。ひとつでも適用に失敗したクエリがあった場合は、そのまとまりすべてのクエリの結果は反映されません。

トランザクションが必要となる簡単な例として、銀行の入出金システムを例にして考えてみましょう。銀行の業務の中では、指定の口座から別の口座にお金を移動させることが多くあります。(図1-2.)

図1-2.トランザクション①(成功した場合)
トランザクション①(成功した場合)

たとえば、Aさんの口座から50万円をBさんの口座に、という具合です。このような処理を行う場合は、Aさんの口座残高を減らす処理と、Bさんの口座残高を増やす処理を連続して行う必要があります。

仮にトランザクションを利用せずにこの連続処理を実行し、Bさんの口座に対する処理に失敗した場合、問題が発生してしまいます。Aさんの口座からは預金が減る一方、Bさんの口座残高は増えず、お金が消えてしまうことになり、データに不整合が発生するからです。このような問題は、トランザクションを利用して解決することができます。(図1-3.)

図1-3.トランザクション②(失敗した場合)
トランザクション②(失敗した場合)

先の例で言えば、Aさんの口座に対する処理、Bさんの口座に対する処理を1つのトランザクションとしてまとめ、すべての処理が成功した場合にのみ、口座に対する変更内容を確定するようにします。また、処理が一部でも失敗した場合は、すべての処理が取り消されます。このため、口座に対する変更は発生せず、データの整合性が維持されます。

コミットとロールバック

データベースのユーザーは、このトランザクションにおいて、大きく分けて2つの処理を行うことが出来ます。ひとつが、コミット(COMMIT)、そしてもうひとつがロールバック(ROLLBACK)です。

処理を確定する場合にはコミットします。一方、データベースに対する変更処理をすべて取り消す場合、ロールバックを行います。

注意したいのは、コミットされると、ロールバックによる処理の取消を行うことができなくなる点です。このため、処理の取消を行う場合は、コミットを行う前にROLLBACK文を実行する必要があります。

なお、同一パッケージないには、同じ名前のクラスが存在してはいけません。逆にいえば、パッケージが異なれば、同じクラス名が存在してもかまいません。(図1-4.)

図1-4.コミットとロールバック
コミットとロールバック

データ型

数値に関するデータ型

MySQLでは、様々なデータ型が利用できます。ここでは、まずその一部として、数値関連のデータ型を紹介します。(表1-1.1-2.)

表1-1.整数型
バイト最小値最大値
TYNYINT1-128127
SMALLINT2-3276832767
MEDIUMINT3-83886088388607
INTEGER4-21474836482147483647
BIGINT8-92233720368547758089223372036854775807

表1-2.浮動少数点型
バイト最小値最大値
FLOAT4-3.402823466E+38~
-1.175494351E-38
1.175494351E-38~
3.402823466E+38
DOUBLE8-1.7976931348623157E+308
~-2.2250738585072014E-308
2.2250738585072014E-308
~1.7976931348623157E+308

文字列型

続いて、文字列型を紹介します。(表1-3.)

表1-3.文字列型
バイト特徴
CHAR255固定長文字列
VARCHAR255可変長文字列
TEXT65535文章に利用

CHARは例えば長さを5とした場合CHAR(5)と入力します。仮に、「DOG」という3文字をここに格納すると、長さはあくまで5文字にこ残りの2文字スペースが入ります。これを固定長といいます。データを取り出すときはこのスペースは削除されます。

一方VAECHARはVARCHAR(5)と入力しますが、CHARの時と同様「DOG」という3文字を格納しても、カラムの長さは3文字で表現されます。ただし、両方とも、指定した文字列を超えた範囲の値が入力されると、オーバーした分がカットされますので、注意が必要です。

図1-5.CHARとVARCHAR
CHARとVARCHA

日付・時刻型

表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の命令には、大きく分けて、DDLDMLDCLの3種類が存在します。

一つ目はDDL(Data Definition Language:データ定義言語)です。データベースやテーブルを作成するときに使います。二つ目はDML(Data Manipulation Language:データ操作言語)で、データを操作するときに使います。例えば、テーブルからデータを取得したり、テーブルにデータを追加するときに必要です。最後はDCL(DataControl Language:データ制御言語)です。トランザクション制御(データの整合性を保つための機能)などに使用します。(表5-1.)

表1-5.主なSQLの命令の分類
名前略称命令内容
データ定義言語DDLCREATEデータベース・テーブルの生成
ALTERテーブルの変更
DROPデータベース・テーブルの削除
データ操作言語DMLINSERTレコードの追加
DELETEレコードの削除
UPDATEレコードの更新
SELETレコードの取得
データ制御言語DCLCOMMIT更新処理の確定
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日目以降は、実際にこれらの命令を駆使して、テーブルを作成・変更したり、その中のデータを検索する方法について学習します。