SQL学習備忘録　SQLチートシート②SELECT文に関する修飾語１

　以下の Qiita の続きです。以前からお世話になっている共助学習コミニティのモブプロを通して、SQL の直書きの必要にせまられ（？もしかしたら使わない？）、全然分かってないな（or忘れてるな）と感じ、個人用に作っています。（Qiita なのに…(･∀･)）

※コピペ後、カラム名など差し替えるときは（エラーになるので）前後などに全角スペースが入らないように気をつけてください。

https://qiita.com/thinking-weed/items/1a14382db58b8697bae8

____

<h3>〇主な学習参考資料・実験材料</h3>
①『スッキリわかるSQL入門　中山 清喬/飯田 理恵子 共著, 株式会社フレアリンク 監修』

<details><summary>Amazonリンク</summary>

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=sr_1_4?crid=R3S0R02A45NW&dib=eyJ2IjoiMSJ9.xInwby6L9meVu-DcOzcsfGzSfA1TV5kHAI58d3yqbfFMpcMhpEpLBh7sv0MjU3gQ8Cz4yhNI5lfvqxmBbR5ERANf8Ob7iqbXgRIgkXGa1KjltvTOtjuOEQhBXmA6K6aQSFy7XZ4Y2UJkRiJ83FoDD3vxUmLTCz_4w2ckeBvzahtYwvMksPr6AgUr0vvgUNjaEwA28iHoEfC94ajVHRmEZE4vpywXnK28LzpJJGIVtiq9FHTnU8IxU6cWgjD2bfmyVYidrxQbXOB_ltcz4kbyaJ0kaJqEaWZ_yU1iRh1NOqk.2UDSmegUKoH6wU_5N866HOyVH34SBolZlXACu53ocsI&dib_tag=se&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8Bsql%E5%85%A5%E9%96%80&qid=1714370070&sprefix=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E5%88%86%E3%81%8B%E3%82%8BSQL%2Caps%2C212&sr=8-4
</details>

②転職活動時のポートフォリオに付けた意見投稿フォームのCRUDに紐付けた MySQLWorkbench

____

　※なお以下、本題に移りますが、本 Qiita においては
「データ」は各レコード（横の行）においてカラム（縦の列（の項目名））を指定して、一部取り出したVALUE（値）を指すものとします
_____

<h3>① ASを用いてカラム名を指定し直して、データを取得するSELECT文</h3>

```sql
SELECT column_name1 AS new_column_name1 column_name2 (, …) AS new_column_name2 (, …)
FROM table_name1 AS new_table_name1
WHERE column_name1 = '〇〇'  /*カラム名が条件を満たすレコード（行のデータのみ調べる）*/
```

※WHERE句の条件式の左辺は元々のカラム名

※実際のコードに埋め込む場合も可読性のために、このように分けて書いてヒアドキュメントで一気に変数に代入することはよくあるようです。

____

<h3>② あるカラムの値が NULL 値である（でない）レコード（＝その行すべてのデータ）をすべて取得するSELECT文</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 IS NULL
```
```sql
SELECT *
  FROM table_name1
 WHERE column_name1 IS NOT NULL
```

___

<h3>③ LIKE演算子を用いて、あるカラムにおいて特定の文字列を含むレコードをすべて取得するSELECT文</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 LIKE '%word%'  
 /*wordの前後に任意の0文字以上の文字列がついているものを取得する*/
```

　※上記の「%」のように「（含まれていることを許容する）任意の文字（列）」を表す文字を「パターン文字」と呼び、他にも「_（半角英数アンダーバー）：任意の１文字」等あるようです。

　**※パターンマッチング（上記のようにSQL等で文字列があるパターンに合致しているか確認すること）をしたい文字列が英語等の外国語または日本語の場合は、あまり意識しないですが、何度か試したところ「１月」のように数字を使う場合、「１」が半角か全角かもSQLでは識別されるようです。**

___
<h3>④「～％」等、パターン文字を普通の文字として扱い、LIKEを使って特定の文字列を含むレコードをすべて取得するSELECT文</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 LIKE '%〇〇～%'
ESCAPE ～　
/*「～」をエスケープ処理（※下記参照）に用いる文字列とする*/
```

なお、Oracle やMySQL等以下にあるようにエスケープ処理（ある特定の意味をもつ文字列を意味をもたない文字列として扱われるようにすること）の記法は以下サイトで紹介されているようにDBで微妙に異なるようです。

https://style.potepan.com/articles/21820.html

<h3>⑤あるカラムの値を２つ指定したときに、カラムの値がその範囲内に収まるレコードをすべて取得するSELECT文</h3>

```sql
SELECT *
  FROM table_name1
 WHERE column_name1 BETWEEN number1 AND number2
```
※**上記の「number1」「number2」は「データ型が同じであれば」、必ずしも例えばIntegerのような「数値」でなくともよいようです。※例えば以下の「データの投稿日時（created_at）」や日付のように順序をつけられるような数字の文字列であれば、以下のように適用される。**

<details><summary>冒頭②のMySQLWorkBenchで実験してみた結果</summary>

※なお、冒頭②のポートフォリオはLaravel（たしかver10）で作ったものです。

![migration1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/64ae5066-833b-5e42-c2bb-3bbbf4a4ba26.png)

※上記の.phpファイルはmigrationsというフォルダに入っていますが、これはLaravelの各プロジェクトに紐付けるDBのテーブルの型やプライマリーキーなどを指定・設定するファイルです。（作ったら php artisan migrate 等のartisan コマンドやsailコマンドをpowershellなどターミナルで打つとテーブルが設定されます）

※timestamp：ある出来事が発生した日時・日付・時刻などを示す文字列（SQLでデータを直接入れない場合、ここでは上記のポートフォリオのフォームに投稿した日時が文字列で入ります。）

![portfolio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/62ef4b00-c7c9-566c-2468-81e13e237c83.png)

![portfolio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/990ad3c6-90cf-911a-a4c6-d616be98f2c6.png)

<h3>上記の部分に対応するDBのテーブルをMySQLWorkBenchで見た結果</h3>

![MySQLworkBench5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/2894227e-c664-83c7-a981-eff678bcd21b.png)

![MySQLworkBench4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584834/1fcc9e7b-86aa-753b-0b0a-a77416e50fa3.png)

</details>

____

<h3>⑥ nullableなどで、NULL 値が値として許容されている場合に列を指定して追加するINSERT文（※３項目だけ挿入する場合）</h3>

```sql
INSERT INTO table_name1
            (column_nameX, column_nameY, column_nameZ)
     VALUES (value1, value2, value3)
```

<h4>※カラム名の順番がテーブルのカラムの順番と異なっていても自動で適切な場所に挿入されるみたいです（ただし、データ型は当然考慮する）</h4>