SQLの応用として、比較演算子以外のin,between,like等の説明、 集約関数、副問合せ、ソートとグループ化について説明する。
比較と集約関数
where句に指定できる、2項演算子でない比較演算子
- A in ( a,b,c… )
メンバー比較()の中に A が含まれているか? - A between B and C
値Aが、B~Cの間の値か判定 - A like B
正規表現っぽい"_"⇒任意の1文字、"%"⇒任意の0文字以上で、 文字列マッチング - A is null
NULLかどうかをチェックする。
雑談: in,between,like といった演算子は、英語処理記述でCOBOLっぽさが全開。 ということで、COBOL等は、埋め込み型SQLによって通常のCOBOL処理の中で、SQLがそのまま使えたりすることを紹介。 教科書では、埋め込み型SQLインタフェースを持つ言語の中に、PL/I が紹介されている。 個人的に最初のプログラム言語が PL/I であっただけに、久々にみた言語名で懐かしさ全開。
select句に記載できる、集約関数
- COUNT(),SUM(),AVG(),MAX(),MIN()
関数の処理は名前どおりだし、特に説明はいらんだろう。
副問合せとソートとグループ化
where句の()の中に、別途SQLを実行するように、SQL命令を書くことができる。 副問合せを先に実行してから主問合せをするもの、
select S.業者名, S.所在 from S where S.業者名 in ( select SG.業者番号 from SG where SG.商品番号 = 'G2' and SG.在庫量 >= 200 ) ;
()の中の副問合せは、from句の S と無関係なので 先に副問合せを実行し、その結果の中に S.業者名 が 含まれるのかを判定される。
主問合せの中から何度も副問合せを実行する2つの方法がある。
select G.商品名, G.色, G.価格 from G where 'S4' in ( select SG.業者番号 from SG where SG.商品番号 = G.商品番号 ) ;
G.商品番号は、主問合せの中の from 句の G でレコードを変化させながら、副問合せを呼び出す。
並び替え:データベースのデータは、2分探索木やらハッシュやらの手法で保存されており、 検索結果は、登録順序毎に出力される訳ではない。だからこそ、表示順序などが 問題になるのであれば、"order by カラム {ASC|DESC}"で、ソートができる。
グループ化:指定されたカラムについて、同じ値を持つレコードをグループ化することができる。 having 句は、特定のグループを選択するための条件。 指定されたカラム別に、テーブルを一旦作ってから、having句内部の評価を行う。 この中に集約関数を使えるところがキモ。
集合計算:2つのSQL問合せ結果を集合とみなして、集合和(union)/集合差(except)/集合積(intersection)をとることができる。SQL_A union SQL_B みたいな使い方。
昨年度の非常勤講師の方の進行とずれが出てきたため、シラバスを書き換える。 JABEE的にも次回講義の時に説明が必要。