Progate RDBとSQL基礎　メモ

<h1>学習コースⅠ</h1> 
<h3>SELECT FROM, WHERE, LIKE, NULL, AND,OR, ORDER BY, LIMIT</h3>

データベースから、データを取得するためには「SELECT」を用います。このSELECTを用いて、「どのカラムのデータを取得するか」を選びます。
データベースには複数のテーブルが存在する場合があります。
そのため、「FROM」を用いて、SELECTで選んだカラムが「どのテーブルのカラムか」を指定する必要があります。
最後に「ここまでがクエリです」ということをデータベースに伝えるためのセミコロン（；）を加えて完成です。クエリは一行で書くこともできますが、今回は読みやすいように改行して書きましょう。また、SQLは大文字と小文字を区別しないため、小文字で記述しても問題ありません。

複数のカラムからデータを取得する場合は、図のようにカラム名をコンマ（ , ）で区切ります。
全カラムのデータを取得する場合は「＊」の記号を用います。

特定のデータを取得するためには、「どこの」という意味を持つ「WHERE」を用います。「SELECT」と「FROM」で「どのテーブルのどのカラムのデータを取得するか」までは決まっていますので、「WHERE」が意味するのは、「どこのレコード（横の行）を取得するか」になります。
今回は「WHERE category = "食費"」のような条件で、「category」が「食費」であるデータを取得してみましょう。データには「データ型」と呼ばれるルールにより、「食費」のようなテキストはクォーテーションで囲む必要があります。

データベースに保存されているデータには、「データ型」と呼ばれるルールがあります。「データ型」とは、テキストデータや数値データ、さらには日付データといったように「データの種類」を示すものです。

「数値データ」はクォーテーションで囲んではいけない

「日付データ」はダブルクォーテーションまたはシングルクォーテーションで囲む必要がある

比較演算子で1000以上とかこの日付以前などを指定できる

「ある文字を含むデータ」を取得したい場合は、「〜のような」という意味を持つ、「LIKE演算子」を用います。
「指定したカラムが〇〇を含む（〇〇のような）レコード」という条件となります。
LIKE演算子を用いる際に覚えておく必要があるのが「ワイルドカード」です。コンピュータの世界で「ワイルドカード」とは、どんな文字列にも一致することを指す記号です。LIKE演算子では「％」をワイルドカードとして扱います。これにより図では「プリン」を含むデータを全て取得しています。

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

「〇〇を含まないデータ」や「〇〇に一致しないデータ」のような条件でデータを取得したい場合は「否定」を意味する「NOT演算子」を用います。これまで学習した演算子の前に「NOT」を置くことで、その条件を満たさないデータを取得することが可能です。

NULLのデータを取得するためには「〜がNULLである」という意味になる、「IS NULL」を用います。図のように「カラム名 IS NULL」とすることで、「指定したカラムがNULLであるデータ」を取得することが可能です。
一方、「NULLではないデータ」を取得する場合は「〜がNULLでない」という意味になる「IS NOT NULL」を用います。「IS NOT NULL」も「IS NULL」と同様に、「カラム名 IS NOT NULL」のようにして使います。

※「NULLのデータ」や「NULLでないデータ」を取得したい場合、「=」は使うことができません。

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

データを並び替えるためには、「〜順に並べる」という意味の「ORDER BY」を用います。またデータを並び替えるためには、図のように「（基準となる）並べ替えたいカラム名」と「並べ方」を指定します。
ORDER BY」の並べ方は、「昇順」か「降順」を指定します。「昇順」は「小さい数から大きい数へ向かう順序」、「降順」は「大きい数から小さい数へ向かう順序」です。SQLでは「昇順」は「ASC」、「降順」は「DESC」と指定します。
<h5>「ORDER BY」はクエリの末尾に記述することで、取得結果を並び替えます。
「ORDER BY」は「WHERE」と併用することが可能です。</h5>

