hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

データベース構造の操作

mysqlへ接続してみる

SQLを実行するために、まずはデータベースへ接続をする必要がある。

データベースを扱うために、mysqlというデータベース管理システムを使用していた。
またこれまではmysqlを扱うために、SequelProというアプリケーションからデータベースを参照していたが、今回はターミナルからデータベースを操作してみる

1
mysql -u root

このコマンドはmysqlにユーザー名がrootで接続する」という意味。

SequelProで接続する際は以下のように入力。
この"ユーザ名: root"というところが、上記コマンドの"-u root"と対応している。

https://tech-master.s3.amazonaws.com/uploads/curriculums//9f4a2951092ddd67c27a8afcdc73d3d3.png

コマンドを入力して、以下のような画面が表示されれば正常に接続ができている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//4fc6edc7c37d87af1a2072a86bb8d719.png

データベースの確認をしてみる

ここまででmysqlに接続することができた。
SequelProでいうと、以下の画面まで来たということになる。

https://tech-master.s3.amazonaws.com/uploads/curriculums//b40aafeedc0d9e06373b24175c0951f4.png

次に、現在どのようなデータベースが存在するかを確認してみる。

 SHOW DATABASES文

SHOW DATABASES文はデータベースを一覧で表示するSQL文。

 mysqlで以下のSQL文を実行

1
SHOW DATABASES;

 SQL文の終わりには ;セミコロン)を付ける

SQL文の終わりには必ずセミコロンを付ける必要がある。
もしセミコロンを忘れて実行した場合は、SQLがまだ続くものだとみなされ、以下のような矢印マーク -> が現れる。

https://tech-master.s3.amazonaws.com/uploads/curriculums//0fdb23302a6d4bb171333a6340f5e1f5.png

この場合は続けてセミコロンのみを入力し、再度エンターを押していただければ正常に実行がされる。


 

SQL文を実行すると以下のように、今まで作ってきたデータベースが一覧で表示される。

https://tech-master.s3.amazonaws.com/uploads/curriculums//4fe05a3413aa8d95a13fd32e841cbc3d.png

データベースを作成してみる

今まではrake db:createというコマンドを実行することでRailsがデータベースを作成してくれていたが、ここではターミナルから直接データベースを作成してみる。

 CREATE DATABASE文

SQLの中で、データベースやテーブルを作成する際はCREATE命令を使用する。

CREATE DATABASE文を実行すると、指定した名前のデータベースが作成される。
実行時には以下のようにデータベース名を指定する必要がある。

1
CREATE DATABASE データベース名;

それでは実際に"sqltest"という名前のデータベースを作成してみる。

 ターミナルで以下のSQLを実行

1
CREATE DATABASE sqltest;

以下のように表示がされれば正常にデータベースが作成されている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//8e915ea10a24b32905bcb8d2f37b55cb.png

ここでもう一度データベースの一覧を表示し、データベースが作成されているかを確認。

 mysqlで以下のSQL文を実行

1
SHOW DATABASES;

 これまでSHOW DATABASESCREATE DATABASEのように、SQLの中で特別な意味を持つ単語は大文字で記載してきたが、実際にSQL文を入力するときは全て小文字でも正常に実行することが出来る。

 

表示された一覧に"sqltest"というデータベースが追加されていることを確認する。

https://tech-master.s3.amazonaws.com/uploads/curriculums//fc358d043713a79be93669cb711aac86.png

データベースを選択してみる

CREATE DATABASE文を使用することでできた、"sqltest"という名前のデータベースで作業をしていきたいが、そのためにはまずデータベースを選択する必要がある

 

SequelProでも以下のようにデータベースを選択。

https://tech-master.s3.amazonaws.com/uploads/curriculums//a88741faf101482a921d6be9fc4203a7.png

このデータベースの選択を、今回はターミナル上で行う。

 USE文

USE文はデータベースを選択するSQL文。
実行時には以下のようにデータベース名を指定する必要がある。

1
USE データベース名;

実際に"sqltest"というデータベースを選択してみる。

 mysqlで以下のSQL文を実行

1
USE sqltest;

以下のように表示がされていれば正常にデータベースの選択が出来ている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//76008de1bdb178b9eb8ac147f06600ef.png

テーブル構造の操作

データベースの作成と選択が出来たので、次はそのデータベースに対してテーブルの作成やテーブル構造の変更をしてみる。

テーブルを確認

データベースにどのようなテーブルが存在するかを確認するSQL文について。

 SHOW TABLES文

SHOW TABLES文は、選択したデータベースに存在するテーブルを一覧で表示するSQL文。

 mysqlで以下のSQL文を実行

1
SHOW TABLES;

以下のような表示がされれば正常にテーブルの一覧を表示することが出来ている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//0797cd190fc2789c9f02bc209d0dd35a.png

"Empty set"とあることから、現段階ではまだテーブルが存在しないことが分かる。

テーブルを作成してみる

 CREATE TABLE文

データベースの作成のときと同様に、テーブルを作成する際はCREATE命令を使用する。

