2016年05月28日

MariaDBでSQLを学ぶ [DB操作編]

Railsで開発しているとmigrationでDBをあれこれしますが、直にSQLを書いて既存のデータに変更を加えるという作業も当然あります。
僕はSQLなんて書いたことも無ければ、mysql以外にもDBがあることすら知らなかったレベルなので、もの凄く困りました、て言うかそんなmigration普通に書けません。

しかしDBにカラム追加して既存のDBにデータを入れるなんてことは今後いくらでも発生する作業であることは間違いないので、ここらで一発基本から学ぼうと思いまして、最近MariaDBで遊んでいました。
いくらmigrationがいろいろやってくれるからって、SQLわからんのはダメですね。
と言うことでブログにもメモしておきます。

まずはMariaDBのインストール

本当はいつも使っているMacにBrewでMysqlをインストールしようと思ったのですが、起動しようとすると

ERROR! MySQL server PID file could not be found!

とかいう謎のエラーが発生して、どうにもこうにも解決できなかったので、Vagrant(CentOS)でやることにしましたorz

mkdir study_sql
cd study_sql
vagrant init hakozaru/CentOS-7-x86_64_Minimal_1511
vagrant up
vagrant ssh
sudo yum update
sudo yum install mariadb mariadb-server
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service
mysql -u root <- MariaDBにログイン

これで準備完了!
はぁ〜ホント便利っす。

まずは基本操作から確認

DBを作成する
create database DB名;

MariaDB [(none)]> create database hakozaru;
Query OK, 1 row affected (0.00 sec)

DB一覧表示
show databases;

MariaDB [hakozaru]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hakozaru           | <- ちゃんと作られてる!
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

使用するDBを選択
use DB名

MariaDB [hakozaru]> use hakozaru;
Database changed

テーブルを作成する
create table テーブル名(カラム設定);
例:

create table first_table(
  id char(4) not null,
  name varchar(100) not null,
  number integer,
  primary key (id)
  );

DBにあるテーブルを一覧表示する
show tables;

MariaDB [hakozaru]> show tables;
+--------------------+
| Tables_in_hakozaru |
+--------------------+
| first_table        |
+--------------------+
1 row in set (0.00 sec)

テーブルの定義を表示する
desc テーブル名;

MariaDB [hakozaru]> desc first_table;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | char(4)      | NO   | PRI | NULL    |       |
| name   | varchar(100) | NO   |     | NULL    |       |
| number | int(11)      | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

テーブルを削除する
drop table テーブル名;

MariaDB [hakozaru]> drop table first_table;
Query OK, 0 rows affected (0.01 sec)

MariaDB [hakozaru]> show tables;
Empty set (0.00 sec)

テーブルにカラムを追加する
alter table テーブル名 add column カラム設定;

MariaDB [hakozaru]> alter table first_table add column info varchar(50);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
# infoカラムが追加されている
MariaDB [hakozaru]> desc first_table;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | char(4)      | NO   | PRI | NULL    |       |
| name   | varchar(100) | NO   |     | NULL    |       |
| number | int(11)      | YES  |     | NULL    |       |
| info   | varchar(50)  | YES  |     | NULL    |       | <- ここ
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

テーブルからカラムを削除する
alter table テーブル名 drop column カラム名;

MariaDB [hakozaru]> alter table first_table drop column info;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
# infoカラムが消える
MariaDB [hakozaru]> desc first_table;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | char(4)      | NO   | PRI | NULL    |       |
| name   | varchar(100) | NO   |     | NULL    |       |
| number | int(11)      | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

テーブルにデータを登録する
start transaction;
insert into テーブル名 values(データ情報);



commit;

start transaction;
insert into first_table values ("1", "名前1", 1);
insert into first_table values ("2", "名前2", 2);
insert into first_table values ("3", "名前3", 3);
insert into first_table values ("4", "名前4", 4);
insert into first_table values ("5", "名前5", 5);
insert into first_table values ("6", "名前6", 6);
commit;

start transaction と commit はなくてもデータ入る?っぽい?

insert into first_table values ("7", "名前7", 7);

だけでも入った。

基本操作はよく使う

ここに書いた基本操作は今のデータの状態を確認したりする時にRailsでもよく使います。
(rails dbコマンドでDBにアクセスするか、mysql -u rootでアクセスするかはお好みでどうぞ)

ただここに書いたコマンドだけでは、あるテーブルのあるデータを見たいなどのことができません。
それでは困るので、次回はDBのデータを検索する方法についてメモしようと思います。