1. playersテーブル
SELECT goals
FROM players
WHERE name = “ウィル”
;
SELECT *
FROM players
WHERE goals > 14
;
2. サブクエリ
SQLでは、クエリの中に他のクエリを入れることができます。この他のクエリをサブクエリと言います。2つ以上のクエリを1つにまとめることができるので、より複雑なデータを取得する際に使われます。下の図では「ウィルより得点数の多い選手名」を調べています。
サブクエリの書き方
( )で囲むことで、サブクエリを使用できます。サブクエリの書き方は基本的に通常のクエリと同じですが、()内にセミコロン(;)は不要です。
セミコロン(;)はクエリの最後にだけ書くようにしましょう。
サブクエリの実行順番
サブクエリを含むクエリの場合、サブクエリが実行された後、外側にあるクエリが実行されます。
SELECT name
FROM players
WHERE goals > (
— この下にウィルの得点数を取得するクエリを書いてください
SELECT goals
FROM players
WHERE name = “ウィル”
)
;
SELECT name,goals
FROM players
WHERE goals > (
SELECT AVG(goals)
FROM players
)
;
3. AS
ASを使うことでカラム名などに別名を定義することができます。
「カラム名 AS “名前”」で、カラム名に定義する名前を指定します。
–ASを使って、取得したカラム名を”身長180cm以上の選手”としてください
SELECT name AS “身長180cm以上の選手”
FROM players
WHERE height >= 180
;
–ASを使って、取得したカラム名を”チームの合計得点”としてください
SELECT SUM(goals) AS “チームの合計得点”
FROM players
;
4. countriesテーブル
SELECT *
FROM countries
WHERE rank < (
SELECT rank
FROM countries
WHERE name = “日本”
)
;
5. テーブルを紐づける
テーブルが紐づく仕組み
テーブルを紐づけるために、外部キーと主キーを使います。外部キーで他のテーブルにある主キーを指定することで、テーブル同士を紐付けることができます。
SELECT SUM(goals), country_id
FROM players
GROUP BY country_id
;
6. JOIN(1)
JOINは複数のテーブルを1つに結合したいときに使います。ONで条件を指定して、テーブルAにテーブルBを結合します。結合したテーブルは1つのテーブルとしてデータを取得することができます。
結合条件
結合条件は、「ON テーブル名.カラム名 = テーブル名.カラム名」で指定します。右の図では、playersテーブルのcountry_idとcountriesテーブルのidを紐づけて結合しています。
JOINの実行順序
図のようなJOINを含んだクエリでは、はじめにJOINが実行されます。その次に、結合されたテーブルに対してSELECTが実行されます。
SELECT *
FROM players
–結合するテーブル名をJOINの後に追加して下さい
JOIN countries
–ONの後に結合条件を追加して下さい
ON players.country_id = countries.id
;
JOIN(2)
複数テーブルでのカラムの指定(1)
複数のテーブルに同じカラム名が存在するときは、「テーブル名.カラム名」で指定しなければなりません。例えば、図のようにnameカラムが複数のテーブルにあるときは、「それぞれのテーブル名.name」で指定しましょう。
複数テーブルでのカラムの指定(2)
「テーブル名.カラム名」を用いたカラム指定は、WHERE内でも使えます。複数テーブルを扱うときは、異なるテーブルで同じカラム名が存在する場合があるので覚えておきましょう。
全体実行順序の確認
GROUP BYなどを含んだ実行順序を確認しましょう。SQLは、取得するテーブルを形成してから検索を行うので、FROM・JOINが先に行われることを覚えておきましょう。
SELECT countries.name,SUM(goals)
FROM players
JOIN countries
ON players.country_id = countries.id
GROUP BY countries.name
;
8. teamsテーブル
NULLを含んだ場合の実行結果
JOINを使った結合は、FROMで指定したテーブルを基準に実行されます。ただし、下の図のように外部キーがNULLのレコードは、実行結果に表示されません。
SELECT *
FROM players
JOIN teams
ON players.previous_team_id = teams.id
;
SELECT players.name AS “選手名”, teams.name AS “前年所属していたチーム”
FROM players
JOIN teams
ON players.previous_team_id = teams.id
;
9. LEFT JOIN
LEFT JOINとは
LEFT JOINを使うことで、FROMで指定したテーブルのレコードを全て取得します。外部キーがNULLのレコードもNULLのまま実行結果に表示されます。
SELECT players.name AS “選手名”, teams.name AS “前年所属していたチーム”
FROM players
LEFT JOIN teams
ON players.previous_team_id = teams.id
;
10. 3つのテーブル結合
複数テーブルのJOIN
JOINは1つのクエリで、複数回使用できます。JOINを複数回使用しても、FROMは1度だけ書けば大丈夫なので注意しましょう。
SELECT *
FROM players
JOIN countries
ON players.country_id = countries.id
LEFT JOIN teams
ON players.previous_team_id = teams.id
;
11. 総合演習
SELECT countries.name AS “国名”, AVG(goals) AS “平均得点”
FROM players
JOIN countries
ON players.country_id = countries.id
GROUP BY countries.name
;
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
;