2月16日(木)1、2コマ目
今日、やったこと
SQLのおさらい
今日のホワイトボード
SELECT文の処理順序
この順にしたがって処理される。
![]() |
| 図 SELECT分の処理順序 |
例題1
下図の検索を行うSQLを考える。
![]() |
| 図 例題 |
テーブル間のリレーションシップ
参照整合性制約(外部キー制約)が指定されている列の値が等しい行が結びつくケースが多い。
![]() |
| 図 テーブル間のリレーションシップ |
〇結合条件を指定しない場合
もし、結合条件を指定しないと、各行が総あたりで結合する。
CS_グループマスタの1行目はCS_商品マスタの1行目、2行目、・・、16行目と結合する。
よって、結合後、CS_グループマスタの5行 × CS_商品マスタの16行の80行になる。
![]() |
| 図 結合条件を指定しない場合 |
〇結合条件を指定した場合
リレーションに従って結合条件を指定する。
![]() |
| 図 結合条件=>リレーションをたどる |
CS_グループマスタのID列の値とCS_商品マスタのグループID列の値が同じ行同士が結合すればいい。
![]() |
| 図 結合条件を指定した場合 |
検索条件(行に対する条件)
WHERE句で指定する条件は行に対する条件。
条件を満たす行だけ残る。
〇orに注意!!
今回はグループ名が「にぎり」または「まき」。
orを使って条件を結合する場合、()が必要になるケースが多い。
〇()なし
where句の条件は左から右に順に評価される。
![]() |
| 図 グループ名='にぎり' or グループ名='まき' |
このWHERE句では、
結合条件を満たし、かつグループ名が「にぎり」の商品 => 検索結果下部の5行
か
CS_グループマスタのグループ名が「まき」の行とCS_商品マスタの全行を結合 => 検索結果上部の16行
の合計21行が出力される。
〇()あり
()内は左から右の順より優先されるため、
①まず、グループマスタはグループ名が「にぎり」または「まき」だけに絞られる
②「にぎり」と「まき」のCS_グループマスタとCS_商品マスタが結合条件で結合
以下の出力結果になる。
![]() |
| 図 (グループ名='にぎり' or グループ名='まき') |
グループ化
”グループ毎”なので、グループ名やグループID、CS_グループマスタのID列でグループ化。
今回はグループ名を出力したいので、グループ名でグループ化。
![]() |
| 図 グループ名でグループ化 |
group byを使うと、select句には
- group by 指定列
- グループ関数
しか指定できない。
行数カウント
”グループ毎の商品数”を取得したい。商品数は各グループ内の行数なので、count()で行数をカウントする。
![]() |
| 図 グループ毎に行数を数える(count()関数) |
例題2
ポイントは出力列と並び替えの列が異なるところ。
以下のSQLではエラーになる。
![]() |
| 図 order byでエラー発生 |
並び替え(order by)はグループ化よりあとに処理される。
そのため、select句と同じように
- group by指定列
- グループ関数
しか指定できない。
以下のように、グループID列とグループ名列の組み合わせでグループ化する必要がある。
![]() |
| 図 グループID、グループ名でグループ化 |
なお、グループIDとグループ名は1対1の関係のため、グループ名だけでグループ化しても、グループIDとグループ名の組み合わせでグループ化しても、できるグループの数や各グループ内の行数は同じ。
グループIDとグループ名が1対1の関係にあることは、データの内容がわからないと判断できない。
そもそもSQLは、データ構造やデータの特徴がわからないと作ることができません。
グループに対する条件
グループに対する条件はhaving句で指定する。
よくあるケースはグループ関数の結果との比較。
例題1の条件のように行に対する条件、グループに対する条件のどちらでも指定可能な条件もある。その場合は、行に対する条件を使うこと。行数を減らすことでDBの負荷軽減につながる。
次回は
練習問題の解説とWeb+DBのテストをします。






%E8%BF%BD%E5%8A%A0_NG-min.jpg)
%E8%BF%BD%E5%8A%A0_OK-min.jpg)



