「データベース」の『SQL』動作の概要と「MySQL」の『SQL文』の文法、『SQLコマンド』操作
- 「MySQL」環境の『SQL』動作の概要と『SQL文』の文法と『SQLコマンド』によるデータベース操作を説明する内容です。
- 「リレーショナルデータベース」は、テーブルとテーブルの関連付けが特徴であり、DBサーバへのアクセスは、『SQL』文のコマンドによって操作することの動作の概要、加えて、「MySQL」のプライマリーキーと外部キー制約やスキーマとデータベースの相違点など理解します。
- 「MySQLのSQL」の記述方法と項目(フィールド)の「データ型」などコマンド文法によるデータベース作成、テーブルの構成表示、データベース内の検索などをコマンドプロンプトによる操作を理解します。
『SQL』動作の概要と「MySQL」の『SQL文』の文法及び『SQLコマンド』によるデータベース操作
「MySQL」環境の『SQL』処理※画像クリックで拡大表示(リンク)
- リレーショナルデータベース「RDB」のSQL処理の概要
RDBでは、基本要素(データベース・オブジェクト)を「テーブル」で表現し、「テーブル」の集まりを「データベース」で、例えば「名簿管理データベース」と呼びます。「テーブル」は、複数の「行:レコード」(row)から構成され、行は「列:フィールド」(column)から構成されます。
あるテーブルと別のテーブルの「フィールド」で関係付け(親と子のリレーション)し、連携させて、データの一意性(重複なし)を実現しています。
- クライアント端末のコマンドプロンプトやPHPなどのプログラムから、データベースシステム(DBサーバ)に対して「SQL」文で記述してRDBMSへ送信し、SQL文の文法解析する。SQL文がOKのときにSQLのデータベース関数などを実行し、結果をクライアント側へ戻す処理形態です。
- 「SQL」は、体系的にデータ構造の作成:変更できる「DDL」、データの内容(レコード)を追加・変更・削除・検索できる「DML」、データの制御・管理・復旧できる「DCL」から構成され、命令文や制御文(コマンド)として実行します。
- 「SQL」の構成
| 内容 | 代表的なコマンド |
| データ定義言語:DDL(Data Definition Language) |
- データを格納すべき表の定義
- 複数の表を関連づけるための規約や制約
- データベースに必要な機密保護の宣言
- 仮想的なテーブル(ビュー)作成と削除
|
CREATE テーブルやインデックス作成 |
DROP テーブルやインデックス削除 |
ALTER データの定義内容を変更 |
CREATE VIEW ビュー作成 drop VIEW ビュー削除 |
| データ操作言語:DML(Data Manipulation Language) |
- 表に対するデータの登録・修正・削除
- 複数の表の結合、ビュー表の作成などの集合操作
- 表中のデータを検索
|
INSERT テーブルに新しい値を挿入 |
UPDATE テーブルの値を更新 |
DELETE テーブルから値を削除 |
SELECT テーブルから値を取得 |
| データ制御言語:DCL(Data Control Language) |
- データベースのユーザー権限の管理やデータのトランザクション処理を行う為の言語
- 回復・同時実行のための最小単位として保障される一連の処理の操作
|
GRANT 権限の付加 |
SHOW DB定義の構造表示 |
BEGIN トランザクションを開始 |
COMMIT トランザクションを確定 |
ROLLBACK トランザクションを取消す |
「MySQL」のキーとスキーマ
- 「プライマリーキー制約」と「外部キー制約」

