SQL - 複数テーブルの関連付けに参加

1.SQL接続(JOIN)

1.デカルト積

(1) 複数のテーブルを接続して条件制限なしでクエリを実行した場合、最終的なクエリ結果の数は、複数のテーブルの数の積になります。

たとえば、テーブル A に 15 (行) のデータがあり、テーブル B に 20 (行) のデータがある場合、2 つのテーブルをクエリすると、15 * 20 = 300 (行) のデータが生成されます。

select empname,deptname from emp, dept;

(2) デカルト積現象を避ける

select 
		empname,deptname 
	from 
		emp, dept
	where
		emp.deptno = dept.deptno;

	
// 或者
	select 
		e.empname,d.deptname 
	from 
		emp e, dept d
	where
		e.deptno = d.deptno; //SQL92语法

最終的な結果は減少しますが、クエリの数は依然として 2 つのテーブルの行数の積です

したがって、デカルト積現象により、テーブル接続の数が多いほど効率が低下し、テーブル接続の数を回避しようとします

2. SQL JOIN 句は、これらのテーブル間の共通フィールドに基づいて、2 つ以上のテーブルの行を結合するために使用されます (クロステーブル クエリ)。

SQL92: 1992 年の SQL 構文
SQL99: 1999 年の SQL 構文

単一テーブル クエリと呼ばれる、テーブルとは別にクエリを実行する

下の図は、LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOINに関連する7つの使用法を示しています

3.SQL結合型

(1) INNER JOIN : 内部接続

[1] 同値接続、2 つのテーブルの接続フィールドが同じ行を返す (条件は同値関係)

[2] 非等価接続、条件が等価関係でない

[3] 自己接続、同一テーブルを複数テーブルとみなす

ノート:

        INNERは省略可能

        2 つのテーブル間にプライマリとセカンダリの関係はありません。

(2) OUTER JOIN  : 外部接続

LEFT (OUTER) JOIN : 左 (外部) 接続、右のテーブルに一致がない場合でも、すべての行が左のテーブルから返されます (結合キーワードの左側のテーブルが主テーブルと見なされ、主に左側のテーブルのすべてのデータをクエリし、関連するクエリの右側のテーブルにピギーバックします)

RIGHT (OUTER) JOIN : 右 (outer) 結合、左のテーブルに一致がない場合でも、すべての行が右のテーブルから返されます (結合キーワードの右側のテーブルが主テーブルと見なされ、主に右側のテーブルのすべてのデータをクエリして、関連付けられたクエリの左側のテーブルに便乗して出てきます)

FULL (OUTER) JOIN  : フル (アウター) 接続

外部結合、テーブルの 1 つに一致がある限り返されます。つまり、両方のテーブルから行が返されます: 左結合 + 右結合

ノート:

        OUTERは省略可能

        外部結合では、2 つのテーブルが接続され、プライマリとセカンダリの関係が生じます。

(3)クロスコネクション

CROSS JOIN : 結果は、最初のテーブルの行数に 2 番目のテーブルの行数を掛けたデカルト積です。

4、SQL内部結合

INNER JOIN キーワードは、テーブルに少なくとも 1 つの一致がある場合に行を返します。

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
 
或者
 
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
INNER JOIN 与 JOIN 是相同的

(1) 等価接続

SQL92语法:
	select 
		e.ename,d.dname
	from
		emp e, dept d
	where
		e.deptno = d.deptno;
//sql92的缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。

SQL99语法:
	select 
		e.ename,d.dname
	from
		emp e
	join
		dept d
	on
		e.deptno = d.deptno;
	

	//inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)
	select 
		e.ename,d.dname
	from
		emp e
	inner join
		dept d
	on
		e.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
//sql99优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后继续添加where

 inner は省略できます。inner を使用すると読みやすくなります。

sql92の短所:構造が明確でない、テーブルの接続条件、後段でさらに絞り込む条件がすべて後ろに置かれている

sql99 の利点: テーブル接続の条件は独立 接続後、さらにスクリーニングが必要な場合は、続けて where を追加します。

(2) 非等価接続

