SQLの条件検索メモ
※今回もメモ用
※修正あれば都度UPD
さて、今回は前回の記事:SQL SELECT分あれこれで書いた 別Verをメモとして記載。
テーブルは以下2つ存在している中で、どんな風にデータ抽出できるかを記述してきます。
部活テーブル
| id | 部活名 | 部費 |
|---|---|---|
| 1 | 茶道部 | 100 |
| 2 | 剣道部 | 200 |
| 3 | 柔道部 | 300 |
部員テーブル
| id | 部員名 | 部活id |
|---|---|---|
| 1 | あいうえお | 1 |
| 2 | かきくけこ | 2 |
| 3 | さしすせそ | 3 |
| 4 | たちつてと | 1 |
| 5 | なにぬねの | NULL |
①部費(feeカラム)が高い順に部活テーブルを並べ替え、上位3位までのレコードを取得する(取得カラム:全て)
SELECT * FROM `部活テーブル` ORDER BY fee DESC LIMIT 3
表示はこの通り
| id | 部活名 | 部費 |
|---|---|---|
| 3 | 柔道部 | 300 |
| 2 | 剣道部 | 200 |
| 1 | 茶道部 | 100 |
②部員テーブルの「部活id」カラムは、所属している部活のid(部活テーブルのid)を表しています。
このカラムをキーにして部員テーブルと部活テーブルを「内部結合」し、誰がどの部活に入っているかを取得する(取得カラム:部員テーブルのname、部活テーブルのname)
SELECT 部員テーブル.部員名, 部活テーブル.部活名 FROM `部員テーブル` INNER JOIN 部活テーブル ON 部員テーブル.部活id = 部活テーブル.id
表示はこの通り
| 部員名 | 部活名 |
|---|---|
| あいうえお | 茶道部 |
| かきくけこ | 剣道部 |
| さしすせそ | 柔道部 |
| たちつてと | 茶道部 |
③②のSQLを結合方法を変えて、部員テーブルの「部活テーブルid」カラムが「NULL」の人も含めて取得する(取得カラム:部員テーブルの名前、部活テーブルの名前)
SELECT 部員テーブル.部員名, 部活テーブル.部活名 FROM `部員テーブル` LEFT OUTER JOIN 部活テーブル ON 部員テーブル.部活id = 部活テーブル.id
表示はこの通り
| 部員名 | 部活名 |
|---|---|
| あいうえお | 茶道部 |
| かきくけこ | 剣道部 |
| さしすせそ | 柔道部 |
| たちつてと | 茶道部 |
| なにぬねの | NULL |
④部員テーブルの部活idを重複なく取得する。※NULLは除いてください(取得カラム:部員テーブルの部活id)
SELECT DISTINCT 部員テーブルの部活id FROM `部員テーブル` WHERE 部員テーブルの部活id is not null
| id |
|---|
| 3 |
| 2 |
| 1 |
| ※例が少ないからわかりにくいか。 |
⑤④の派生。「not in」を使って、誰も所属していない部活の部活名を取得する(取得カラム:部活テーブルのname)
SELECT DISTINCT 部活テーブル.部活名 FROM 部活テーブル WHERE 部活テーブル.id not in (SELECT DISTINCT 部員テーブル.部活id FROM 部員テーブル WHERE 部員テーブル.部活id IS NOT NULL)
| 部活名 |
|---|
※今回は該当するものがなかったため、表示はされない。