SQLの基本を覚える【初心者向け】

#データベースとは
テキストや数値などのデータを保存するためのツールのこと

#テーブルの構造
データベースは、以下の図ような表でデータを管理している。

<a href="https://gyazo.com/19050eb8c11d0c206c8eca233291a06e"><img src="https://i.gyazo.com/19050eb8c11d0c206c8eca233291a06e.png" alt="https://gyazo.com/19050eb8c11d0c206c8eca233291a06e" width="413"/></a>

- 表「テーブル」
- 縦の列「カラム」
- 横の列「レコード」

それぞれこのような呼び方をする。

#SELECT（どのカラムから？）
データベースから、データを取得するために「選ぶ」という意味の「SELECT」を使う。SELECT文で「どのカラムのデータを取得するか」を選ぶ。

```
SELECT name
```

#FROM（どのテーブルから？）
データベースには複数のテーブルが存在する場合もある。そのため「FROM」を使い、SELECT文で選んだカラムが「どのテーブルのカラムか」を指定する。

```
SELECT name
FROM shoppinglist;
```
<a href="https://gyazo.com/e04eafcdae47816578ed8720630ce8f9"><img src="https://i.gyazo.com/e04eafcdae47816578ed8720630ce8f9.png" alt="https://gyazo.com/e04eafcdae47816578ed8720630ce8f9" width="299"/></a>
#複数のカラムからデータを取得
複数のカラムからデータを取得する場合は、カラム名をコンマ(,)で区切る。

```
SELECT name,price
FROM shoppinglist;
```
<a href="https://gyazo.com/6860972f6061cb295d84f634e445977d"><img src="https://i.gyazo.com/6860972f6061cb295d84f634e445977d.png" alt="https://gyazo.com/6860972f6061cb295d84f634e445977d" width="297"/></a>
#全てのカラムからデータを取得
アスタリスク(*)は、「全て」という意味。

```
SELECT *
FROM shoppinglist;
```
<a href="https://gyazo.com/bc6296648b2fa7ee150543558f017a79"><img src="https://i.gyazo.com/bc6296648b2fa7ee150543558f017a79.png" alt="https://gyazo.com/bc6296648b2fa7ee150543558f017a79" width="297"/></a>
#WHERE（特定のデータを取得）
特定のデータを取得するためには、「WHERE」を使う。「どこのレコード（横の列）を取得するか」という意味。

```
SELECT *
FROM shoppinglist
WHERE　price　= 100;
```
「＝」を使い「priceカラムが100であるレコード」という意味になるよう条件を指定する。
<a href="https://gyazo.com/29c69444dd38eea52f0b61e4599fd61c"><img src="https://i.gyazo.com/29c69444dd38eea52f0b61e4599fd61c.png" alt="https://gyazo.com/29c69444dd38eea52f0b61e4599fd61c" width="298"/></a>

#データ型
データベースに保存するデータには「データ型」というルールがある。それぞれテキストや数値、日付など「データの種類」を示す。

<a href="https://gyazo.com/16dd071b0179439f5b4055b22a603541"><img src="https://i.gyazo.com/16dd071b0179439f5b4055b22a603541.png" alt="https://gyazo.com/16dd071b0179439f5b4055b22a603541" width="309"/></a>
↑数値のデータは、クオテーションが不要になる。

#比較演算子
比較演算子を使うと「priceカラムが100以下のレコード」などを取得することができる。priceカラムのデータが「100以下」を検索する。

```
SELECT *
FROM shoppinglist
WHERE price <= 100;
```
<a href="https://gyazo.com/a4a39b7459dc9050263149d98597c4bd"><img src="https://i.gyazo.com/a4a39b7459dc9050263149d98597c4bd.png" alt="https://gyazo.com/a4a39b7459dc9050263149d98597c4bd" width="299"/></a>
##比較演算子の一覧
<a href="https://gyazo.com/f46e5f2d11a468d34c43662cbff80c69"><img src="https://i.gyazo.com/f46e5f2d11a468d34c43662cbff80c69.png" alt="https://gyazo.com/f46e5f2d11a468d34c43662cbff80c69" width="502"/></a>

#LIKE演算子（ある文字を含むデータを取得）
「ある文字を含むデータ」を取得する場合、「〇〇のような」という意味を持つLIKE演算子を使う。

```
SELECT *
FROM shoppinglist
WHERE name LIKE "%納豆%";
```
<a href="https://gyazo.com/f55c1ab7b2ff8d64081a0b1cdd16a8c3"><img src="https://i.gyazo.com/f55c1ab7b2ff8d64081a0b1cdd16a8c3.png" alt="https://gyazo.com/f55c1ab7b2ff8d64081a0b1cdd16a8c3" width="297"/></a>

##ワイルドカード
LIKE演算子は、ワイルドカードという「%」の記号を一緒に使う。「ワイルドカード」とは、どんな文字列にも一致することを指す。これにより「トマト」を含むデータを全て取得している。

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

