RDB/SQL復習①

ポートフォリオ作成に向けて、1月中に基礎学習を終わらせます。
HTML/CSS、JavaScript、Rubyの復習を終わらせたので、
次にRDB/SQLの復習をProgate、ドットインストールを用いて行っていきます。
なお、記述する内容は自分が忘れがちな所、苦手な所です。
HTML/CSS編、JavaScript編、Ruby編同様、自分用の備忘録的に投稿していくので(箇条書きで)、
読みづらいor間違えていることを書いている可能性もあるので、悪しからず。
(できるだけ他の方が見てもためになれば良いなとは思って投稿しますが・・・)
箇条書きで書いたことに関して、新たな発見、学び、気づき等あれば、
それぞれ個々に詳細を記述していこうと思います。

<h1>データベース</h1>

テーブル・・・ 表
カラム・・・ 縦の列
レコード・・・ 横の行

<h1>SELECT</h1>

SELECTでデータを取得できる


```SQL:SQL
SELECT name, price #複数のカラムからデータを取得する際には、コンマで区切る
SELECT * #全てのデータからデータを取得する際には、*を用いる
```

<h1>FROM</h1>
FROMでどのテーブルのカラムかを指定できる

<h1>WHERE</h1>
どこのレコード(横の行)を取得するかをWHEREで指定する

```SQL:SQL
SELECT * #テーブル内の全てのデータから取得
FROM purchases #テーブルを指定
WHERE category = "食費"; #文字列の値はクォーテーションで囲む
```

<h1>データ型</h1>

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954989/d1744096-6393-0330-429f-7b7724866fc6.png)

<h1>LIKE演算子</h1>

ある文字を含むデータを取得する

```SQL:SQL
SELECT *
FROM purchases
WHERE name LIKE データ;
```

<h1>ワイルドカード</h1>

%を用いる

(例)
%たこやき%・・・ 「たこやき」の前後のワイルドカード(%)により、
「たこやき」という文字を含むデータを取得できる (例)おいしいたこやき屋さん、大阪たこやき本店

たこやき%・・・ 前方一致
(例) たこやき屋さん、たこやき焼き器

%たこやき・・・ 後方一致
(例) チーズたこやき、美味しいたこやき

<h1>NOT演算子</h1>

```SQL:SQL
SELECT *
FROM purchases
WHERE NOT price > 1000;
```

```SQL:SQL
SELECT *
FROM purchases
WHERE NOT name LIKE "%たこやき%";
```

<h1>NULL</h1>

何のデータも保存されていない場合、NULLとなる

<h4>NULLのデータを取得する</h4>

```SQL:SQL
SELECT *
FROM purchases
WHERE price IS NULL; #「~がNULLである」という意味になる
```

<h4>NULLではないデータを取得する</h4>

```SQL:SQL
SELECT *
FROM purchases
WHERE price IS NOT NULL; #「~がNULLでない」という意味になる
```

<h1>AND演算子</h1>

WHEREに複数の条件を指定する際にはANDを用いる

```SQL:SQL
WHERE 条件1 AND 条件2
```
```SQL:SQL
SELECT *
FROM purchases
WHERE character_name = "たろう"
AND category = "食費";
```

<h1>OR演算子</h1>

```SQL:SQL
WHERE 条件1 OR 条件2
# 条件１または条件２のどちらかを満たすデータを検索できる
```

```SQL:SQL
SELECT *
FROM purchases
WHERE character_name = "たろう"
OR character_name = "はなこ";
```

<h1>ORDER BY</h1>
データを並び替えることができる

```SQL:SQL
ORDER BY 並べ替えたいカラム名 並べ方
```
<h1>ASC・DESC</h1>

ASC・・・ 昇順
DESC・・・　降順

```SQL:SQL
SELECT *
FROM purchases
ORDER BY price DESC; #値段が大きい順に並べ替える
``` 

ORDER BYはWHEREと併用可能

```SQL:SQL
SELECT *
FROM purchases
WHERE 条件
ORDER BY price DESC; 
``` 

<h1>LIMIT</h1>

最大で何件のデータを取得するかを指定する

```SQL:SQL
LIMIT データの件数
```
LIMITはWHEREと併用可能

```SQL:SQL
SELECT *
FROM purchases
WHERE 条件
LIMIT 5; #条件に当てはまる上から5件を表示する
``` 

<h1>ORDER BYとLIMITの組み合わせ</h1>

```SQL:SQL
SELECT *
FROM purchases
ORDER BY price DESC
LIMIT 5; #LIMITは末尾に記述する
``` 

