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;
クエリ結果は同じです