SQL文の備忘録

## SQL文とは
SQLはデータベース言語の一つで、データベースの定義や操作を行うことができます。
SQLはISO（国際標準化機構）で規格が標準化されており、一度学習すればほかのデータベースでもほぼ同じように操作可能です。
SQL文は大きく分けて３種類の言語から構成されています。データベースを制御したり操作したりする際に使い分けられ、すべて命令文で動詞と目的語を組み合わせた構文です。

* データ定義言語（Data Definition Language）
データ定義言語はDDLと略され、RDBMSで扱うオブジェクト（テーブルやインデックスなど）の構造や、オブジェクト同士の関係を定義する構文です。

**＜DDLの命令文＞**
CREATE: 新しいデータベースやテーブルなどのオブジェクトを定義する
JOIN：テーブル同士を結合する
DROP：定義したオブジェクトを削除する
ALTER：定義したオブジェクトの内容を変更する
TRUNCATE：データをすべて削除する

* データ操作言語（Data Manipulation Language）
データ操作言語はDMLと略され、データベースを操作するための構文です。目的語やさまざまな条件を示すキーワードと組み合わせて使われ、多くのパターンがあります。目的語には「～以上」「～以下」などの条件をつけることもでき、SQL関数と呼ばれる関数を使用することもできます。
**＜DMLの命令文＞**
SELECT：データベースを検索する
INSERT：データを挿入する
DELETE：データを削除する
UPDATE：データを更新する

* データ制御言語（Data Control Language）
データ制御言語はDCLと略され、データへのアクセスを制御する構文です。トランザクションやシステムを管理したり、ユーザーのアクセス権を制御したりするために使われます。
**＜DMLの命令文＞**
GRANT：ユーザー権限を付与する
REVOKE：ユーザー権限を削除する
BEGIN：トランザクションを開始する
COMMIT：トランザクションを確定する
ROLLBACK：トランザクションを取り消す

## 使い方
#### SELECT（どのカラムから）

```
SELECT name
```

#### FROM（どのテーブルから）

```
SELECT name
FROM shoppinglist;
```

**複数のカラムからデータを取得**

```
SELECT name
FROM shoppinglist;
```

WHERE（特定のレコードを取得）

```
SELECT ＊
FROM shoppinglist
WHERE　price　= 100;
```

**データ型**
データベースに保存するデータには「データ型」というルールがある。それぞれテキストや数値、日付など「データの種類」を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266013/5cfb101d-b416-bed2-c99c-f38bb8abb57b.png)

#### 比較演算子の一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266013/68c324a6-5304-0976-7c77-69381b35e4b7.png)

* LIKE演算子（ある文字を含むデータを取得）

```
SELECT *
FROM shoppinglist
WHERE name LIKE "%魚%";
```

* ワイルドカード

```
SELECT *
FROM shoppinglist
WHERE name LIKE "%納豆%";
```

* 前方一致

```
SELECT *
FROM shoppinglist
WHERE name LIKE "トマト%";
```

* NOT演算子

```
SELECT *
FROM shoppinglist
WHERE NOT price = 100;
```

* NULLのデータを取得

```
SELECT *
FROM shoppinglist
WHERE NOT price = 100;
```

* AND演算子

```
SELECT * FROM shoppinglist
WHERE name = "鶏肉"
AND price　= 300;
```

* OR演算子

```
SELECT * FROM shoppinglist
WHERE name = "鶏肉"
OR name　= "もやし";
```

* ORDER BY
* 
```
SELECT * FROM shoppinglist
ORDER BY　price DESC;
```

* 「ORDER BY」と「WHERE」の併用

```
SELECT * FROM shoppinglist
WHERE　name = "鶏肉"
ORDER BY　price ASC;
```

* LIMIT
最大で何件取得するか

```
SELECT * FROM shoppinglist
LIMIT 3;
```

* DISTINCT（重複データを省く）

```
SELECT DISTINCT(name)
FROM shoppinglist;
```

* 四則演算
足す(+)、引く(-)、かける(*)、割る(/)ができる。
例えば、買い物リストの各商品に消費税を入れる。↓

```
SELECT name,price * 1.08
FROM shoppinglist;
```
* SUM関数

```
SELECT SUN(price)
FROM shoppinglist;
```
* AVG関数

```
SELECT AVG(price)
FROM shoppinglist;
```

* COUNT関数
↓カラム指定

```
SELECT COUNT(name)
FROM shoppinglist;
```

↓全てのカラム

```
SELECT COUNT(*)
FROM shoppinglist;
```

* MAX・MIN関数

```
SELECT　name,MAX(price)
FROM shoppinglist;
```

* GROUP BY(グループ化をする)
GROUP BYを用いると、データをグループ化することができます。例えば図のように「GROUP BY カラム名」とすることで、指定したカラムで、完全に同一のデータを持つレコードどうしが同じグループとなる。

```
SELECT　SUM(price),date
FROM shoppinglist
GROUP BY date;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266013/c86d1702-1b39-9a78-3f60-bacd7a8b5117.png)


* HAVING（グループ化したデータを絞り込む）

```
SELECT　SUM(price),date
FROM shoppinglist
GROUP BY date
HAVING　SUN(price)>500;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266013/799335c2-f9f6-53b5-99d6-466854072722.png)
※HAVINGはグループ化された後のテーブルから検索するため、条件文で使うカラムは必ずグループ化されたテーブルのカラムを使う。