初心者が月10万稼ぐ為の記録10　データベースの操作

データベース：MySQL
データベースを操作するツール：phpMyAdmin

（仮）会員を管理して会員が投稿したメッセージを管理するシステムを作成

#テーブル作成とカラム作成
①新規作成→②データベース名→③作成ボタンを押す
utf8mb4_general_ciは文字コードの選択で日本語ならこれでOK

![db1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/046ff28c-3f76-a049-b0a8-44a56f40dbce.png)

テーブルを作成
テーブル名：users カラム数:10
エクセルでいうシートのイメージでカラムの数は後で変更できる。実行ボタンを押す
![db2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/ad80b750-a681-c406-b161-01cf92c7f011.png)

**テーブルを作成する際には
あらかじめ何を入れるか決めとく必要がある。
例えば今回なら会員メンバーを登録するので
それによって名前、データ型に何を入れるかかわってくる。**

名前の欄に
name（名前）email（メール）gender（男、女）birth（誕生日）age（年齢）
**データ型を入れる際の注意点**
データ型に例えば名前なのにINT型にしてしまうと、そこには数字しか入らなくなるので考えて入れる。
名前だと文字なので文字列型を入れるんですが、TEXEでもいいのですが、TEXTだと6万5千文字ぐらい入る。
名前はせいせい20文字くらいなので文字列に制限がある文字列型にする方がよい。
制限がある文字列型だとCHAR、VARCHAR、TINYTEXT、LONGTEXTその他にも色々ある。
データベースは大量にデータがはってくるので余計な領域な取らないほうがいよい。
名前だと**VARCHR**がよい。

このように入れたら保存ボタンを押す。
![db3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/14bc8b42-357c-2684-9457-4a452b8c844d.png)

データが何も入ってない状態なので挿入ボタンを押してデータ入れる。
![db4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/84909f73-bb54-1c89-d1ed-01dac4e0a5ba.png)

本来はweb上で会員登録画面から入力してデータベースに登録する流れになるが
今回は仮ということで挿入ボタンから直接入力した。
![db5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/03d80119-200d-387f-04ea-9cd5d87c18a7.png)

#SQLの基本とINSERT（挿入）
挿入とか編集はボタンを押して簡単にできるが、
データベースをしっかり使いこなすには
SQL（お問い合わせ言語）が必要になってくるので
SQLの基本から学ぶ。

SQLのタブをクリックするとコードを書くことができる。
👇入力する

```sql
INSERT INTO users SET name="山田", email="yamada@yn.jp", gender="女", birth="1999/11/23", age=35;
```
👇追加されている
![db6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/316a424d-4c96-eae1-5220-dc02a92ddb4c.png)


**プライマリーキーの設定**
現状だとこのように出ている。
このままだと、例えば、name、email、gender、birth、ageがまったく一緒の人が登録したら
どっちがどっちだかわからなくなる。
そのため、編集、コピー、削除がでいない。
まったく一緒の人でも区別をつける必要がある。
他のデータと絶対と絶対に重ならないデータが必要になる。
新しいカラムを追加する必要がある。


PRIMARYを設定する場合一度、**操作タブからテーブルを空**にするひつようがある。

構造タブ→カラム数を決めて→どの場所に追加するか決める。（今回は一番上）→実行ボタンをクリック

**名前をid**、**データ型をINT**にして**インデックスをPRIMARY**にしてAIにチェックし設定して保存する。
AIとはオートインクルメントで自動でidをふってくれる。
自分でidをふることになると、まちがって同じidをふってしまうと登録できない。自動でふってくれるように設定しておけば防ぐことができる。

👇idというカラムが追加される。
![db8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631322/956749a2-6d0e-aea6-fcf2-7e36377ce186.png)

#レコードの更新（UPDATE）と削除（DELETE）
今回のように仮で作成しテストでやってる場合は
たくさんデータを登録するさい大変なので
テストデータ生成のサイトで作成する
URL：https://tm-webtools.com/Tools/TestData

