関係データベース(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行のデータがあった場合,結合によって nm 行のテーブルが生成され,そのテーブルの中から,制限によって t1.c1 = t2.c4 AND t1.c1 = 4
である行だけが抽出されます.
ですので,一時的に nm 行のテーブルが生成されることになります.
これに対して,後の 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文を書いたりするときには,この原理を念頭において書いた方が良いと思います.