プライマリーキー制約は、テーブルには、1つの「プライマリキー(主キー)」を設定でき、テーブルの中で1つまたは複数の列を指定可能で、値は重複してはならず(ユニーク)、NULL(何も値が入っていない状態)でない必要があります。
外部キー(FK)制約は、データ整合性を保つためテーブルの各行の外部キー値は、親のテーブル値と一致している必要あり、テーブルの行を削除及び更新すると、その行を参照していた別の列の値がなくなってしまうようなデータ矛盾を防ぐことができます。
テーブル作成のCREATE文やテーブル情報変更のALTER文の外部参照の「FOREIGNKEY」を付加してテーブルとテーブルとの関係(リレーション)を指定する必要があります。
- インデックスキーは、
大量のデータや検索頻度の高いテーブルに対して、高速に検索するために利用し、キーとレコード位置(ポインター)を抽出して作成されたものです。
- MySQLのスキーマ
一般的なスキーマは、ユーザーと関連付けたりオブジェクトの所有者との関連で「データベース(構造)」と考えますが、MySQLではユーザー認証や権限のみに利用し、スキーマを利用せずに「データベース」としての取扱い方をします。
「MySQL」の『SQL』文法
- 「SQL」文の記述規則
- 予約語は、SELECT, FROM, WHERE, INSERT, UPDATE, DELETE, CREATE, GRANTなどの命令文や属性語(句)など利用できないが、利用したい場合は、[予約語]のように「[」と「]」で括ります。
- 大小文字の区別がありません。
- コメント行は、複数行の「/* ~ */」で囲まれた部分と1行単位の「--」(ハイフォン2個)があります。
- 命令文の文末は、「;」(セミコロン)です。
※SQL serverは不要です。
- 空白文字は、半角スペース、TAB、改行で連続した場合でも1文字として扱われます。
- 文字定数の文字列の場合、シングルクォーテーション「'~'」又はダブルクォーテーション「"~"」で括ります。
- 数値定数の場合、整数「10」、小数点「10.5」、指数「1.5e10」、16進数「0xFF」などで表現します。
- 日付は、シングルクォーテーション「'~'」又はダブルクォーテーション「"~"」で括ります
- 期間は、MySQLの場合、シングル又はダブルクォーテーションで括る必要なく、「INTERVAL 5 DAY」にINTERVALの属性キーワードを付けて指定します。
- MySQLの基本的なデータ型は、
数値、文字列、日付の3種類あり、大きなデータを扱うLOB(Large Object)やイメージの型の利用可能です。
- 数値型
| 型 | 範囲「サイン付き」 | バイト数 |
| 範囲「サインなし」 |
| TINYINT | -128~127 | 1 |
| 0~255 |
| SMALLINT | -32768~32767 | 2 |
| 0~65535 |
| MEDIUMINT | -8388608~8388607 | 3 |
| 0~ 16777215 |
INT INTEGER | -2147483648~ 2147483647 | 4 |
| 0~ 4294967295 |
| BIGINT | -9223372036854775808 ~9223372036854775807 | 8 |
| 0~ 18446744073709551615 |
NUMERIC[(n[,d])] DECIMAL,DEC | | 4(pack型) |
例: DECIMAL(5,2)→DECIMAL や NUMERIC カラムを宣言する時は、精度(その値に格納された有効な桁数を表す)とスケール(小数点以下に格納できる桁数)を指定する事ができます。(5は精度、2がスケール)
- 浮動小数点型
| 型 | 範囲 | バイト数 |
| FLOAT(x) | x:4 or 8 (浮動小数点) | 4~53 |
| DOUBLE [PRECISION] [(n,d)] | 倍精度の浮動小数点 | 8 |
| REAL | 倍精度の浮動小数点 | 8 |
| BIT(n) | ビットフィールド値 n:1から64までが可能 | 約(n+7)/8 |
- 日付型
| 型 | 表示形式 | バイト数 |
DATE 日付 | 'YYYY-MM-DD' | 3 |
DATETIME 日付と時刻 | 'YYYY-MM-DD HH:MM:SS' | 8 |
TIMESTAMP 日付と時刻 | 'YYYY-MM-DD HH:MM:SS' | 4 |
TIME 時刻 | 'HH:MM:SS' | 3 |
YEAR[(n)] 年(n:2 or 4) | YYYY | 1 |
- 文字列型(L と n の値は文字数)
| 型 | 文字数 | バイト数 |
CHAR(n) 固定長文字列 | 0 <= n <= 255 | n |
VARCHAR(n) 可変長文字列 | 0 <= n <= 255 256 <= n <= 65535 | n+1 n+2 |
TINYTEXT 可変長文字列 | 255 | L+1 (L<28) |
TEXT 可変長文字列 | 65,535 | L+2 (L<255) |
MEDIUMTEXT 可変長文字列 | 1,677,215 | L+3 (L<224) |
LONGTEXT 可変長文字列 | 4,294,967,295 | L+4 (L<232) |
- バイナリデータ型(L と n の値はバイト数)
| 型 | 範囲(バイト) | バイト数 |
| BINARY(n) | 0 <= n <= 255 | n |
| VARBINARY(n) | 0 <= n <= 255 256 <= n <= 65535 | n+1 n+2 |
| TINYBLOB | 255 | L+1 (L<28) |
| BLOB | 65,535 | L+2 (L<255) |
| MEDIUMBLOB | 1,677,215 | L+3 (L<224) |
| LONGBLOB | 4,294,967,295 | L+4 (L<232) |
- 列挙型
| 型 | 最高値 | バイト数 |
ENUM('value1',...) 括弧内に指定された任意の文字列 | 65,535値 | 1 or 2 |
SET('value1',...) 括弧内に指定された任意の文字列の組み合わせ | 64メンバ | 1/2/3/4/8 |
- 名簿DBの「ER図」とフィールド内容の事例
「名簿DB」には、名簿テーブル「persons」と県名テーブル「prefecture」、市名テーブル「city」の構成です。
- プライマリキーは、
名簿テーブルが「seq_num」、県名テーブルが「code」、市名テーブル「code」です。
- 名簿テーブルの外部キー(FX)は、
「pref_code」が県名テーブルの「code」と関係し、「city_code」が市名テーブルの「code」と関係しています。
「名簿(persons)」テーブルのフィールド設定内容は、
- 「シーケンスNo」は、
プライマリーキーであり、「auto_increment」を指定することで入力しなくても自動的に番号付けされます。
- 「更新日」は、
「CURRENT_TIMESTAMP」を指定することで入力しなくてもレコードの追加・変更時に実行時の日付・時刻が挿入されます。
- 「誕生日」は、
「必須」指定がないので、入力しなくてもエラーとならず、入力しないと「デフォルト値」('0000-00-00')が自動挿入されます。
- ER図作成「A5:SQL Mk-2」ツールを利用したDDL作成
【ER図作成ツール】のダウンロードサイト

