ProgateでSQLを学ぶ【コース3はテーブルの結合】

ProgateでSQLを学ぶコース3


この記事ではProgateのSQLコース3の内容をまとめています前回学んだ内容は以下の記事にまとめています。

前回のコースの内容はSQLの関数やグループ化を学びました。それでは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つになって結合されます。
SQL テーブルの紐づけ

具体的な書き方は以下のようにするようです。テーブルAの外部キーとテーブルBの主キーを紐づけます。
SQL 外部キーと主キー

以下の例ではサッカー選手のデータが記述されたテーブルと国のデータが記述されたデータを結合しています。

SELECT *
FROM players
--結合するテーブル名を追加してください
JOIN countries
--結合条件を追加してください
ON players.country_id = countries.id;

実際の出力結果がないのでわかりにくいですが、2つのテーブルはひとつになった状態で出力されます。

ここで一旦SQL文の実行順序をおさらいしますが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は命令の実行順序と構文を書く順番がちぐはぐなので結構わかりづらいですね。ポイントというと、別にないのでやはり慣れの問題でしょうか。命令の実行順序よりも構文の書き順を覚えたほうがいいかもしれないですね

  1. 〇〇を取得する → SELECT
  2. 〇〇テーブルの → FROM
  3. 〇〇という条件で → WHERE
  4. 〇〇をグループ化した状態で → GROUP_BY

なんだか余計わかりにくくなったような気もしますが、とりあえず慣れですかね。以上です。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78