4月28日(火)3コマ目
今日、やったこと
- [練習問題]いろいろな結合
- [練習問題 解説]いろいろな結合
今日のホワイトボード
[練習問題 解説]いろいろな結合
正解例をあげておきます。
問1
![]() |
| 図 問1 正解例 |
xx月中の条件は下図のように何種類か書き方があるが、月末が年、月で変わるため、翌月1日未満が便利(だと思う)。
![]() |
| 図 条件「xx月中」 |
問2
問1からテーブル数が増えた。
![]() |
| 図 問2 正解例 |
問3
1件の売上に対して、
- 伝票番号
- 処理日
- 顧客
- 担当者
は1対1の関係になる。
よって、伝票番号列だけでグループ化しても、伝票番号列、処理日列、顧客名列、担当者名列の組み合わせでグループ化しても、できるグループは同じ。
![]() |
| 図 問3 正解例 |
問4
売上利益はグループ毎の値。よって、「売上利益が50000以上」はグループに対する条件。
select句でsum(数量*(卸単価 - 仕入単価))に別名”売上利益”を設定している。
売上利益は
- グループに対する条件(having句)
- 並び替え(order by句)
で使われている。
select句で指定した別名はorder by句では利用可だが、having句では利用できない。
order by句で別名”売上利益”を使うと
![]() |
| 図 問4 正解例(select句の別名はorder by句でも使える) |
having句で別名”売上利益”を使うと
問5
自己結合。
![]() |
| 図 問6 正解例 |
以下はテーブルの別名に対して、テーブルの使われ方が一致しない。
テストでは×にします。
![]() |
| 図 問6 テーブルの別名と使われ方が一致しない => ダメ |
上司がいない人(MGR_ID列がnull => 上司テーブルに結合できる行がない)も出力するなら、外部結合。
部下テーブルを全行出力させる。
![]() |
| 図 問5 上司がいない人も出力したい => 外部結合 |
問6
売上のない商品 = 売上データテーブルに登場しない。
結合相手がないデータも出力するには、外部結合。
〇left join
![]() |
| 図 問6 正解例 left join版 |
〇right join
![]() |
| 図 問6 正解例 rightjoin版 |
問7
あまり何も考えずにやってみると以下のようなかんじ。
![]() |
| 図 なにも考えずにやってみると |
商品数は10だが、検索結果は10行ではない。
ダメな理由をSQLの処理順に従って考える。
①結合
外部結合で商品マスタを全行出力する。
![]() |
| 図 ①結合 |
これは問題ない。
ちなみに、”4月中に売り上げがあった”を無視して、商品別売上数量を取得すると以下のとおり。
![]() |
| 図 結合後、商品でグループ化して売上数量を集計 |
②4月中に絞り込み
![]() |
| 図 where句で処理日が4月中を追加すると |
ここで4月に売り上げのなかった商品は出力されなくなる。
![]() |
| 図 ダメな理由 |
解決策
下図のように 商品マスタテーブル と 売上データテーブルの4月中の行 を結合すればいい。
![]() |
| 図 解決策 |
![]() |
| 図 商品マスタテーブルの全行と売上データテーブルの4月中の行を結合 |
これを商品でグループ化して、数量を集計すればいい。
![]() |
| 図 問7 正解例 |
次回は
テストをします。
テストのあとはCASE。


















