SQL
関係代数

SQLのSELECT文と関係代数の関係について整理する

 関係データベース(Relational DataBase)における関係モデルの代数的演算が関係代数です.
 SQL の SELECT文も,この関係モデルにより記述されるものであり,関係代数がその要素として含まれています.
 そこで,関係代数と SELECT 文の関係について整理してみます.

SELECT 文における関係代数

SELECT の構成要素

 SELECT 文と関係代数の関係は,およそ,以下のようになります.

SELECT 射影 FROM 結合 WHERE 制限 ;

 それぞれについて,見ていきましょう,

結合

結合は,2つのテーブルを 1つのテーブルに合成する演算です.
  結合には
 - クロス結合(直積)
 - 内部結合
 - 外部結合
などがあります.

 直積の場合には, t1, t2 のようにカンマで接続し,
 内部結合の場合には, t1 INNER JOIN t2 ON t1.c1 = t2.c2 のように記述します.

射影

 射影は,あるテーブルから指定された列だけを抜き出したテーブルを生成します.
 たとえば,テーブル t1 が以下のようなものであった場合,

c1 c2 c3
1 2 3
4 5 6

以下のような,c2 と c3 を抜き出したテーブルを取得する演算が 射影 です.

c2 c3
2 3
5 6

 これを取得するには,SELECT c2,c3 FROM t1 のように射影の部分に c2,c3 の指定をします.

制限

 制限は,テーブルに含まれる行から,指定された条件の行だけを含むテーブルを生成する演算です.
 たとえば,先の t1 から c1 に 4 が含まれる行だけをもつテーブル

c1 c2 c3
4 5 6

を生成するには,SELECT * FROM t1 WHERE c1=4 のように,制限の部分に c1=4 を指定します.

関係代数の演算の効果を意識しよう

 以下の 2つの SELECT 文の違いを考えてみましょう

SELECT
   * 
FROM
   t1, t2
 WHERE
   t1.c1 = t2.c4 AND t1.c1 = 4
SELECT
   *
FROM
   t1 INNER JOIN t2 ON t1.c1 = t2.c4
WHERE
   t1.c1 = 4

 先の SELECT 文は
  結合: t1, t2 (クロス結合)
  制限: t1.c1 = t2.c4 AND t1.c1 = 4
です.
 したがって, t1 に n行, t2 に m行のデータがあった場合,結合によって n*m 行のテーブルが生成され,そのテーブルの中から,制限によって t1.c1 = t2.c4 AND t1.c1 = 4 である行だけが抽出されます.
 ですので,一時的に n*m 行のテーブルが生成されることになります.

 これに対して,後の SELECT 文は
  結合: t1 INNER JOIN t2 ON t1.c1 = t2.c4 (内部結合)
  制限: t1.c1 = 4
です.
 つまり,結合では t1.c1 = t2.c4 を満たす行(r行)だけを含むテーブルが生成され,制限では r行のテーブルから t1.c1 = 4 である行だけが抽出されます.
n*m >> r であれば,こちらの SELECT 文の方が,一時的に生成されるテーブルが小さくなります.

まとめ

 この説明は原理的なものであり, 実際に EXPLAIN で双方の実行計画を確認してみると,ほとんど違いがなかったりします.
 ですが,長い SELECT文を書いたりするときには,この原理を念頭において書いた方が良いと思います.