「A5:SQL Mk-2」ツールに「DDL作成」機能があり、ER図を作成した内容から「sql」ファイルとして保存ができます。

- ER図とデータベース設計、DDL生成の詳細は、
WEBデザイン・開発講義:「システム設計とWEBデザイン」にある「ER図とデータベース設計」と「セキュリティ対策とDB対応、DDL生成と実装」を参照して下さい。
『MySQLのSQL』の主なコマンド操作
これから「MySQL」のコマンドプロンプト操作する上で、サンプルの「名簿DB」(データベース名「list_db」)を通して、データベースの作成、挿入・修正・削除などの操作と「SQL」文法を説明します。
- 「SQL」コマンドプロンプトの起動と終了
| 操作内容 | SQLコマンド |
| 操作例 |
データベース接続 (シェルコマンド) | mysql -u[ユーザ名] [-p][パスワード] ※[-p]とパスワードの間にスペースなし |
| > mysql -u root -padmin |
| 使用データベースの指定 | use データベース名 |
| sql> USE list_db; |
コマンドプロンプトのコード変換 (使用データベースの文字セット名) | set names [コード名] ※コード名は、ハイフンを含まない:「Shift_JIS」は"cp932"、 「UTF-8」は"utf8" |
| sql> SET NAMES cp932; |
| データベース切断 | exit 又は quit |
sql> exit; sql> quit; |
| 外部ファイルからのSQL文入力 | source [ファイルパス] ※パスは、クォーテーションなし |
| sql> SOURCE C:\user\list_db_DDL.sql |
- 「MySQL」のコマンドプロンプトの起動は、
2種類の方法があり、「すべてのプログラム」→「MySQL」→「MySQL Server 5.5」→「MySQL Command Line...」を選択して起動する場合、プロンプトで「Enter password:」が表示されるので「パスワード」(admin)を入力します。
別の方法は、通常のコマンドプロンプトで「MySQL」起動して「ユーザ名」(root)と「パスワード」(admin)を入力する場合があります。
- 「MySQL」コマンドの使用データベースの指定は、
「名簿DB」(list_db)を選択する場合のコマンドは、「USE list_db;」を入力します。
- 「MySQL」コマンドプロンプトの文字コード設定
MySQLの保存の文字コードが「UTF-8」であり、Windows-OSのコマンドプロンプトが「Shift_JIS」のため、コマンド入力・表示の文字コードを「Shift_JIS」に設定をする必要があり、「SET NAMES cp932;」コマンドを入力します。
MySQLのコマンド起動から、SET文、CREATE database文で「名簿DB」作成とUSE文の操作方法
- 【DDL】コマンド
| 操作内容 | SQLコマンド |
| 操作例 |
| データベース作成 | create database [データベース]文 |
| sql> CREATE database list_db; |
| テーブル作成 | create table [テーブル名]文 |
sql> CREATE table persons ( -> code int,name varchar(128), -> PRIMARY KEY-> (code)); |
| テーブル修正 | alter table [テーブル名]文 |
sql> ALTER table city MODIFY name -> city_name; |
| テーブル削除 | drop table [テーブル名]文 |
| sql> DROP table persons; |
| データベース一覧表示 | show databases文 |
| sql> SHOW databases; |
| テーブル一覧表示 | show tables文 |
| sql> SHOW tables; |
| 項目内容一覧表示 | show fields from [テーブル名]文 describe [テーブル名]文 |
sql> SHOW fields from persons; sql> DESCRIBE persons; |
- 「MySQL」のデータベース作成コマンドは、
「Shift_JIS」コードを設定し、「CREATE DATABASE list_db;」のコマンドを入力すると作成できます。データベース作成した後、そのデータベースを利用するため、「USE DATABASE list_db;」のコマンドを入力します。
- 「MySQL」のテーブル作成コマンドは、
「CREATE TABLE persons ( ... );」のコマンドを入力します。作成したテーブルのカラム(フィールド)の内容を参照するために「DESCRIBE persons;」のコマンドを入力します。

