LoginSignup
8
6

More than 5 years have passed since last update.

結合(SQL)

Last updated at Posted at 2016-04-02

デカルト結合(Cartesian join)

デカルト積(Cartesian)
直積(cross product)
クロス結合(cross join)
無結合(no join)
とも呼ばれることがある

SQL
SELECT テーブル名1.列名1,テーブル名2.列名2
FROM テーブル名1
CROSS JOIN
テーブル名2 

テーブル1のすべての行とテーブル2のすべての行を交差させたものを返す
(テーブル1の行数*テーブル2の行数の行が返る)

内部結合

SQL
SELECT テーブル名1.列名1,テーブル名2.列名2
FROM テーブル名1
    INNER JOIN
    テーブル名2
ON 条件; 

条件の中の比較演算子を用いて、2つのテーブルのレコードを結合する

自然結合

SQL
SELECT テーブル名1.列名1,テーブル名2.列名2
FROM テーブル名1
    NATURAL JOIN
    テーブル名2;

列名1と列名2の名前が同じ時
テーブル名1.列名1=テーブル名2.列名2
の条件で内部結合される

サブクエリ

クエリの中にクエリを埋め込むこと
基本的にサブクエリが返せるのは1つの列の1つの値だけ
(例外としてWHERE句のIN演算子のような複数の値を要求する場合のみ1つの列の複数の値を返す)

分類

非相関サブクエリ
(外部クエリの何も参照にしていない場合)
相関サブクエリ
(内部クエリが外部クエリに依存している場合)

利用できる箇所

SELECT句
SELECT文の列リスト
FROM句
HAVING句

例1(SELECT文の列リスト・非相関サブクエリ)

SQL
SELECT テーブル名1.列名1,テーブル名2.列名2,...
FROM テーブル名1
    NATURAL JOIN
    テーブル名2
WHERE テーブル名1.列名1 IN (SELECT 列名3 FROM テーブル名3);

テーブル名3の列名3に含まれるものからテーブル名1の列名1に一致するものを条件とし、抽出する
この場合、1つの列の複数の行を返す

例2(SELECT文の列リスト・相関サブクエリ)

SQL
SELECT テーブル名1.列名1,...,
(SELECT 列名2 FROM テーブル名2 WHERE テーブル名1.列名3 = テーブル名2.列名2)
FROM テーブル名1;

SELECT文の1つの列として使える
この場合、1つの列の1つの行を返す
テーブル名1の列名3の値を参照としている

EXISTS

相関クエリとともに使われる

SQL
SELECT テーブル名1.列名1,テーブル名1.列名2,...
FROM テーブル名1
WHERE EXISTS
(SELECT * FROM テーブル名2 WHERE テーブル名1.列名1 = テーブル名2.列名2);

(テーブル名1・列名1)が(テーブル名2・列名2)に少なくとも1回は現れるテーブル1のデータを返す

SELECT mc.first_name firstname, mc.last_name lastname, mc.email email
FROM my_contact mc
WHERE EXIST
(SELECT * FROM contact_interest ci WHERE mc.contact_id = ci.contact_id);

my_contactテーブルのcontact_idがcontact_interestテーブルのcontact_idに存在するデータを返す

外部結合

LEFT OUTER JOIN(左側外部結合)

SQL
SELECT テーブル名1.列名1, テーブル名2.列名2, ...
FROM テーブル名1
LEFT OUTER JOIN テーブル名2
ON 条件;

左側のテーブル(テーブル1)のすべての行を右側のテーブル(テーブル2)の行と合致させる
INNERJOINとの違いは合致するものがあるかないかに関わらず全ての行を返す為
合致しない場合右側のテーブル(テーブル2)の列はすべてNULLを返す

RIGHT OUTER JOIN(右側外部結合)

SQL
SELECT テーブル名1.列名1, テーブル名2.列名2, ...
FROM テーブル名1
RIGIT OUTER JOIN テーブル名2
ON 条件;

LEFTOUTERJOINと逆
右側のテーブル(テーブル2)のすべての行を左側のテーブル(テーブル1)の行と合致させる
合致しない場合左側のテーブル(テーブル1)の列はすべてNULLを返す

自己結合

SQL
SELECT as.列名1, as.列名2
FROM テーブル名1 AS as1
INNER JOIN テーブル名1 AS as2

同じテーブルで結合をする

自己参照外部キー(self-reference foreign key)

同じテーブル内の別の目的で使われるテーブルの主キー

UNION

複数のクエリの結果を同じ列に結合する
(縦に結合する)

規則
各SELECT文の列数が、一致しなければならない
各SELECT文に対して、式や集約関数も同じでなくてはならない

UNION

SQL
SELECT 列名1 FROM テーブル1
UNION
SELECT 列名2 FROM テーブル2
UNION
SELECT 列名3 FROM テーブル3
[ORDER BY 列名];

重複値は取り除かれる

UNION ALL

SQL
SELECT 列名1 FROM テーブル1
UNION ALL
SELECT 列名2 FROM テーブル2
UNION ALL
SELECT 列名3 FROM テーブル3
[ORDER BY 列名];

重複値は取り除かれない

INTERSECT

SQL
SELECT 列名1 FROM テーブル名1
INTERSECT
SELECT 列名2 FROM テーブル名2

テーブル名1の列名1とテーブル名2の列名2の重複値のみを返す

EXCEPT

SQL
SELECT 列名1 FROM テーブル名1
EXCEPT
SELECT 列名2 FROM テーブル名2

テーブル名1の列名1に含まれテーブル名2の列名2に含まれない値を返す

参考

Head First SQL 8章 9章

8
6
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
8
6