<a href="https://gyazo.com/26dfef5d6caa3b434de3d7ea4399ee06"><img src="https://i.gyazo.com/26dfef5d6caa3b434de3d7ea4399ee06.png" alt="https://gyazo.com/26dfef5d6caa3b434de3d7ea4399ee06" width="318"/></a>

##前方一致
ワイルドカードを文字列の前後どちらかにのみ置くこともできる。「〇〇%」とした場合「〇〇」以降はどんな文字列にも一致するので「〇〇」で始まる文字列を検索することができる。※「%〇〇」は後方一致

```
SELECT *
FROM shoppinglist
WHERE name LIKE "トマト%";
```
<a href="https://gyazo.com/fdce25808d380fdc59574d479d336817"><img src="https://i.gyazo.com/fdce25808d380fdc59574d479d336817.png" alt="https://gyazo.com/fdce25808d380fdc59574d479d336817" width="319"/></a>

#NOT演算子
「〇〇に一致しないデータ」のような条件でデータを取得したい場合は「NOT演算子」を使う。

```
SELECT *
FROM shoppinglist
WHERE NOT price = 100;
```
<a href="https://gyazo.com/99f95166303dde924fb385f1d1fa067b"><img src="https://i.gyazo.com/99f95166303dde924fb385f1d1fa067b.png" alt="https://gyazo.com/99f95166303dde924fb385f1d1fa067b" width="317"/></a>

#NULL
何のデータも保存されていないということを示す。
<a href="https://gyazo.com/1b5fd7fb668f6d2f520a7c544addf4cc"><img src="https://i.gyazo.com/1b5fd7fb668f6d2f520a7c544addf4cc.png" alt="https://gyazo.com/1b5fd7fb668f6d2f520a7c544addf4cc" width="319"/></a>

##NULLのデータを取得
NULLのデータを取得するには、「〇〇がNULLである」という意味になる「IS NULL」を使う。

```
SELECT *
FROM shoppinglist
WHERE price IS NULL;
```
<a href="https://gyazo.com/57c7088c18742364b8c04a5660082731"><img src="https://i.gyazo.com/57c7088c18742364b8c04a5660082731.png" alt="https://gyazo.com/57c7088c18742364b8c04a5660082731" width="320"/></a>

##NULLではないデータを取得

```
SELECT *
FROM shoppinglist
WHERE price IS NOT　NULL;
```

<a href="https://gyazo.com/28a0395a07ab7445cf5fc14f9cf848f4"><img src="https://i.gyazo.com/28a0395a07ab7445cf5fc14f9cf848f4.png" alt="https://gyazo.com/28a0395a07ab7445cf5fc14f9cf848f4" width="322"/></a>

#AND演算子
WHERE文に複数の条件を指定することができる。「WHERE 条件1 AND 条件2」のようにすることで、条件1と条件2を共に満たすデータを検索することが可能になる。

```
SELECT * FROM shoppinglist
WHERE name = "鶏肉"
AND price　= 300;
```
<a href="https://gyazo.com/0ba1ba6d1f128f0d84aeae82292133ed"><img src="https://i.gyazo.com/0ba1ba6d1f128f0d84aeae82292133ed.png" alt="https://gyazo.com/0ba1ba6d1f128f0d84aeae82292133ed" width="319"/></a>

#OR演算子
AND演算子と同様に複数の条件を扱う。「WHERE 条件1 OR 条件2」のようにすることで、条件1または条件2のどちらかを満たすデータを検索することができる。

```
SELECT * FROM shoppinglist
WHERE name = "鶏肉"
OR name　= "もやし";
```
<a href="https://gyazo.com/265870772d27f1456392aa29d78e1a79"><img src="https://i.gyazo.com/265870772d27f1456392aa29d78e1a79.png" alt="https://gyazo.com/265870772d27f1456392aa29d78e1a79" width="322"/></a>

#ORDER BY
データを並び替えるには、順に並べるという意味の「ORDER BY」を使う。並べ方は、昇順(ASC)もしくは降順(DESC)を指定する。

```
SELECT * FROM shoppinglist
ORDER BY　price DESC;
```
<a href="https://gyazo.com/209bbc29137554297e2f8b1d7128b819"><img src="https://i.gyazo.com/209bbc29137554297e2f8b1d7128b819.png" alt="https://gyazo.com/209bbc29137554297e2f8b1d7128b819" width="322"/></a>

##「ORDER BY」と「WHERE」の併用
```
SELECT * FROM shoppinglist
WHERE　name = "鶏肉"
ORDER BY　price ASC;
```
<a href="https://gyazo.com/54aa2ed606235dd57f4e15762bf79403"><img src="https://i.gyazo.com/54aa2ed606235dd57f4e15762bf79403.png" alt="https://gyazo.com/54aa2ed606235dd57f4e15762bf79403" width="320"/></a>

#LIMIT
「最大で何件取得するか」を指定するためには、「制限する」という意味の「LIMIT」を使う。「LIMIT」は左の図のように「データの件数」を指定する。

