Chapter10 MySQLの基本

概要と目標 データベースが何かを知り、
SQLの基本を身に付けよう。

データーベースの概要を知り、実際にデータベースや
テーブルを作成できるようになろう。

今回のゴール

コマンドプロンプト

mysql> create database my_blog default character set utf8;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_blog            |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

mysql> use my_blog;
Database changed
mysql> create table users (
  id int(11) unsigned auto_increment primary key,
  name varchar(255) not null,
  email varchar(100) not null unique,
  password varchar(255) not null
) engine=InnoDB default charset=utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+-------------------+
| Tables_in_my_blog |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

mysql> desc users;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   |     | NULL    |                |
| email    | varchar(100)     | NO   | UNI | NULL    |                |
| password | varchar(255)     | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> drop table users;
Query OK, 0 rows affected (0.01 sec)

mysql> drop database my_blog;
Query OK, 0 rows affected (0.00 sec)

mysql> 

データベースとは 必要なデータを取り出しやすい、
情報の集まり。

データベースとは、検索や蓄積が容易にできるよう整理された情報の集まり。
データを格納する構造には様々なタイプがある。

データベース

リレーショナルデータベース 表形式でデータを管理。
複数の表を関連付け。

データベースの構造には様々な種類がある。
現在最も利用されているのが、RDB Relationalリレーショナル Dataデータ Baseベース
代表例: MySQL、 PostgreSQL、 SQL Server、 Oracle など

リレーショナルデータベース

参考:my_blog (Google スプレッドシート)

テーブルの構造

テーブルの構造
テーブルの名称

コマンドラインツール Windowsならコマンドプロンプト。
Macならターミナル。

SQLは、コマンドラインツールを使って、MySQLモニタで操作する。

  • Windows
    コマンドプロンプト
  • Mac
    ターミナル

MySQLモニタの起動 MySQLのディレクトリまで移動し、
コマンドを入力してログインする。

MySQLモニタを起動するには、cd コマンドで「mysql」があるディレクトリまで移動し、
mysql コマンドでMySQLモニタを起動する。

cdコマンド ・・・ カレントディレクトを移動するコマンド
cd 移動先
mysqlコマンド ・・・ MySQLモニタの起動するコマンド
mysql -u ユーザ名 -p
        オプション

【オプション】
-u: ユーザ名
-p: パスワードを後で入力

詳細は4.5.1.1 mysql のオプションを参照

MySQLモニタを起動してみよう。

  1. コマンドラインツールを起動し、cdコマンドで、
    「mysql」のディレクトリに移動するパスを入力し「Enter」を押下
Windows (XAMPPの場合)
cd C:\xampp\mysql\bin\
Mac (MAMPの場合)
cd /Applications/MAMP/Library/bin/
  1. 下記のコマンドでMySQLモニタの起動
mysql -u root -p
  1. パスワードを聞かれるので、環境に合わせて入力し「Enter」を押下
    • XAMPP: 空
    • MAMP: "root"
実行例

コマンドプロンプト

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

データベースの作成 データベースは、
スプレッドシートみたいなもの。

データベースをスプレッドシートで例えると、スプレッドシート自体に似ている。
データベースを作成するには、 CREATE DATABASE を使う。

データベースの作成
CREATE DATABASE [IF NOT EXISTS] データベース名 [DEFAULT CHARACTER SET 文字コード];

[〜]: 省略可
IF NOT EXISTS: すでに同名のデータベースが存在していてもエラーにしない
DEFAULT CHARACTER SET: データベースの文字コードの設定

詳細は13.1.17 CREATE TABLE 構文を参照

データベースを作成してみよう。

  1. 「chapter10」フォルダ内の「database.sql」をテキストエディタで開く
  2. my_blog」というデータベースを「UTF-8」で作成するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter10/database.sql
-- データベースの作成
create database my_blog default character set utf8;
実行例

コマンドプロンプト

mysql> create database my_blog default character set utf8;
Query OK, 1 row affected (0.01 sec)

mysql> 

データベースの一覧表示 存在するデータベースを、
一覧で確認する。

データベースの一覧を表示するには SHOW DATABASES を使う。

データベースの一覧表示
SHOW DATABASES;

詳細は13.7.5.15 SHOW DATABASES 構文を参照

データベースの一覧を表示してみよう。

  1. 「chapter10」フォルダ内の「database.sql」をテキストエディタで開く
  2. データーベースの一覧を表示するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter10/database.sql
-- データベースの一覧表示
show databases;
実行例

コマンドプロンプト

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_blog            |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

データベースの選択 使うデータベースを、
選択しないと使えない。

データベースにテーブルを作ったり、中身を表示したりするには、
利用するデータベースを選択しておく必要がある。

データベースの選択
USE データベース名;

詳細は13.8.4 USE 構文を参照

データベースを選択してみよう。

  1. 「chapter10」フォルダ内の「database.sql」をテキストエディタで開く
  2. データベース「my_blog」を選択するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter10/database.sql
