ProgateでSQLを学習してみた(3)
SQL学習の続き
・WHEREで条件設定する(レッスン1)
・比較演算子、LIKE、NOT、NULL・IS NOT NULL,AND・OR(レッスン1)
・ORDER BY、LIMITで加工(レッスン1)
・DISTINCT、四則演算(レッスン2)
・集計関数(SUM、AVG、COUNT,MAX・MIN)(レッスン2)
・グループ化(GROUP BY、HAVING) (レッスン2)
今回はここから↓
・サブクエリ(レッスン3)
・複数テーブルの使用(JOIN、LEFT JOIN)(レッスン3)
サブクエリ
いよいよ実務でよく使う部分に近づいてきました!
販売管理システムだと
・受注ヘッダー
・受注明細
・商品マスタ
さらには
・顧客マスタ etc...
テーブルだらけですよね~( ;∀;)
「サブクエリ」と「JOIN(結合)」は重要!と気を引き締めます('Д')
サブクエリで動的な「WHERE」条件を設定
SELECT 名前,得点
FROM 選手
WHERE 得点 > ←平均点よりも点数が高い選手を表示する
(SELECT AVG(得点) ←平均点を求める
FROM 選手);
WHERE条件に指定するSELECT文は「()」で囲みます
実務では「固定の条件」を使うことはほぼ無いかな…
この条件文を書くことが出来れば、メンテナンスも少なくてすみます
複数テーブルの使用(JOIN、LEFT JOIN)
いよいよ複数テーブルの結合!
実務を意識すると、ここは確実に外せない!!
実際のデータベースでは「商品マスタ」や「顧客マスタ」が
必ず存在します
むしろ、この「マスタ」が無いとデータベースのメリットが半減します
テーブルを紐づけるために、外部キーと主キーを使います。
外部キーで他のテーブルにある主キーを指定することで、
テーブル同士を紐付けることができます。
「主キー」がマスタのID、「外部キー」が受注データなどの主でないカラム
こんな覚え方を私はしています('Д')
JOINで結合すると外部キーがNULLのデータは表示されない!
SELECT players.name AS "選手名",teams.name AS "前年所属していたチーム"
FROM players
JOIN teams
ON players.previous_team_id=teams.id;
上記SQLの結果だと「previous_team_id」の値がNULLの場合
結果に表示されなくなります
これは理解できてなかった!(;O;)
今まで「ダメダメなSQL文」を作成していた自分を呪います!
大丈夫だったのだろうか…?
LEFT JOINを使って外部キーがNULLの値も表示する
「外部キーがNULLだったって表示してほしい!」
もちろんです!あるあるです!
SELECT players.name AS "選手名", teams.name AS "前年所属していたチーム"
FROM players
LEFT JOIN teams ←移籍経験が無い選手はNULLが前のチーム_idに入っている
ON players.前のチーム_id=teams.id;
3つ以上のテーブルを結合させる
これも実務では多いと思います
ACCESSでクエリを作成する時はSQL文を意識しないでも処理できるけど
Webプログラミングをマスターしたい人はそうもいかないですね
SELECT *
FROM players
JOIN countries ←「JOIN」は複数回使用できる(1)
ON players.country_id=countries.id
LEFT JOIN teams ←「JOIN」は複数回使用できる(2)
ON players.previous_team_id=teams.id;