**レコード更新（UPDATE）書き換え**
id 1 方の　メールアドレス「DtAPYxn@example.co.jp」を変更する場合

```sql
UPDATE users SET email="cccc@vvvv.jp" WHERE id=1;
```
id 1 の　メールアドレス「cccc@vvvv.jp」に変更される。

☝**WHERE**はどのデータを書き換えますかという意味。

**削除（DELETE）**
id 1 方が退会して削除する場合

```sql
DELETE FROM users WHERE id=1;
```

#検索（SELECT）構文と WHEREの条件
**id 35の方の名前を検索したい場合**

```sql
SELECT id , name FROM users WHERE id=35;
```
**id 35の方の全部の情報を知りたい場合「*」を使う**

```sql
SELECT * FROM users WHERE id=35;
```
年齢が35歳未満の方を検索したい場合

```sql
SELECT * FROM users WHERE age<35;
```
かっこの中に複数条件を入れたいとき「IN」

```sql
SELECT * FROM users WHERE age IN (10, 20, 30);
```
同じ苗字を検索したいとき「LIKE」

```sql
SELECT * FROM users WHERE name LIKE '磯野%'
```
**「%」**は例えば磯野の後に何が入っていてもよいという意味

部分一致にしたい場合
名前に「内」がはいってる人検索する場合

```sql
SELECT * FROM users WHERE name LIKE '%内%'
```

複数の条件を組み合わせる場合
論理演算子を使用する。
名前に「内」が入っていて、年齢が35歳以上の方を検索する場合

```sql
SELECT * FROM users WHERE name LIKE '%内%' AND age>=35;
```
更に複数条件をつけるとき
名前に「内」が入っていて、年齢が35歳以上の方か、女性の方の場合
**（ ）がないとORが優先されて前の条件は無視される。**

```sql
SELECT * FROM users WHERE name LIKE '%内%' AND (age>=35 OR gender="女")
```
####注意点
例えば、「UPDATE」と「DELETE」使い複数条件で書き換えたり、削除したりする場合、条件を間違えて実行してしまうと間違った条件で書き換えたり、削除してしまうので、必ず、「SELECT」で確認して、その後に「UPDATE」と「DELETE」をした方が安全

####sqlの演算子

| 演算子      | 意味 |    
|--------    |-----:|
| =          | 等しい|
| != , <>    | 等しくない |
| >          | より大きい |
| <          | より小さい |
| >=         | 以上 | 
| <=         | 以下 |
| IN         | 列挙した要素の中から探す|
| NOTIN      | 列挙した要素以外のもの |
| BETWEEN    | 範囲以内|
| LIKE       | 文字列の部分一致|

複数条件を「論理演算子」でつないで検索することもできる

| 演算子 | 意味 |    
|-------|-----:|
| NOT   | 否定|
| AND   |かつ |
| OR    | または |

#集計・並べ替え構文

先に
**GROUP BY**
指定したカラムを基準にしてグループを作ってその中で計算する。

**ORDER BY**
指定したカラムの値を対象にソートする


男性、女性の年齢の平均を調べたいとき

```sql
SELECT gender, AVG(age) FROM users GROUP BY gender;
```

☝年齢というカラムを基準に平均を計算する

男性、女性の人数を調べたいとき

```sql
SELECT gender, COUNT(*) FROM users GROUP BY gender;
```

名前をあいうえお順に並べたいときは

```sql
SELECT * FROM users ORDER BY name;
```
これだと、文字コード順に並んでしまう。
日本語には一つの漢字で複数の読み方がある。
「あいうえお」順に並べたいときは
「ふりがな」という」カラムを用意する。

```sql
SELECT * FROM users ORDER BY name_kana;
```

表示する件数を指定する場合は「LIMIT」

```sql
SELECT * FROM users LIMIT 10;
```