select 
	e.ename, e.sal, s.grade
from
	emp e
join
	salgrade s
on
	e.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。


select 
	e.ename, e.sal, s.grade
from
	emp e
inner join
	salgrade s
on
	e.sal between s.losal and s.hisal;

(3) 自己接続

1 つのテーブルを 2 つのテーブルとして

select 
	a.ename as '员工名', b.ename as '领导名'
from
	emp a
join
	emp b
on
	a.mgr = b.empno; //员工的领导编号 = 领导的员工编号

 INNER JOIN は JOIN と同じです

5、SQL左結合

LEFT JOIN キーワードは、右側のテーブル (table2) に一致するものがなくても、左側のテーブル (table1) からすべての行を返します。右のテーブルに一致がない場合、結果は NULL になります。

join キーワードの左側のテーブルをメイン テーブルと見なし、主に左側のテーブルのすべてのデータをクエリし、右側のテーブルを関連付けによってクエリします。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
 
 
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN

次のように: 

select 
	e.ename,d.dname
from
	dept d 
left (outer) join 
	emp e
on
	e.deptno = d.deptno;

一部のデータベースでは、LEFT JOIN は LEFT OUTER JOIN と呼ばれます。

データベースの キーワードが
複数のテーブルを接続してレコードを返す場合、中間の一時テーブルが生成され、この一時テーブルがユーザーに返されます。

左結合を使用する場合、on 条件と where 条件の違いは次のとおりです。

(1) on 条件は、一時テーブルを生成する際の条件であり、on の条件が真であるかどうかに関係なく、左のテーブルのレコードを返します。
(2) where 条件は、一時テーブルの生成後に一時テーブルをフィルタリングするための条件です。この時点では、左結合の意味はなく (左のテーブルのレコードが返される必要があります)、条件が真でない場合はすべての条件が除外されます。

次の 2 つのテーブルがあるとします。

 2 つの SQL:

select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
 
select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')

 上記の結果の主な理由は、左結合、右結合、および完全結合の特殊性です. on の条件が true であるかどうかに関係なく、左または右のテーブルのレコードが返され、full には和集合があります左右の特徴。しかし、内側の jion にはこの特殊性はなく、条件は on と where に配置され、返される結果セットは同じです。

【6】SQL右結合

RIGHT JOIN キーワードは、左側のテーブル (table1) に一致するものがなくても、右側のテーブル (table2) からすべての行を返します。左の表に一致するものがない場合、結果は NULL になります。

join キーワードの右側のテーブルはメイン テーブルと見なされ、主に右側のテーブルのすべてのデータをクエリし、左側のテーブルを関連付けによってクエリします。

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
 
 
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN

次のように: 

select 
	e.ename,d.dname
from
	emp e 
right (outer) join 
	dept d
on
	e.deptno = d.deptno;

一部のデータベースでは、RIGHT JOIN は RIGHT OUTER JOIN と呼ばれます。

【7】SQL FULL OUTER JOIN

FULL OUTER JOIN キーワードは、左側のテーブル (table1) と右側のテーブル (table2) のいずれかに一致がある限り、行を返します。

FULL OUTER JOIN キーワードは、LEFT JOIN と RIGHT JOIN の結果を結合します (FULL OUTER JOIN は MySQL ではサポートされていません)。

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

次のように要約します。

内部結合 B は交差点を取ります。

左結合 B は A のすべてを取得し、B には null として対応する値がありません。

右側の結合 B は B をすべて取ります A には対応する値がなく、null です。

完全外部結合 B は結合を取り、null に対応する値はありません

例: 「user」テーブルの「deptId」列は「dept」テーブルのフィールド「id」を指し、上記の 2 つのテーブルは「deptId」列によってリンクされています。

select u.id,d.id,d.name,d.number 
from user u left join dept d 
on u.deptId = d.id;
 
 
select u.id,u.name,d.id,d.name,d.number 
from user u inner join dept d 
on u.deptId = d.id;

クエリ結果は同じです

おすすめ

転載: blog.csdn.net/MinggeQingchun/article/details/122302972