###### tags: `ready for review`
# SQLの基本を抑えよう
本章ではSQLの文法について学んでいきます。
データベースやSQLがどのようなものだったか忘れてしまった方は、
学習前に知っておくべきことの[データベースとは](https://aitechschool.online/engineer/basic/before_study/335/)をご覧ください。
昨今、SQLを書かなくてもデータベースを操作できるアプリが登場していますが、
アプリとデータベースを連携させる場合はSQLを意識しなければならない場合が多いので、
少しずつSQLに慣れていきましょう。
## データベースの作成
動画で完結させたい
## データ型
テーブルを作成する時、カラムに型を設定します。
この「型」はデータ型とも呼ばれ、そのカラムに格納できる値を制限する役割があります。
数値だけを格納したい場合は`INT`、文字列だけを格納したい場合は`CHAR`や`VARCHAR`、
日付を格納したい場合は`DATE`というように様々なデータ型があります。
データ型は覚えなくて大丈夫です。
必要に応じて`SQL データ型`などのワードで調べるようにしましょう!
## テーブルの作成
動画で完結させたい
## データを取得しよう
SQLでデータを取得するには
```sql=
SELECT カラム名 FROM テーブル名;
```
という文法になります。
<br>
先ほど作成したemployeeテーブルのnameカラムのデータだけを取得する場合は以下のようになります。
```sql=
SELECT name FROM employee;
```
<br>
全てのカラムのデータを取得したい場合は`*(アスタリスク)`を使用します。
```sql=
SELECT * FROM employee;
```
<br>
### 条件を付けてデータを取得しよう
SQLで特定のデータを対象にしたい時、`WhHERE句`を利用します。
employeeテーブルのidが1のデータを取得する場合、以下のようになります。
```sql=
SELECT * FROM employee WHERE id = 1;
```
<br>
AかつBは`AND`、AまたはBは`OR`を利用します。
```sql=
SELECT * FROM employee WHERE id = 1 AND name = "田中";
SELECT * FROM employee WHERE id = 1 OR name = "田中";
```
## データを登録しよう
データを登録するには
```sql=
INSERT INTO テーブル名(カラム1, カラム2, ...) VALUES (カラム1に設定する値, カラム2に設定する値, ...);
```
という文法になります。
nameカラムに高橋、ageカラムに29という値を設定してデータを登録してみましょう!
```sql=
INSERT INTO employee(name, age) VALUES ("高橋", 29);
```
## データを更新しよう
データを更新するには
```sql=
UPDATE テーブル名 SET カラム名 = 更新する値;
```
という文法になります。
通常、更新する対象を`WHERE句`で指定して利用します。
ageカラムの値を30に更新してみましょう。
ただし、idカラムの値が1のレコードのageカラムを更新の対象とします。
```sql=
UPDATE employee SET age = 30 WHERE id = 1;
```
## データを削除しよう
データを削除するには
```sql=
DELETE FROM テーブル名;
```
という文法になります。
これも`UPDATE`の時と同様に、`WHERE句`で削除する対象を指定します。
WHERE句がない場合、テーブルに登録されているデータ全て削除されてしまうので注意が必要です。
nameカラムの値が田中のレコードを削除してみましょう!
```sql=
DELETE FROM employee WHERE name = "田中";
```
## プリペアードステートメント
いきなりプリペアードステートメントと言われてもイメージしづらいと思うので、
まずは日本語に直してみます。
- prepared = 準備(用意)された
- statement = 文
直訳すると、`あらかじめ用意された文`という意味になります。
<br>
データベースを利用するとき、データを取得、追加、削除と同じような命令を何度も行うことがあります。
例えば、idが1, 2, 3のデータを取得するSQLを1回ずつ実行するとこのようになります。
```sql=
SELECT * FROM employee WHERE id = 1;
SELECT * FROM employee WHERE id = 2;
SELECT * FROM employee WHERE id = 3;
```
3回SQLが実行されていますが、`SELECT * FROM employee WHERE id =`の部分は共通しています。
このように共通した部分は先にデータベースに送って解析します。
その後、共通していない部分(今回であれば数値の1, 2, 3)をデータベースに送り、先に送っていた共通した部分に当てはめSQLを実行します。
このような仕組みを`プリペアードステートメント`と呼びます。
プリペアードステートメントを利用するには値が変動する箇所を`?`にします。
```sql=
SELECT * FROM employee WHERE id = ?;
```
`?`の部分のことを`プレースホルダ`といい、
`?`の部分に値を割り当てることを`バインド`や`バインドする`というので覚えておきましょう。
プリペアードステートメントを使用することで検索速度の向上やSQLインジェクション対策ができるので積極的に取り入れていきましょう。
<span style="color: red; ">memo</span>
SQLインジェクションの説明どこでする?
## SQLでテーブルを作成しよう
employeeテーブルはGUIで作成しましたが、今回はSQLでテーブルを作成します。
テーブルを作成するには
```sql=
CREATE TABLE テーブル名 (カラム1 データ型, カラム2 データ型, ...);
```
という文法になります。
<br>
以下のSQLを実行してblogsテーブルを作成しましょう。
```sql=
CREATE TABLE blogs (id INT AUTO_INCREMENT, content VARCHAR(140), PRIMARY KEY (id));
```
`AUTO_INCREMENT`と`PRIMARY KEY (id)`を付けることによって、
データを登録するたびにidカラムの値が自動で1づつカウントアップするようにしています。
## 課題
以下の課題は全てSQLを実行するようにしましょう。
### 課題1
blogsテーブルのcontentカラムにを3つデータを登録しましょう。(登録の内容は何でも可)
データ登録後、テーブルが以下のようになっていればOKです。
| id | content |
| :-: | ------------ |
| 1 | 初めての投稿 |
| 2 | 2回目の投稿 |
| 3 | 3回目の投稿 |
### 課題2
blogsテーブルのidが3のレコードを更新しましょう。
データ更新後、テーブルが以下のようになっていればOKです。
| id | content |
| :-: | ------------ |
| 1 | 初めての投稿 |
| 2 | 更新完了 |
| 3 | 3回目の投稿 |
### 課題3
SQLを使用してblogsテーブルのidが1のレコードを削除しましょう。
データ削除後、テーブルが以下のようになっていればOKです。
| id | content |
| :-: | ------------ |
| 2 | 更新完了 |
| 3 | 3回目の投稿 |