学習備忘録〜O'Reilly「初めてのSQL」6章 集合〜
はじめに
この備忘録は、新卒1年目の初学者バックエンドエンジニアの学習記録のためにつけているものです。
解釈違いや、誤情報がある可能性があります。見つけた際にはご指摘をお願いします。
概要
データベースでは、データを1行ずつ処理できるが、RDBの特徴は集合である。
本章では、集合論を確認した後に、集合演算子を使って複数のデータ集合を組み合わせる方補を具体的に見ていく。
集合論
2つのデータ集合で集合演算を実行するときには、以下のガイドラインに従わなければならない。
- 取りらのデータ集合でも列の個数が同じでなければならない。
- 2つのデータ集合を組み合わせるときについとなる列のデータ方が同じでなければならない。(あるいは、データベースサーバが一方の型を、もう一方の方に変換できなければならない。)
集合演算子
SQL言語には、酒豪演算を実行できる3種類の集合演算子が含まれている。これらの集合演算子はそれぞれ、重複を含むものと取り除くものの2種類に分かれている(ただし、重複を全て取り除くとは限らない)。
union演算子
union演算子は組み合わせたデータ集合を並び替えて重複を取り除く。一方で、union all演算子はそのようなことはしない。union all演算子の場合、最終的なデータ集合の行の数は常に組み合わせの対象となるデータ集合の行の総数と等しくなる。
データベースサーバが重複データをチェックする必要がないため、データベースサーバの観点からすれば最も単純な集合演算である。
intersect演算子
MySQLでは実行できないため一旦省略
excepy演算子
本演算子もMySQLでは実行できないため省略
集合演算のルール
複合クエリを扱うときに従わなければならないルールをざっと紹介
複合クエリの結果を並び替える
複合クエリを並び替えたい場合は、最後のクエリの後ろにorder by句を追加できる。
order by句のに列の名前を指定する場合は、複合クエリの1つ目のクエリに含まれている列の名前から選択しなければならない。
集合演算の優先順位
複合クエリが3つ以上のクエリで構成されていて、それらのクエリが異なる集合演算子を使っている場合、正しい結果を得るには、それらんクエリを配置する順番について考える必要がある。
複合クエリに種類の異なる集合演算子をどのように配置するかによって違いが生じる。一般に、3つ以上のクエリからなる複合クエリは上から順に評価されるが、以下の2点の注意点がある。
- ANSI SQL仕様は、intersect演算子が他の集合演算子よりも優先されることを明記している
- 複数のクエリを丸括弧で囲むと、クエリを組み合わせる順序を指定できることがある
MySQLでは、複合クエリで丸括弧を使うことはできない。ただし、他のデータベースサーバでは、隣り合ったクエリを丸括弧で囲むことで、複合クエリの「上から順に処理する」というデフォルト設定を上書きできる。
Discussion