LoginSignup
2
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-23

 関係データベース(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文を書いたりするときには,この原理を念頭において書いた方が良いと思います.

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0