最大で何件取得するか」を指定するためには、「制限する」という意味の「LIMIT」を用います。「LIMIT」は「データの件数」を指定します。
<h5>LIMITはクエリの末尾に記述することで、取得するデータの数を制限します。</h5>

<h4>「ORDER BY」と「LIMIT」を併用することも可能です。その場合、「LIMIT」を末尾にする必要があります。このように２つを用いることで、priceが高いデータの上位５位を取得することができます。</h4>

<h1>学習コースⅡ</h1>
<h3>計算結果の加工　集計関数　データをグループ化</h3>

DISTINCT(カラム名)  　　　 #　()を忘れない！

DISTINCTと同様に、四則演算をSELECTで取得するカラムに使用することで、計算後のデータが取得できます。

「 SUM(カラム名) 」のようにすることで、指定したカラムに保存されたデータの合計を計算することが可能です。
SUM関数はSELECTで取得するカラムに用いることで、集計結果を取得することができます。

「AVG(カラム名)」のようにすることで、指定したカラムに保存されたデータの平均を計算することが可能です。
AVG関数はSELECTで取得するカラムに使用することで、計算結果を取得することができます。

COUNT関数は、指定したカラムのデータの合計数を計算してくれる関数です。図のように「COUNT( カラム名 )」とすることで、指定したカラムのデータの数を計算します。
<h6>COUNT関数でカラム名を指定した場合、nullになっているデータの数は計算されません。
nullの数も含めてデータの数を計算したい場合は、COUNT関数で * (全てのカラム)を指定します。
* を使った場合、特定のカラムのデータの数ではなく、レコードの数を計算します。この方法で、nullの数を含めてデータの数を数えられます。</h6>


MAX,MINも他の集計関数と同様にSELECTで取得したカラムに使用することができます。

GROUP BYを用いると、データをグループ化することができます。例えば図のように「GROUP BY カラム名」とすることで、指定したカラムで、完全に同一のデータを持つレコードどうしが同じグループとなります。
グループ化するには、今までの集計関数を取得するFROMの後ろに「GROUP BY カラム名」を追加します。集計関数により、各グループごとにデータが集計されます。
<h6>GROUP BYを用いる場合、SELECTで使えるのは、GROUP BYに指定しているカラム名と、集計関数のみ。</h6>

GROUP BYは複数のカラム名を適用させることができ、その場合は、カラム名同士をコンマ(,)で繋げます。

<h6>GROUP BYはWHEREとも併用することができ、その場合はWHEREの後に書きます。</h6>

今回のように日付とキャラクターごとの食費に使ったお金の合計を取得するときは、
①WHEREでカテゴリーが「食費」であるレコードを検索する
②日付とキャラクターでグループ化する
③集計関数で集計するという順番になります。

GROUP BYでグループ化したデータを更に絞り込みたい場合には、HAVINGを用います。図のように「GROUP BY カラム名 HAVING 条件」のようにすることで、条件を満たすグループを取得することができます。

<h4>グループ化した後のデータを絞り込む際、WHEREではなくHAVINGを使うのは、SQLの各コマンドが以下の順番で実行されていくためです。<br>
WHEREはまず最初に、そのあとにGROUP BYと関数が実行され、その後にHAVINGが実行されます。<br>
実行順序によって、WHEREとHAVINGは検索対象に違いがあります。WHEREはグループ化される前のテーブル全体を検索対象とするのに対し、HAVINGはGROUP BYによってグループ化されたデータを検索対象とします。<br>
HAVINGはグループ化された後のテーブルから検索するため、条件文で使うカラムは必ずグループ化されたテーブルのカラムを使います。</h4>

<h1>学習コースⅢ</h1>
<h3>サブクエリ   AS 複数テーブル JOIN 結合</h3>

