環境構築不要！ 初心者による,初心者のためのSQL-基本(4大命令)

## はじめに
今回はSQL初心者がSQL初心者のために記事をなんとなくで書いていきます．
内容としては
・データの表示
・データの更新
・データの追加
・データの削除
となっています．


## 対象者
・SQLに触ったけどよく理解していない人
・SQLをこれから触りたい人
・SQLに触りたいけど環境構築がめんどくさくて触ってない人


## 環境
下記のサービスを利用すると環境構築が不要でサクッと試せるのでお勧めです．
ちなみにdokoQLでは表があるので挿入等の操作を行った際わかりやすくておすすめ
・[dokoQL](https://dokoql.jp)
・[paiza](https://paiza.io/projects/BK2BFFdOYd8Fq0vPZoyXJQ)


### paizaの場合
``` paiza.sql
    create table Test(id integer, title varchar(100));
    insert into Test(id, title) values(1, "Hello");
    select * from Test;
    -- Your code here!
```
の状態からスタートするので最初に全て削除して
下記をペーストすることでdokoQLと同じ環境にできる
``` paiza.sql
    /*家計簿テーブル　作成*/
CREATE TABLE 家計簿 (
  日付      DATE,
  費目      VARCHAR(20),
  メモ      VARCHAR(100),
  入金額    INTEGER(10),
  出金額    INTEGER(10)
);


INSERT INTO 家計簿 VALUES ('2022-02-03',    '食費',         'コーヒーを購入',   0,              380);
INSERT INTO 家計簿 VALUES ('2022-02-10',    '給食',         '1月の給料',        280000,         0);
INSERT INTO 家計簿 VALUES ('2022-02-11',    '教育娯楽費',   '書籍購入',         0,              2800);
INSERT INTO 家計簿 VALUES ('2022-02-14',    '交際費',       '同期会の会費',     0,              5000);
INSERT INTO 家計簿 VALUES ('2022-02-18',    '水道光熱費',   '1月の電気代',      0,              7560);


/*sql coding*/
```
/*sql coding*/の下からコードを書き
実行したい場合は下にある緑色の「実行」と書いているボタンをクリック
実行結果は下に「出力」「入力」「コメント」の「出力」をクリックすると下に表示されます
dokoQLと違い表がないので更新等の操作を行った後に毎回表示するコードを書かないといけないので少しめんどくさいかもしれないです．

### dokoQLの場合
dokoQLの場合は最初は特に操作する必要はなく
右側にあるエディタでコードを書くと実行結果が下と左の表に出るようになっている．
表示以外のコードを試したい場合は登録&ログインする必要があるのが少しめんどくさいかも


## 詳細

### まずSQLとは
SQLとはデータベース，データを操作するための物である．
ちなみにSQLはデータベース言語と呼ばれてC言語,JAVAなどのプログラミング言語とは別物である．


### データの表示
データを表示するコードは
```データ表示.sql
/*単体*/
SELECT 行の名前A FROM テーブル名;

/*複数*/
SELECT 行の名前A,行の名前B FROM テーブル名;

/*全て*/
SELECT * FROM テーブル名;
    
/*条件を付けたい場合*/
SELECT 列の名前A FROM テーブル名 WHERE 列の名前B < 〇〇〇;
```
細かく分解すると
SELECT で取得の命令を出し
列の名前 で列の選択
FROM テーブル名 でテーブルを選択
が基本になる
条件を付ける場合は
WHERE 列の名前 < 〇〇〇 や
WHERE 列の名前 = 〇〇〇　など'<','='等の不等号で条件を付けられる


####  実習

##### 単体表示
``` 単体表示.sql
SELECT メモ FROM 家計簿;
```
これをエディタに書く
メモの場所を費目に変えると費目のデータが得られる


###### 実行結果
``` 単体表示実行結果.sql
メモ
コーヒーを購入
1月の給料
書籍購入
同期会の会費
1月の電気代
```


##### 複数表示
``` 複数表示.sql
SELECT 日付, メモ, 費目  FROM 家計簿;
```
列の名前は','で区切っていれば何個書いてもOK
使い道は多分無いが例えば同じ列名を複数書いてもOK


###### 実行結果
``` 複数表示実行結果.sql
日付	      メモ	          費目
2022-02-03	  コーヒーを購入	  食費
2022-02-10	  1月の給料	      給食
2022-02-11	  書籍購入	      教育娯楽費
2022-02-14 	  同期会の会費	  交際費
2022-02-18	  1月の電気代	  水道光熱費
```


##### 全て表示
``` 全て表示.sql
/*例1*/
SELECT 日付, 費目, メモ, 入金額, 出金額 FROM 家計簿;

/*例2*/
SELECT * FROM 家計簿;
```
全てを表示する場合は
先ほど書いた複数表示する方法と同じく','で全ての列名を書く場合と
列名に'*'を入れる場合
の2通りの方法がある
最初の内は余り考えなくてもいいが
実務等で使う場合は
できるだけ','で区切る方法を取るようにした方がいい
'*'では列の名前を書かなくてもいいので便利だが
理由としてはデータベースの設計変更により列が増減したりすると
実行結果も変化して予期せぬエラーの原因になってしまうことがある．
なので使う際はこのことを頭の片隅に残して使うように！


###### 実行結果
2つの例の実行結果はどちらも同じ
``` 全て表示実行結果.sql
日付	     費目	     メモ	        入金額	 出金額
2022-02-03	 食費	     コーヒーを購入	0	     380
2022-02-10	 給食	     1月の給料	    280000	 0
2022-02-11	 教育娯楽費	 書籍購入	    0	     2800
2022-02-14	 交際費	     同期会の会費	0	     5000
2022-02-18	 水道光熱費	 1月の電気代	    0	     7560
```


##### 条件付け
```条件付け.sql
/*1つの条件の場合*/
SELECT メモ FROM 家計簿 WHERE 入金額 = 0;
/*2つ以上条件を付けたい場合*/
SELECT メモ FROM 家計簿 WHERE 入金額 = 0 AND 出金額 = 0;
```
使える不等号の効果一覧
|不等号|効果|
|---|---|
|=  |等しい場合|
|<>  |等しくない場合|
|<  |左辺が右辺より小さい場合|
|>  |右辺が左辺より小さい場合|
|<=  |以上の場合|
|>=  |以下の場合|

条件付けを複数付けたい場合は'&'を付けることで可能になる


###### 実行結果
1つの条件の場合
``` 条件付け実行結果例1.sql
メモ
コーヒーを購入
書籍購入
同期会の会費
1月の電気代
```

2つ以上条件を付けたい場合
``` 条件付け実行結果例2.sql
メモ
1月の給料
```

### データの更新
データを更新するコードは
```データ更新.sql
/*全てを行に上書き*/
UPDATE テーブル名 SET 列の名前A = 更新したい値A;

/*複数の更新*/
UPDATE テーブル名 SET 列の名前A = 値A, 列の名前B = 値B;

/*条件に合ったものだけ上書き*/
UPDATE テーブル名 SET 列の名前A = 更新したい値A WHERE 列の名前B = 条件A;

```
細かく分解すると
UPDATE で更新の命令を出し
テーブル名 でどのテーブルを更新するかを選択
SET 列の名前 = 〇〇〇 で更新したい値を選択
これで更新ができるしかしこの場合すべての行を更新してしまうので
基本的にはこれプラス'WHERE'で条件を付けて条件に合ったものだけを更新するというような使い方をする

またpaizaを使って確認したい場合は
最後にデータ表示のコマンドを書く必要がある

#### 実演

##### 全てを上書き
``` 全てを上書き.sql
UPDATE 家計簿 SET メモ = 'aaa';

/*paizaで書いている場合は下も書く*/
SELECT 日付, メモ FROM 家計簿;
```
これを上記でも書いたがこれを実行すると全ての行のメモが’aaa’に更新される
おそらく実務等では全ての行に上書きというのは無いので余り使い道は無い

もしかしたらゲームのシーズンが終わった際にスコアを初期値に戻す時に使ったりするのかも...?


###### 実行結果
``` 全てを上書き実行結果.sql
日付	     メモ
2022-02-03	 aaa
2022-02-10	 aaa
2022-02-11	 aaa
2022-02-14	 aaa
2022-02-18	 aaa
```


##### 複数の更新
``` 複数の更新.sql
UPDATE 家計簿 SET メモ = 'aaa', 入金額 = 5;
/*paizaで書いている場合は下も書く*/
SELECT 日付, メモ, 入金額 FROM 家計簿;
```
これも','を付けることで複数の列に対して更新ができる


###### 実行結果
``` 複数の更新実行結果.sql
日付	     メモ	入金額
2022-02-03	 aaa	5
2022-02-10	 aaa	5
2022-02-11	 aaa	5
2022-02-14	 aaa	5
2022-02-18	 aaa	5
```


##### 条件に合ったものだけ上書き
``` 条件に合ったものだけ上書き.sql
/*条件が1つだけ*/
UPDATE 家計簿 SET メモ = 'bbb' WHERE 日付 = '2022-02-10';

/*条件が複数*/
/*UPDATE 家計簿 SET メモ = 'bbb' WHERE 出金額 = 0 AND 入金額 = 0;*/
/*UPDATE 家計簿 SET メモ = 'bbb' WHERE 出金額 = 0 OR 入金額 = 0;*/

/*paizaで書いている場合は下も書く*/
SELECT 日付, メモ FROM 家計簿;
```
おそらくこれが更新方法で一番使う形
また条件を複数書きたい場合は'AND'や'OR'で区切ると可能になる


###### 実行結果
``` 条件に合ったものだけ上書き実行結果.sql
日付	     メモ
2022-02-03	 コーヒーを購入
2022-02-10	 bbb
2022-02-11	 書籍購入
2022-02-14	 同期会の会費
2022-02-18	 1月の電気代
```


### データの追加
データを挿入するコードは
``` データの追加.sql
/*基本的な追加*/
INSERT INTO テーブル名 VALUES(値A,値B...);

/*入力するデータを指定して追加*/
INSERT INTO テーブル名 (列の名前A,列の名前B,列の名前C) VALUES (値A,値B,値C);
```
細かく分解すると
INSERT INTO　が追加するという命令
VALUES(...)　で値を設定

#### 実習

#####　基本的な追加
``` 基本的な追加.sql
INSERT INTO 家計簿 VALUES('2022-02-20','aaa','bbb',0,0);

/*paizaで書いている場合は下も書く*/
SELECT * FROM 家計簿;
```
これを実行すると指定した値のデータが追加される


##### 実行結果
``` 基本的な追加実行結果.sql
日付	    費目	     メモ	         入金額	   出金額
2022-02-03	食費	     コーヒーを購入	 0	       380
2022-02-10	給食	     1月の給料	     280000	   0
2022-02-11	教育娯楽費	 書籍購入	     0	       2800
2022-02-14	交際費	     同期会の会費	 0	       5000
2022-02-18	水道光熱費	 1月の電気代	     0	       7560
2022-02-20	aaa	         bbb	         0	       0
```


##### 入力するデータを指定して追加
``` 入力するデータを指定して追加.sql
INSERT INTO 家計簿(日付,メモ,入金額) VALUES('2022-02-20','aaa',0);

/*paizaで書いている場合は下も書く*/
SELECT * FROM 家計簿;
```
この時に値を設定していない場合は空(NULL)が入れられるので便利
またテーブル名の後の列の順番は順不同である

しかし注意することが2つある(もっとあるとおもう．．．)
1つ目
テーブル名の後の列の順番と'VALUES'は順番を一致させる必要がある

2つ目
テーブル名の後に列の名前を入力する際は複数回同じ名前を書くとエラーになる


###### 実行結果
``` 入力するデータを指定して追加実行結果.sql
日付	     費目	     メモ 	         入金額	   出金額
2022-02-03	 食費	     コーヒーを購入	 0	       380
2022-02-10	 給食	     1月の給料	     280000	   0
2022-02-11	 教育娯楽費	 書籍購入	     0	       2800
2022-02-14	 交際費	     同期会の会費	 0	       5000
2022-02-18	 水道光熱費	 1月の電気代	     0	       7560
2022-02-20	 NULL	     aaa	         0	       NULL
```
費目と出資金がNULLになっているのを確認

### データの削除
``` データの削除.sql
/*全て削除*/
DELETE FROM テーブル名;

/*条件付きの削除*/
DELETE FROM テーブル名 WHERE 列の名前 = 'aaa';
```
細かく分解すると
DELETE で削除の命令
FROM でテーブルを指定
WHERE で対象になる物を探す

####　実習

##### 全て削除
``` 全て削除.sql
DELETE FROM 家計簿;

/*paizaで書いている場合は下も書く*/
SELECT * FROM 家計簿;
```
DELETEの基本的な使い方は条件を付けて使うのでおそらくこれを使う事はないと思う．

##### 実行結果
```全て削除実行結果.sql
```
実行結果は全て削除されたので空欄になる


##### 条件付きの削除
``` 条件付きの削除.sql
DELETE FROM 家計簿 WHERE 日付 = '2022-02-18';

/*paizaで書いている場合は下も書く*/
SELECT * FROM 家計簿;
```
これを実行することで日付が2022-02-18に該当するものを全て削除することができる
おそらくこれが削除で一番使う方法

##### 実行結果
``` 条件付きの削除実行結果.sql
日付	      費目	      メモ	          入金額	     出金額
2022-02-03	  食費	      コーヒーを購入	  0	         380
2022-02-10	  給食	      1月の給料	      280000	 0
2022-02-11	  教育娯楽費	  書籍購入	      0	         2800
2022-02-14	  交際費	      同期会の会費	  0	         5000
```
2022-02-18のデータが消えている事を確認

### Errorが出る時に確認する事リスト
・単語で誤字，脱字をしていないか注意する
・'SELECT'やスペースを全角でやっていないか注意する
・最後に';'をちゃんとつけているか注意する
・' が " になっていないか注意する

## 参照
[スッキリわかるSQL入門](https://www.amazon.co.jp/dp/4295013390/ref=cm_sw_r_tw_dp_81R98MA0Q2S7RQA0V6MG)


## おわりに
KNRさんのデータベースの記事でスッキリわかるSQL入門があったので購入して読むとわかりやすくて
スラスラ読めたので備忘録的な形で記事を作りました．
一気に作ったのでおそらくおかしな場所や言葉足らずなところがあると思うのでコメントしてください．