各カラムは、「,」区切りします。「seq_num」カラムに対して、自動番号付けの「auto_increment」とプライマリーキー制約の「primary key」を付加します。省略値を指定するには、「default xxx」、必須の場合は「not null」を付加します。
外部(参照照合)キー制約の設定は、参照先のテーブルがないとエラーとなるので、前もってテーブル作成しておく必要があります。「foreign key (カラム名) references 参照先テーブル名(親カラム名)」を入力します。
テーブルカラム表示で「key」列の内容は、プライマリキーは「PRI」、外部キーは特定の値の複数あることで「MUL」(Multi)が表示されます。
CREATE文で「県名と市名テーブル」作成とDESCRIBE文の操作方法
CREATE文で「名簿テーブル」作成の操作方法
- 「sql」ファイルから一括DDLの作成
ER図ツールで作成した「sql」ファイルから一括に入力する「SOURCE パス名」コマンドを利用します。

DESCRIBE文、DROP文、SHOW文とSOURCE文を利用したDDLファイルの操作方法
- 【DML】コマンド
| 操作内容 | SQLコマンド |
| 操作例 |
| レコード挿入 | insert into [テーブル名] values('xxx',...) |
sql> INSERT INTO persons VALUES -> (1,'友子','1970-1-1','tomoko@xx.yy','KGW', -> 'K01',now()); |
レコード挿入 の項目選択 | insert into [テーブル名] (項目名,...) values('xxx',...) |
sql> INSERT INTO persons (seq_num,name) -> VALUES(1,'てすと'); |
| レコード更新 | update [テーブル名] set 文 |
sql> UPDATE persons SET name='弥生' -> WHERE seq_num = 2; |
| レコード削除 | delete from [テーブル名] 文 |
sql> DELETE FROM persons WHERE -> seq_num = 2; |
| レコード検索(選択) | SELECT文(all) |
| sql> SELECT * FROM city; |
レコード検索 複数テーブル | SELECT WHERE xxx = xxx 文 |
sql> SELECT persons.name, -> prefecture.name,city.name FROM -> persons,prefecture,city WHERE -> persons.pref_code = prefecture.code -> AND persons.city_code = city.code; |
レコード検索 join(外部) | SELECT LEFT JOIN文 |
sql> SELECT * FROM persons LEFT JOIN -> city ON persons.city_code = city.code; |
レコード検索 複数join(内部) | SELECT INNER JOIN文 |
sql> SELECT persons.name, -> city.name,prefecture.name FROM persons -> INNER JOIN city ON -> city_code=city.code -> INNER JOIN prefecture ON -> pref_code = prefecture.code; |
- 「名簿DB」の挿入レコードは、次の内容とします。
- 「県名」テーブルのレコード挿入のコマンドは、
必須のレコードのみの入力としたいので、カラム名(フィールド)を指定した「INSERT INTO prefecture (code,name) VALUES ( ... ),( ... ), ...;」コマンドを入力します。
※valuesの後の( ... )は、1レコード分を意味し、コンマ区切りで連続したレコードの挿入ができます。