SQLでは、クエリの中に他のクエリを入れることができます。この他のクエリをサブクエリと言います。2つ以上のクエリを1つにまとめることができるので、より複雑なデータを取得する際に使われます。
( )で囲むことで、サブクエリを使用できます。<h6>サブクエリの書き方は基本的に通常のクエリと同じですが、()内にセミコロン（;）は不要です。
セミコロン（;）はクエリの最後にだけ書くようにしましょう。</h6>
サブクエリを含むクエリの場合、サブクエリが実行された後、外側にあるクエリが実行されます。

ASを使うことでカラム名などに別名を定義することができます。
「カラム名 AS "名前"」で、カラム名に定義する名前を指定します。

テーブルを紐づけるために、外部キーと主キーを使います。外部キーで他のテーブルにある主キーを指定することで、テーブル同士を紐付けることができます。

JOINは複数のテーブルを1つに結合したいときに使います。ONで条件を指定して、テーブルAにテーブルBを結合します。結合したテーブルは1つのテーブルとしてデータを取得することができます。
<h6>結合条件は、「ON テーブル名.カラム名 = テーブル名.カラム名」で指定します。
JOINを含んだクエリでは、はじめにJOINが実行されます。その次に、結合されたテーブルに対してSELECTが実行されます。</h6>

複数のテーブルに同じカラム名が存在するときは、「テーブル名.カラム名」で指定しなければなりません。例えば、nameカラムが複数のテーブルにあるときは、「それぞれのテーブル名.name」で指定しましょう。
「テーブル名.カラム名」を用いたカラム指定は、WHERE内でも使えます。複数テーブルを扱うときは、異なるテーブルで同じカラム名が存在する場合があるので覚えておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942638/cbc1c8f1-bf47-c71e-b89f-fd39e657691a.png)


JOINを使った結合は、FROMで指定したテーブルを基準に実行されます。ただし、外部キーがNULLのレコードは、実行結果に表示されません。

<h6>LEFT JOINを使うことで、FROMで指定したテーブルのレコードを全て取得します。外部キーがNULLのレコードもNULLのまま実行結果に表示されます。</h6>

JOINは1つのクエリで、複数回使用できます。JOINを複数回使用しても、FROMは1度だけ書けば大丈夫なので注意しましょう。

<h6>JOINを使うときは、WHEREの条件文でも「テーブル名.カラム名」</h6>
<h1>道場コースⅠ</h1>

MAX, MIN, SUM, AVG などの集計関数は、四則演算と併用できます。
利益、利益率の計算と組み合わせることで、利益が最も大きい商品を求めたり、商品全体の利益平均を求めたりすることができます。
ORDER BYもまた、四則演算と併用することができます。
利益などと組み合わせることによって、利益の高い順にデータを並び替えることなどができるようになります。

<h1>学習コースⅣ</h1>

<h3>追加</h3>

テーブルにレコードを挿入したいときはINSERTを使います。
INSERTとは「挿入する」という意味です。
<h6>多くの場合、idカラムにはAUTO INCREMENTという機能が使われます。
AUTO INCREMENTとは「自動で増加する」といった意味で、データが作成されるときに自動で値が割り当てられます。
AUTO INCREMENT のカラムは省略できる</h6>

例: 
INSERT INTO students (name, course)
VALUES("Kate", "Java");  ←セミコロン忘れない！

<h3>更新</h3>

データを更新したいときにはUPDATEを使います。
複数変更したいカラムがある場合、コンマ(,)で区切ります。
<h6>WHEREで更新するレコードを指定しないとカラム内の全データが更新されてしまいます。
UPDATE実行後はデータを戻すことができません。実行前に一度SELECTを実行して、操作するデータを確認する習慣をつけましょう。</h6>

例:
UPDATE students
SET name = "Jordan", course = "HTML"
WHERE id = 6;

<h3>削除</h3>

レコードを削除するときはDELETEを使います。
<h6>UPDATEと同様にクエリ実行後はレコードを元に戻すことができないので、SELECTでレコードを確認してから削除を行いましょう。
WHEREで削除するレコードを指定しないとテーブル内の全レコードが削除されてしまいます。</h6>

例:
DELETE FROM students
WHERE id = 7;