<h1>DISTINCT</h1>

検索結果から重複するデータを除くことができる

```SQL:SQL
DISTINCT(カラム名)
```

```SQL:SQL
SELECT DISTINCT(name)
FROM purchases;
``` 

<h1>SUM関数</h1>

数値の合計を計算する

```SQL:SQL
SUM(カラム名) #指定したカラムのデータの合計を取得する
```

```SQL:SQL
SELECT SUM(price)
FROM purchases;
``` 

SUM関数とWHEREは併用可能

```SQL:SQL
SELECT SUM(price)
FROM purchases
WHERE character_name = "たろう";
``` 

<h1>AVG関数</h1>

数値の平均を計算する

```SQL:SQL
AVG(カラム名) 
```

```SQL:SQL
SELECT AVG(price)
FROM purchases;
``` 

AVG関数とWHEREは併用可能

```SQL:SQL
SELECT AVG(price)
FROM purchases
WHERE character_name = "たろう";
``` 

<h1>COUNT関数</h1>

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


```SQL:SQL
# NULLの数を含めてデータの数を数える
COUNT(カラム名) 
SELECT COUNT(*)
FROM purchases;
```

COUNT関数とWHEREは併用可能

```SQL:SQL
SELECT COUNT(*)
FROM purchases
WHERE character_name = "たろう";
``` 

<h1>MAX関数・MIN関数</h1>

```SQL:SQL
MAX(カラム名) #指定したカラムのデータの中から最大のデータを取得
MIN(カラム名) #指定したカラムのデータの中から最小のデータを取得
``` 

```SQL:SQL
SELECT MAX(price)
FROM purchases;
``` 
MAX関数・MIN関数とWHEREは併用可能

```SQL:SQL
SELECT MAX(price)
FROM purchases
WHERE character_name = "たろう";
``` 

<h1>GROUP BY</h1>
データをグループ化できる

```SQL:SQL
GROUP BY カラム名
``` 

GROUP BYを用いる場合、SELECTで使えるのは、GROUP BYに指定しているカラム名と集計関数のみ

<h4>グループ化と集計</h4>

グループ化するには、今までの集計関数を取得するFROMの後ろに、
「GROUP BY カラム名」を追加する。

GROUP BYを用いる場合、SELECTで使えるのは、GROUP BYに指定しているカラム名と集計関数のみ

```SQL:SQL
SELECT SUM(price), purchased_at ②集計する
FROM purchases
GROUP BY purchased_at; ①グループ化する
``` 

<h4>複数カラムのGROUP BYの書き方</h4>

```SQL:SQL
GROUP BY カラム名1,カラム名2,... #コンマでつなげる
``` 
```SQL:SQL
SELECT SUM(price), purchased_at, character_name
FROM purchases
GROUP BY purchased_at, character_name;
``` 

WHEREとGROUP BYは併用可能

```SQL:SQL
SELECT 集計関数
FROM テーブル名
WHERE 条件
GROUP BY カラム名1, カラム名2; #WHERE文の後に書く
``` 

<h4>実行される順番</h4>

①レコードの検索 WHERE
②グループ化 GROUP BY
③集計関数で集計される 関数(COUNT,SUM,AVG,MAX,MIN)

```SQL:SQL
SELECT SUM(price), purchased_at, character_name
FROM purchases
WHERE category = "食費" #レコードの検索
GROUP BY purchased_at, character_name; #日付とキャラクターでグループ化される
``` 

<h1>HAVING</h1>

GROUP BYでグループ化したデータをさらに絞り込む

```SQL:SQL
GROUP BY カラム名
HAVING 条件;
``` 

HANINGとWHEREは併用可能

<h4>実行される順番</h4>

①レコードの検索 WHERE
②グループ化 GROUP BY
③集計関数で集計される 関数(COUNT,SUM,AVG,MAX,MIN)
④HAVING

<h4>WHEREとHAVINGの違い</h4>

WHERE・・・ グループ化される前のテーブル全体を検索対象とする
HAVING・・・ GROUP BYによってグループ化されたデータを検索対象とする

```SQL:SQL
SELECT SUM(price), purchased_at
FROM purchases
GROUP BY purchased_at
HAVING SUM(price) > 1000; #グループ化された後のデータのカラムを使う
``` 

<h5>続きは<a href="https://qiita.com/SOH_engineer/items/0ae02ac583cba34044e7">RDB/SQL復習②</a>へ</h5>