レコード挿入した内容の一覧を確認するため、「SELECT * FROM prefecture;」コマンドを入力します。
※「*」は、ワイルドカードですべてを意味します。
- 同様に「市名」テーブルもレコード挿入します。
- 「名簿」テーブルのレコード挿入のコマンドは、
外部キーの設定をしているため、親の「県名」テーブルと「市名」テーブルがレコード挿入済みでないとエラーとなります。逆にテーブル削除する場合は、外部キー設定のテーブルから「DROP」する必要があります。レコード挿入のカラム名(フィールド)を指定した「INSERT INTO persons (name,birth,email,pref_code,city_code) VALUES ( ... ),( ... ), ...;」コマンドを入力します。

INSERT文を利用したレコード挿入の操作方法
UPDATE文を利用したレコード更新の操作方法
- レコード検索で「横浜市」に絞り込み、表示内容のカラムを「名前」「誕生日」「市名」のみとした場合のコマンドは、
「複数のテーブル」指定のコマンドの場合、「FROM persons,city」のようにして「WHERE city_code = city.code」で関係付け、加えて条件を「AND」に続けて「city_code = 'K001'」を記述します。
「JOIN文」指定のコマンドの場合、「FROM persons」のようにしてJOIN文「INNER JOIN city ON city_code=city.code」で関係付け、加えて条件を「city_code = 'K001'」を記述します。
※「city.name」のカラム指定は、記述コマンド内で『name』が複数ある場合にどのテーブルの『name』かを指定するために、テーブル名の後に「.」(dot)を付けて階層下の『name』を記述します。
※「city_name」の表示(処理)カラム名は、『name』が同じ場合など、「city.name AS city_name」の『AS』以降の「処理カラム名」を記述することで、それ以降の記述を「処理カラム名」で利用できます。

名簿DBの「名簿」「県名」「市名」テーブルのレコード挿入:『list_db_insertrecord.sql』ファイルのダウンロード
「SELECT JOIN」文を利用したレコード検索の操作方法
- 【DCL】コマンド
| 操作内容 | SQLコマンド |
| 操作例 |
| ログイン権限制限 | grant privileges文 |
sql> GRANT all PRIVILEGES ON list_db.* -> TO user@localhost -> IDENTIFIED BY 'yoshi'; |
※上記の例は、データベース名「list_db」すべてに対して、「ユーザー名」が「user」、パスワード「yoshi」でデータベース接続できる制限です。再度、「データベースに接続する操作」をすることで有効にできます。
GRANT文を利用したログイン権限制限の操作方法