```
SELECT * FROM shoppinglist
LIMIT 3;
```
<a href="https://gyazo.com/c701bb5f44e0cd3d22071901a51c6de7"><img src="https://i.gyazo.com/c701bb5f44e0cd3d22071901a51c6de7.png" alt="https://gyazo.com/c701bb5f44e0cd3d22071901a51c6de7" width="320"/></a>

#DISTINCT（重複データを省く）
検索結果から重複するデータを省くことが可能になる。「DISTINCT(カラム名)」とすることで、検索結果から指定したカラムの重複するデータを除くことができる。

```
SELECT DISTINCT(name)
FROM shoppinglist;
```
<a href="https://gyazo.com/8c154faf6f560a39f977081270be54c6"><img src="https://i.gyazo.com/8c154faf6f560a39f977081270be54c6.png" alt="https://gyazo.com/8c154faf6f560a39f977081270be54c6" width="320"/></a>

#四則演算
SQLでは、足す(+)、引く(-)、かける(*)、割る(/)ができる。

↓例えば、買い物リストの各商品に消費税を入れる。

```
SELECT name,price * 1.08
FROM shoppinglist;
```
<a href="https://gyazo.com/dced87453b330095eb98e9268d330d5e"><img src="https://i.gyazo.com/dced87453b330095eb98e9268d330d5e.png" alt="https://gyazo.com/dced87453b330095eb98e9268d330d5e" width="518"/></a>

#関数

##SUM関数
数値の合計を計算する。

```
SELECT SUN(price)
FROM shoppinglist;
```
<a href="https://gyazo.com/3c805784bac370b3b7708f21604a173c"><img src="https://i.gyazo.com/3c805784bac370b3b7708f21604a173c.png" alt="https://gyazo.com/3c805784bac370b3b7708f21604a173c" width="274"/></a>

##AVG関数
数値の平均を計算する。

```
SELECT AVG(price)
FROM shoppinglist;
```
<a href="https://gyazo.com/ac930d5afc6dc95a19592898ea3fd11b"><img src="https://i.gyazo.com/ac930d5afc6dc95a19592898ea3fd11b.png" alt="https://gyazo.com/ac930d5afc6dc95a19592898ea3fd11b" width="272"/></a>

##COUNT関数
指定したカラムのデータの合計数を計算する。

###1.カラム名を指定する

```
SELECT COUNT(name)
FROM shoppinglist;
```
カラム名を指定した場合、nullのデータは計算されないため4件となる。
<a href="https://gyazo.com/c8eceb0069716c1348729ec623f0442e"><img src="https://i.gyazo.com/c8eceb0069716c1348729ec623f0442e.png" alt="https://gyazo.com/c8eceb0069716c1348729ec623f0442e" width="242"/></a>


###2.全てのカラムを指定する

```
SELECT COUNT(*)
FROM shoppinglist;
```
「*」を使った場合、カラムのデータの数ではなく、レコードの数を計算する。結果、5件となる。
<a href="https://gyazo.com/a095e873d44bfbffe5f9e07c2d35afd9"><img src="https://i.gyazo.com/a095e873d44bfbffe5f9e07c2d35afd9.png" alt="https://gyazo.com/a095e873d44bfbffe5f9e07c2d35afd9" width="241"/></a>

##MAX・MIN関数
最大(MAX)と、最小(MIN)を求める。

```
SELECT　name,MAX(price)
FROM shoppinglist;
```
<a href="https://gyazo.com/fe15c00a13ea6a59d180cd2295ed8d4a"><img src="https://i.gyazo.com/fe15c00a13ea6a59d180cd2295ed8d4a.png" alt="https://gyazo.com/fe15c00a13ea6a59d180cd2295ed8d4a" width="467"/></a>

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

```
SELECT　SUM(price),date
FROM shoppinglist
GROUP BY date;
```
<a href="https://gyazo.com/68fc9e3157274667a962f7e16362c57e"><img src="https://i.gyazo.com/68fc9e3157274667a962f7e16362c57e.png" alt="https://gyazo.com/68fc9e3157274667a962f7e16362c57e" width="544"/></a>
※「WHERE文」を使う場合、「GROUP BY」は「WHERE文」のあとに書く。

##HAVING（グループ化したデータを絞り込む）
GROUP BYでグループ化したデータを絞り込みたいとき使う。「WHERE」はグループ化される前のテーブル全体を検索対象とするが「HAVING」はGROUP BYによってグループ化されたデータを検索対象とする。

```
SELECT　SUM(price),date
FROM shoppinglist
GROUP BY date
HAVING　SUN(price)>500;
```
<a href="https://gyazo.com/0f231181b86b7f9558475b4e30d5598f"><img src="https://i.gyazo.com/0f231181b86b7f9558475b4e30d5598f.png" alt="https://gyazo.com/0f231181b86b7f9558475b4e30d5598f" width="421"/></a>

※HAVINGはグループ化された後のテーブルから検索するため、条件文で使うカラムは必ずグループ化されたテーブルのカラムを使う。

以上。