-- データベースの選択
use my_blog;
実行例

コマンドプロンプト

mysql> use my_blog;
Database changed
mysql> 

テーブルの作成 テーブルは、スプレッドシートの
「シート」みたいなもの。

テーブルをスプレッドシートで例えると、「シート」のようなもの。
テーブルを作成するには、CREATE TABLEを使う。

テーブルの作成
CREATE TABLE [IF NOT EXISTS] テーブル名 (
  フィールド名1 データ型 フィールド制約  フィールド名2 データ型 フィールド制約  フィールド名3 データ型 フィールド制約
) [ENGINE=InnoDB DEFAULT CHARASET=文字コード];

[〜]: 省略可
IF NOT EXISTS: すでに同名のテーブルが存在していてもエラーにしない
ENGINE=InnoDB DEFAULT CHARASET: テーブルの文字コードを設定するテーブルオプション

詳細は13.1.17 CREATE TABLE 構文を参照

テーブルを作成してみよう。

  1. 「chapter10」フォルダ内の「table.sql」をテキストエディタで開く
  2. posts」というテーブルを「UTF-8」で作成するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
    "posts" テーブル
    フィールド名 説明
    id 記事のID番号を連番で格納するフィールド
    title 記事のタイトルを格納するフィールド
    content 記事を格納するフィールド
    created 記事の作成日時を格納するフィールド
chapter10/table.sql
-- テーブルの作成
create table posts (
  id int(11) unsigned auto_increment primary key,
  title varchar(255) not null,
  content longtext not null,
  created datetime
) engine=InnoDB default charset=utf8;
実行例

コマンドプロンプト

mysql> create table posts (
    ->   id int(11) unsigned auto_increment primary key,
    ->   title varchar(255) not null,
    ->   content longtext not null,
    ->   created datetime
    -> ) engine=InnoDB default charset=utf8;
Query OK, 0 rows affected (0.03 sec)

mysql> 

テーブルの一覧表示 SHOW TABLES
これでテーブルの一覧が見れる。

選択中のデータベースにどんなテーブルがあるのかを確認するには、SHOW TABLESを使う。

テーブルの一覧表示
SHOW TABLES;

詳細は13.7.5.38 SHOW TABLES 構文を参照

テーブルの一覧を表示してみよう。

  1. 「chapter10」フォルダ内の「table.sql」をテキストエディタで開く
  2. データベース「my_blog」の中にあるテーブルの一覧を表示するコマンドを追記し、
    コマンドラインツールにコピー&ペースト
chapter10/table.sql
-- テーブルの一覧表示
show tables;
実行例

コマンドプロンプト

mysql> show tables;
+-------------------+
| Tables_in_my_blog |
+-------------------+
| posts             |
+-------------------+
1 row in set (0.00 sec)

mysql> 

データ型 どんなデータが入るのか、
きちんと決めておく。

MySQLで扱えるデータ型には様々なものがある。

主なデータ型
分類 書式 説明
整数 SMALLINT[(表示幅)] [UNSIGNED] [ZEROFILL] 2バイト整数
(-32,768 〜 32,767)
INT[(表示幅)] [UNSIGNED] [ZEROFILL] 4バイト整数
(約± 21億)
BIGINT[(表示幅)] [UNSIGNED] [ZEROFILL] 8バイト整数
(約± 922京)
実数 DOUBLE[(合計桁数,小数点以下の桁数)] [UNSIGNED] [ZEROFILL] 倍精度浮動小数点
(約小数第 15位まで有効)
文字列 CHAR[(最大文字数)] [BINARY] 固定長文字列
(最大長 255バイト)
VARCHAR[(最大文字数)] [BINARY] 可変長文字列
(最大長 65535バイト)
LONGTEXT 可変長文字列
(最大長 4294967295バイト)
日付 DATE 日付
(yyyy-mm-dd)
TIME 時間
(hh:mm:ss)
DATETIME 日時
(yyyy-mm-dd hh:mm:ss)
真偽 BOOL 真偽値
(true/false)
定数 ENUM(値1, 値2, 値3...) 列挙型
(最大 65535個の固有値)
  • [] は省略可能
  • UNSIGNED: マイナスの値を無効 (整数型の場合、マイナス分がプラスに加算される)
  • ZEROFILL: 足りない桁数分 0 を先頭に埋める
  • BINARY: 大文字と小文字を区別する

詳細は第 11 章 データ型を参照

CHARとVARCHARの違い

CHARは固定長文字列、VARCHARは可変長文字列

CHARとVARCHAR

CHARは電話番号や、郵便番号など、文字数が決まってるものに使う。

フィールド制約 フィールドに入る値に、
制約を付ける。

フィールドの値に空白を認めるかや、デフォルト値を設定するなどの制約を指定できる。

主な制約
分類 制約 説明
値の制約 AUTO_INCREMENT 自動連番
  • 1つのテーブルに1つしか設定できない
  • インデックスを指定する必要がある
  • デフォルト値は設定できない
