ProgateでSQLを学ぶコース3
この記事ではProgateのSQLコース3の内容をまとめています前回学んだ内容は以下の記事にまとめています。
前回のコースの内容はSQLの関数やグループ化を学びました。それではSQLコースの内容をかいていきたいと思います。
サブクエリ
SQLのサブクエリは2つのSQL文を()かっことでとじることで1つのSQL文にできるものです。実行順序はサブクエリ→クエリとなっているようです。以下の例は得点が平均値より高いものを取得しています。
SELECT name,goals FROM players WHERE goals > ( SELECT AVG(goals) FROM players );
ASを使ってカラム名を変更する
SQL文のAS文はカラム名を変更して出力することができます。具体的にはSELECT文と併用して使用します。
【 SELECT カラム名 AS “カラムの別名” 】カラム名の別名のところはダブルクォーテーションを使う点に注意が必要です。
SELECT name AS "身長180cm以上の選手" FROM players WHERE height >= 180;
複数のテーブルを結合する
複数テーブルの結合はややこしいですが、複数テーブルのIDをひもづけることによってデータを管理しやすくしももののようです。複数テーブルを紐づけるにはid以外に外部キーを使用して紐づけを行います。紐づけを行うと2つのテーブルが1つになって結合されます。
具体的な書き方は以下のようにするようです。テーブルAの外部キーとテーブルBの主キーを紐づけます。
以下の例ではサッカー選手のデータが記述されたテーブルと国のデータが記述されたデータを結合しています。
SELECT * FROM players --結合するテーブル名を追加してください JOIN countries --結合条件を追加してください ON players.country_id = countries.id;
実際の出力結果がないのでわかりにくいですが、2つのテーブルはひとつになった状態で出力されます。
ここで一旦SQL文の実行順序をおさらいしますがSQL文全体としての流れは下記のようになっているようです。↓結合をしてから検索されている点に注目です。
結合されたテーブルのカラム名を指定
2つのテーブルの結合はJOINで結合するテーブルを指定してONでテーブルAの外部キーとテーブルBの主キーを指定するのでした。これで結合されたひとつのテーブルになるわけですが、2つのテーブルでカラム名がかぶることがあります。その場合はテーブル名.カラム名のように指定します。
ひとつのテーブルにはなったけども指定は別々に行う必要があるようです。以下はplyaersテーブルとcountriesテーブルを使用した例です。
SELECT players.name, countries.name FROM players JOIN countries ON players.country_id = countries.id;
JOINとNULL
NULLはレコードになにもないことをあらわす文です。外部キーがNULLの場合はJOINで結合しても何も取得されません。
NULLをも取得したい場合は【 LEFT JOIN 】を使います。
SELECT players.name AS "選手名", teams.name AS "前年所属していたチーム" FROM players LEFT JOIN teams ON players.previous_team_id = teams.id;
3つ以上のテーブルを結合
テーブルは2つだけじゃなくて何個も結合できるようです。
テーブルの絵がないのでわかりにくいですが、国データをもつテーブル、チームデータをもつテーブルをプレイヤーデータをもつテーブルに結合させています。
SELECT * FROM players JOIN countries ON players.country_id = countries.id LEFT JOIN teams ON players.previous_team_id = teams.id;
サンプルコード
SELECT name AS "選手名", height AS "身長" FROM players WHERE height > ( SELECT AVG(height) FROM players );
SELECT * FROM players JOIN countries ON players.country_id = countries.id WHERE countries.name = "日本" AND height >= 180;
SELECT countries.name AS "国名", AVG(goals) AS "平均得点" FROM players JOIN countries ON players.country_id = countries.id GROUP BY countries.name;
ProgateSQLコース3まとめ
SQLは命令の実行順序と構文を書く順番がちぐはぐなので結構わかりづらいですね。ポイントというと、別にないのでやはり慣れの問題でしょうか。命令の実行順序よりも構文の書き順を覚えたほうがいいかもしれないですね
- 〇〇を取得する → SELECT
- 〇〇テーブルの → FROM
- 〇〇という条件で → WHERE
- 〇〇をグループ化した状態で → GROUP_BY
なんだか余計わかりにくくなったような気もしますが、とりあえず慣れですかね。以上です。
コメント