masatoの日記

やっていきます

WEBアプリにはデータベースが必要だ。MySQLに入門する。

データベース使えるとできることの幅が広がりますよね、っていうか使えないと致命的ですよね。 ということで、MySQLを手を動かして覚えていきたいです!

テーブルをつくる

早速、テーブルをつくってみよう!
ということで「はじめてのSQL」にあるスキーマを打ち込みます。

CREATE TABLE person (person_id SMALLINT UNSIGNED,
fname VARCHAR(20),
lname VARCHAR(20),
gender ENUM ('M', 'F'),
birth_date DATE,
address VARCHAR(20),
city VARCHAR(20),
state VARCHAR(20),
coutry VARCHAR(20),
postal_code VARCHAR(20),
CONSTRAINT pk_person PRIMARY KEY (person_id)
);

ターンッ(Enterキー)

ERROR 1046 (3D000): No database selected

データベースをまず選択しないといけないんですね・・・はじめてのSQLには書いてませんでした。 さっそく、「MySQL データベース 選択」でググります。

MySQL公式サイトの解説にヒット!

MySQL :: MySQL 5.6 リファレンスマニュアル :: 3.3.1 データベースの作成と選択

データベースを作成するには、次のコマンドを使います。

CREATE DATABASE <データベース名>;

データベース名では大文字小文字が区別されるそうなので、すべて小文字でつくってみます。

mysql> CREATE DATABASE learning_mysql;
Query OK, 1 row affected (0.01 sec)

OKです!

次にデータベースを選択します。作っただけでは選択されないとありました。明示的に選択してやる必要があります。

mysql> USE learning_mysql;
Database changed

選択できました!

ではいよいよ、さきほどのスキーマにしたがってテーブルを作ってみます。
personテーブルです。

(ところで、別の本でテーブル名には名詞の複数形を使う、とよみました。この本に出てくるテーブルには単数形が使われてます。そういうケースもあるのだろうか。)

mysql> CREATE TABLE person (person_id SMALLINT UNSIGNED,
    -> fname VARCHAR(20),
    -> lname VARCHAR(20),
    -> gender ENUM ('M', 'F'),
    -> birth_date DATE,
    -> address VARCHAR(20),
    -> city VARCHAR(20),
    -> state VARCHAR(20),
    -> coutry VARCHAR(20),
    -> postal_code VARCHAR(20),
    -> CONSTRAINT pk_person PRIMARY KEY (person_id)
    -> );
Query OK, 0 rows affected (0.08 sec)

いいですね!

テーブルのスキーマをかくにんしてみる

さきほどめでたくテーブル作成に成功したわけですが、列名、データ型などを確認したいときがあるとおもいます。
そんなときは次のコマンドを打ちましょう。

DESC person;

DESCはDescribeだそうです。Descending(降順)とは関係ありません。

mysql> DESC person;
+-------------+----------------------+------+-----+---------+-------+
| Field       | Type                 | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+-------+
| person_id   | smallint(5) unsigned | NO   | PRI | NULL    |       |
| fname       | varchar(20)          | YES  |     | NULL    |       |
| lname       | varchar(20)          | YES  |     | NULL    |       |
| gender      | enum('M','F')        | YES  |     | NULL    |       |
| birth_date  | date                 | YES  |     | NULL    |       |
| address     | varchar(20)          | YES  |     | NULL    |       |
| city        | varchar(20)          | YES  |     | NULL    |       |
| state       | varchar(20)          | YES  |     | NULL    |       |
| coutry      | varchar(20)          | YES  |     | NULL    |       |
| postal_code | varchar(20)          | YES  |     | NULL    |       |
+-------------+----------------------+------+-----+---------+-------+
10 rows in set (0.04 sec)

10行あると言われてます。つまり、このテーブルは10列あるわけです。 コマンドラインの表って案外見やすいですね。

テーブルのスキーマを変更する

上記のスキーマをみると、person_idの型がsmallint(5) unsignedとなっています。 これだと、データを挿入する度に手動でIDを入力する必要があります。 それはしたくないので、DBで自動で入力してくれるようにしましょう。 MySQLではAUTO_INCREMENTと指定します。person_id列にAUTO_INCREMENTを付けるにはALTER文を使います。

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

要素を分解してみると次のようになっているらしいことがわかります。

  • ALTER TABLE <テーブル名> MODIFY <属性を変更する列名> <変更後の属性>

では、実行してみましょう。

mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

成功したもようです。

データを挿入する

さて、これでテーブルが作成できました。列とデータ型がスキーマの通りになっていることも確認できました。
しかし、テーブルはまだからっぽです。 なにか入力してみたい、入力してみよう。

テーブルにデータを挿入するにはINSERT文を使います。
INSERT文には次の3点を含める必要があります。

  • データを挿入するテーブルの名前
  • データを挿入するテーブルの列の名前
  • 列に挿入する値

これに従って作ったpersonテーブルにデータを挿入するコマンドは次のようになります。

INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'Taro', 'Kitamura', 'M', '1985-08-26'); 

Enter。

mysql> INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'Taro', 'Kitamura', 'M', '1985-08-26');
Query OK, 1 row affected (0.02 sec)

成功です! 対話式コマンドラインはレスポンスがサクサク返ってくるところがきもちいいですね。 成功すれば、ですが。

テーブルの中身をかくにんする

これで1レコード入ってるテーブルが作成できました。
ちゃんと登録されているか確認してみよう。

mysql> SELECT * FROM person;
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
| person_id | fname | lname    | gender | birth_date | address | city | state | coutry | postal_code |
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
|         1 | Taro  | Kitamura | M      | 1985-08-26 | NULL    | NULL | NULL  | NULL   | NULL        |
+-----------+-------+----------+--------+------------+---------+------+-------+--------+-------------+
1 row in set (0.00 sec)  

めでたくデータが確認できました。

次は、複数のテーブルをJOINさせて見たいとおもいます。