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()関数)
単純に行数を数えるだけなら、count()関数の引数は*。
特定の列でデータがない(null)行数を数えたいときだけ、列名を指定する。

例題2

「グループ名が’にぎり’、’軍艦’、’まき’の商品のグループ毎の最安値、最高値、平均価格を出力。ただし、グループIDの昇順で表示」

ポイントは出力列と並び替えの列が異なるところ。

以下のSQLではエラーになる。

図 order byでエラー発生

並び替え(order by)はグループ化よりあとに処理される。

そのため、select句と同じように

  • group by指定列
  • グループ関数

しか指定できない。

以下のように、グループID列とグループ名列の組み合わせでグループ化する必要がある。

図 グループID、グループ名でグループ化

なお、グループIDとグループ名は1対1の関係のため、グループ名だけでグループ化しても、グループIDとグループ名の組み合わせでグループ化しても、できるグループの数や各グループ内の行数は同じ。

グループIDとグループ名が1対1の関係にあることは、データの内容がわからないと判断できない。

そもそもSQLは、データ構造やデータの特徴がわからないと作ることができません


グループに対する条件

グループに対する条件はhaving句で指定する。

よくあるケースはグループ関数の結果との比較。

例題1の条件のように行に対する条件、グループに対する条件のどちらでも指定可能な条件もある。その場合は、行に対する条件を使うこと。行数を減らすことでDBの負荷軽減につながる。


次回は

練習問題の解説とWeb+DBのテストをします。

このブログの人気の投稿

10月3日(木)1コマ目

10月27日(木)1コマ目

10月14日(金)1、2コマ目