みんなの為のMySQLまとめ（７）


###■ストアドプロシージャの作成
ストアドプロシージャの作成はCREATE PROCEDUREを使います。
CREATE PROCEDUREは、「CREATE PROCEDURE」から「END;//」までが一つの文になる。「BEGIN」と「END」の間に命令文を書きます。
参考
http://ryus.co.jp/modules/d3blog/details.php?bid=92

http://qiita.com/setsuna82001/items/e742338eb93e3a48ba46
>DELIMITER //
CREATE PROCEDURE sample1()
BEGIN
SELECT * FROM testm;
END
//
　
DELIMITER //
![スクリーンショット 2015-02-09 22.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/59354/73f66b9e-b46e-28f8-49af-a5b9daf5be29.png "スクリーンショット 2015-02-09 22.26.23.png")

###■ビューの作成
テーブルの中身を取り出し、名前を付け独立したテーブルのように扱うことができる。
参考
http://www.dbonline.jp/mysql/view/index1.html
>create view test1
as select * from testm;
![スクリーンショット 2015-02-09 22.46.13.png](https://qiita-image-store.s3.amazonaws.com/0/59354/0192eaf6-b3f5-9115-474c-941a2efabd11.png "スクリーンショット 2015-02-09 22.46.13.png")

・次はビューを作成し「testm」テーブルの中の「data1」カラムの値が'1'のものだけを取得するビューを作成してみます。
>create view test2
as select key1,data1,data2,data3 from testm where data1 = '1';
![スクリーンショット 2015-02-09 22.57.00.png](https://qiita-image-store.s3.amazonaws.com/0/59354/5a543106-a141-7440-3c86-760384699399.png "スクリーンショット 2015-02-09 22.57.00.png")

###■トリガの作成
トリガを作成するとテーブルに対してデータの追加や更新などが行われた場合に、自動的に別のSQL文を実行するように設定することができます。例えばあるテーブルのカラムの値を更新すると、自動的に他のテーブルのカラムの値を同じ値に更新するといった処理が行えます。
参考
http://www.dbonline.jp/mysql/trigger/index1.html

・ここではトリガの動作を確認するための簡単なサンプルを試してみます。次のような2つのテーブルを作成します。
![スクリーンショット 2015-02-09 23.06.09.png](https://qiita-image-store.s3.amazonaws.com/0/59354/a89293b3-feeb-9338-7636-438f9eb13185.png "スクリーンショット 2015-02-09 23.06.09.png")

まずINSERTトリガを一つ作成します。
>delimiter //
create trigger trigger_insert after insert on user for each row
bigin
insert into log(logtext) values ('INSERT');
end;
//
　
delimiter ;
![スクリーンショット 2015-02-09 23.10.03.png](https://qiita-image-store.s3.amazonaws.com/0/59354/05b2c793-e3d7-4054-9df8-370f5ccc0750.png "スクリーンショット 2015-02-09 23.10.03.png")

続いてDELETEトリガを一つ作成します。
>delimiter //
create trigger trigger_delete after delete on user for each row
begin
insert into log(logtext) values ('DELETE');
end;
//
　
delimiter;
![スクリーンショット 2015-02-09 23.13.59.png](https://qiita-image-store.s3.amazonaws.com/0/59354/1413c05e-733d-031b-3bdd-849a963f5529.png "スクリーンショット 2015-02-09 23.13.59.png")

「user」テーブルにデータを追加します。

```
insert into user values(1,'星野')
```
「user」テーブルにはINSERTトリガが作成されていますので「user」テーブルにデータを追加すると「log」テーブルにも自動的にデータが追加されます。では「log」テーブルを確認してみます。
![kobito.1423492005.901569.png](https://qiita-image-store.s3.amazonaws.com/0/59354/bab6afe8-5514-b9ff-dde7-63f91d6eb4ad.png "kobito.1423492005.901569.png")
このように「log」テーブルにデータが追加されていることが確認できます。
さらに、３件追加してみる。
![kobito.1423492182.469343.png](https://qiita-image-store.s3.amazonaws.com/0/59354/76713bff-4893-0356-5fd9-25266a6e2333.png "kobito.1423492182.469343.png")
「log」テーブルを確認してみます。
![kobito.1423492241.424663.png](https://qiita-image-store.s3.amazonaws.com/0/59354/56b082c7-6c84-b05c-428a-74caa3810e50.png "kobito.1423492241.424663.png")

・「user」テーブルにはDELETEトリガも作成されていますので「user」テーブルからデータを削除すると「log」テーブルにも自動的にデータが追加されます。では「user」テーブルからデータを2つ削除してみます。

```
delete from user where id >= 3;
```
「log」テーブルを確認します。
![kobito.1423492401.698703.png](https://qiita-image-store.s3.amazonaws.com/0/59354/a72fc928-5084-b247-805b-6c1b32e5995c.png "kobito.1423492401.698703.png")
「log」テーブルにデータが2つ追加されていることが確認できます。DELETE文は一度しか実行されていませんが、DELETE文によって2つのデータが削除されているため2回トリガが実行されています。
###■CSVファイル入出力
参考
http://sasuke.main.jp/sqlcsv.html

・入力 LOAD DATA INFILE
「,」などで区切られたCSVファイルを用意することにより、MySQLに高速にデータを入力することができます。

>構文
LOAD DATA INFILE "ファイル名" INTO TABLE テーブル名 
FIELDS TERMINATED BY ',区切り文字' ENCLOSED BY '"';

ファイルの中身

```test.csv
a005,1,2,3
a006,1,2,3
a007,1,2,3
```
>実際に打ったコマンド
LOAD DATA INFILE "test.csv" INTO TABLE testm FIELDS TERMINATED BY ',' ENCLOSED BY '''';
![kobito.1423493178.424230.png](https://qiita-image-store.s3.amazonaws.com/0/59354/885505c8-2b90-1179-147c-6b9c77d16c7f.png "kobito.1423493178.424230.png")

・出力　INTO OUTFILE
「SELECT」を実施する際に、「INTO OUTFILE」コマンドを追記することで、CSVファイルにデータを出力することが出来ます。
>構文
SELECT * FROM テーブル名 INTO OUTFILE "ファイル名" FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '囲み文字の指定';

「testm」表をファイルに出力した例。
![kobito.1423493774.121625.png](https://qiita-image-store.s3.amazonaws.com/0/59354/b695f95b-b7f9-e44c-c554-83085062bfad.png "kobito.1423493774.121625.png")
出力したファイルの中身

```test2.csv
'a001',1,2,3
'a011',1,2,3
'b002',10,20,30
'c003',100,200,300
'a005',1,2,3
'a006',1,2,3
'a007',1,2,3

```