Ex. id int(11) auto_increment
NOT NULL 空白不可 Ex. name varchar(255) not null
DEFAULT デフォルト値
Ex. status varchar(20) default 'publish'
インデックス PRIMARY KEY 主キー
  • 1つのテーブルに1つしか設定できない
  • NOT NULL制約が必要 (自動で付加される)
  • 値は重複できない
Ex. id int(11) primary key
UNIQUE 重複不可
Ex. email varchar(255) unique

詳細は13.1.17 CREATE TABLE 構文を参照

フィールド情報の表示 テーブルの構造を確認する。

テーブル内の各フィールドに設定されているデータ型や、制約を確認することができる。

フィールド情報の表示
DESC テーブル名;

詳細は13.7.5.6 SHOW COLUMNS 構文を参照

フィールド情報を表示してみよう。

  1. 「chapter10」フォルダ内の「table.sql」をテキストエディタで開く
  2. posts」テーブルのフィールド情報を表示するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter10/table.sql
-- フィールド情報の表示
desc posts;
実行例

コマンドプロンプト

mysql> desc posts;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| title   | varchar(255)     | NO   |     | NULL    |                |
| content | longtext         | NO   |     | NULL    |                |
| created | datetime         | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> 

テーブルの削除 DROP TABLE
これで、テーブルを削除する。

テーブルを削除するには DROP TABLEを使う。

テーブルの削除
DROP TABLE [IF EXISTS] テーブル名;

[〜]: 省略可
IF EXISTS: テーブルが存在しない場合でもエラーにしない

詳細は13.1.28 DROP TABLE 構文を参照

テーブルを削除してみよう。

  1. 「chapter10」フォルダ内の「table.sql」をテキストエディタで開く
  2. posts」テーブルを削除するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter10/table.sql
-- テーブルの削除
drop table posts;
実行例

コマンドプロンプト

mysql> drop table posts;
Query OK, 0 rows affected (0.01 sec)

mysql> 

データベースの削除 DROP DATABASE
これで、データベースを削除する。

データベースを削除するには DROP DATABASE を使う。

データベースの削除
DROP DATABASE [IF EXISTS] データベース名;

[〜]: 省略可
IF EXISTS: データベースが存在しない場合でもエラーにしない

詳細は13.1.21 DROP DATABASE 構文を参照

データベースを削除してみよう。

  1. 「chapter10」フォルダ内の「database.sql」をテキストエディタで開く
  2. データベース「my_blog」を削除するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter10/database.sql
-- データベースの削除
drop database my_blog;
実行例

コマンドプロンプト

mysql> drop database my_blog;
Query OK, 1 row affected (0.01 sec)

mysql> 

練習問題 今回の理解度をチェック。

「chapter10」フォルダ内の「training.sql」を利用し、以下の問題を解いて下さい。

実行例 (コマンド部分は省略)

コマンドプロンプト

mysql> [データベースの作成]
Query OK, 1 row affected (0.00 sec)

mysql> [データベースの一覧表示]
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_blog            |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)

mysql> [データベースの選択]
Database changed
mysql> [テーブルの作成]
Query OK, 0 rows affected (0.03 sec)

mysql> [テーブルの一覧表示]
+-------------------+
| Tables_in_my_blog |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

mysql> [フィールド情報の表示]
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   |     | NULL    |                |
| email    | varchar(100)     | NO   | UNI | NULL    |                |
| password | varchar(255)     | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql> [テーブルの削除]
Query OK, 0 rows affected (0.01 sec)

mysql> [データベースの削除]
Query OK, 0 rows affected (0.00 sec)

mysql> 
    • データベース名: "my_blog"
    • データベース名: "my_blog"
    • テーブル名: "users"
    "users" テーブルのフィールド情報
    フィールド名 データ型 制約
    id 表示桁数11桁の整数(マイナスの数は使わない) 自動連番、主キー
    name 255文字の文字列 空白不可
    email 100文字の文字列 空白不可、重複不可
    password 255文字の文字列 空白不可
解答例
chapter10/training.sql
-- データベースの作成
create database my_blog default character set utf8;

-- データベースの一覧表示
show databases;

-- データベースの選択
use my_blog;

-- テーブルの作成
create table users (
  id int(11) unsigned auto_increment primary key,
  name varchar(255) not null,
  email varchar(100) not null unique,
  password varchar(255) not null
) engine=InnoDB default charset=utf8;

-- テーブルの一覧表示
show tables;

-- フィールド情報の表示
desc users;

-- テーブルの削除
drop table users;

-- データベースの削除
drop database my_blog;

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ スプレッドシートのような、
情報の集まり。

データベースは、必要なデータを取り出しやすい情報の集まりです。

  • データベースは、スプレッドシートで、テーブルがシート
  • MySQLは、コマンドラインツールで操作する
  • ログインは、cd コマンドで移動しmysqlコマンドでログインする