CREATE TABLE文はテーブルを作成するためのSQL文。
実行時には以下のようにテーブル名を指定する必要がある。
また、そのテーブルに作成するカラムの名前とそのカラムの型を指定することが出来る。

1
CREATE TABLE テーブル名 (カラム名 カラム名の型, ……);

Railsでテーブルを作る際は、rails g model モデル名でそのテーブルに紐づくモデルを作成し、そのときに作られたマイグレーションファイルをrake db:migrateで実行する、という手順を踏んでいた。

そのrake db:migrateが実行される裏側では、このCREATE TABLEというSQL文が動いていたということになる。

 

では、mysqlからテーブルを作ってみる。

今回は、商品の情報を保存することを想定し、"goods"という名前のテーブルを作りたい。
そしてテーブルには商品idを数字で保存するidカラム商品名を文字列で保存するnameカラムが必要であることとする。

 

ここでそれぞれのカラムの型はなんと書けば良いか。
Railsでは数字を入れる型は"Integer"、文字列を入れる型は"String"となっていた。

mysqlで数字型や文字列型を定義する際は以下のような型名を使用。

型名 保存できる値
INT 数字
VARCHAR(M) 最大M文字の文字列

 

今回は"INT"型のカラム"id"と、"VARCHAR(255)"型のカラム"name"のある"goods"テーブルを作成してみる。

 mysqlで以下のSQL文を実行

1
CREATE TABLE goods (id INT, name VARCHAR(255));

以下のように表示がされればSQL文が実行されている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//16790e2096ad68d0ae81de4e8f64b7c9.png

ここでもう一度SHOW TABLES文を使用し、テーブルの一覧を確認。

1
SHOW TABLES;

以下のように"Tables_in_sqltest"に"goods"というテーブルが確認できれば、テーブルが正しく作成された。

https://tech-master.s3.amazonaws.com/uploads/curriculums//aad10dc3889b8694f7336a2e273e64c2.png

テーブル構造を確認してみる

テーブル構造を確認するためには以下のようなSQL文を記述する。

1
SHOW columns FROM テーブル名;

実際にテーブル名の部分を"goods"に置き換えて実行をしてみる。

1
SHOW columns FROM goods;

以下のような表示がされれば正常に実行が出来ている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//9b3ef2ffc5e3f4f93e2b9cea5c66f3b1.png

実行結果から、goodsテーブルにはidとnameという2つのカラムがあることが確認できた。

カラムを追加してみる

テーブルカラムを追加する際はALTER TABLE文を使用。

 ALTER TABLE文

カラムの追加・修正・削除はすべてテーブル構造の変更である。
そのためSQL文は共通して、ALTER命令を用いたALTER TABLE文を使用する。

実行時は以下のような文法で使用。

1
ALTER TABLE テーブル名 操作

実際にカラムを追加するSQL文を見てみる。

カラムを追加するSQL文は以下のような文法で記述する。

・カラムを1つだけ追加する場合

1
ALTER TABLE テーブル名 ADD カラム名 カラムの型;

・カラムを複数追加する場合

1
ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……);

"price"と"zaiko"という2つのカラムを、共に"int"型で作成してみる。

 

1
ALTER TABLE goods ADD (price int, zaiko int);

以下のように結果が表示されていれば正常に実行が出来ている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//38f31c9345f4c7e6fb97f4cca91a1735.png

カラムを追加したのでテーブルの構造がどう変化したか確認。

 

1
SHOW columns FROM goods;

以下のようにカラムが追加されていることを確認。

https://tech-master.s3.amazonaws.com/uploads/curriculums//3c2787498b18b64760f0b9c2dde54f3f.png

カラムを修正してみる

カラムの修正は先ほど同様ALTER TABLE文を使用し、以下のような文法でSQL文を記述する。

1
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;

先ほど"zaiko"というカラムを追加したが、他のカラムに合わせてカラム名を英語表記にするため、"stock"という名前に変更してみる。

1
ALTER TABLE goods CHANGE zaiko stock int;

以下のように表示がされれば正常に実行が出来ている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//6633af7928b0368dd535c22fed2fe234.png

このとき、カラムの型は変更しなくても、再度記述をしなくてはならない。
なので、カラムの修正をするときはこの型の部分を間違えないように注意をする必要がある。

 

先ほどと同様にカラムが変更されていることを確認。

https://tech-master.s3.amazonaws.com/uploads/curriculums//3ff5e2f762701dce875eb3e0c52b2c79.png

カラムを削除してみる

最後にカラムを削除する方法について。

カラムの削除にもALTER TABLE文を使用し、以下のようにSQL文を記述する。

1
ALTER TABLE テーブル名 DROP カラム名;

"stock"カラムが不要になった、と想定してカラムの削除を行ってみる。

1
ALTER TABLE goods DROP stock;

以下のように表示がされていれば正常に実行が出来ている。
https://tech-master.s3.amazonaws.com/uploads/curriculums//d10d50871edb0bc5f33d8e1b32e335a8.png

カラムの一覧を表示し、カラムがきちんと削除されていることを確認。

https://tech-master.s3.amazonaws.com/uploads/curriculums//a9f97edd33da0d9eadd308ffd8452aa7.png