Join 连接 (SQL Join)
SQL Join (连接) 是利用不同数据表之间字段的关连性来结合多数据表之检索。
SQL Join是结合多个数据表而组成一抽象的暂时性数据表以供数据查询,在原各数据表中之纪录及结构皆不会因此连接查询而改变。
这是一个客户数据表「customers」:
C_Id
|
Name
|
City
|
Address
|
Phone
|
1
|
张一
|
台北市
|
XX路100号
|
02-12345678
|
2
|
王二
|
新竹县
|
YY路200号
|
03-12345678
|
3
|
李三
|
高雄县
|
ZZ路300号
|
07-12345678
|
而这是产品订单的数据表「orders」:
O_Id
|
OrderNo
|
C_Id
|
1
|
2572
|
3
|
2
|
7375
|
3
|
3
|
7520
|
1
|
4
|
1054
|
1
|
5
|
1257
|
5
|
其中,C_Id 是客户数据表中的主键 (Primary Key) 字段,我们怎么将这两张不同的数据表依相关字段来作个连接结合以便查询呢?这就是接下来的主题 Join!
SQL 的 Join 查询有哪几种类型?
-
Inner Join : 内部连接
-
LEFT (OUTER) JOIN : 左外部连接
-
RIGHT (OUTER) JOIN : 右外部连接
-
FULL (OUTER) JOIN : 全部外部连接
-
CROSS JOIN : 交叉连接
-
NATURAL JOIN : 自然连接
INNER JOIN - 内部连接
INNER JOIN (内部连接) 为等值连接,必需指定等值连接的条件,而查询结果只会返回符合连接条件的数据。
INNER JOIN 语法 (SQL INNER JOIN Syntax)
1
2
3
4
|
SELECT table_column1, table_column2···
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
|
或
1
2
3
4
|
SELECT table_column1, table_column2···
FROM table_name1
INNER JOIN table_name2
USING (column_name);
|
INNER JOIN 查询实例 (Example)
现在我们想列出所有客户的订单编号数据,我们可以作一个 INNER JOIN 查询:
1
2
3
4
|
SELECT customers.Name, orders.Order_No
FROM customers
INNER JOIN orders
ON customers.C_Id=orders.C_Id;
|
其中用点号连接之「XXX.YYY」表示XXX数据表中的YYY字段。
查询结果如下:
Name
|
Order_No
|
李三
|
2572
|
李三
|
7375
|
张一
|
7520
|
张一
|
1054
|
查询结果只会返回符合连接条件的数据!
LEFT JOIN - 左外部连接
LEFT JOIN 可以用来建立左外部连接,查询的 SQL 叙述句 LEFT JOIN 左侧数据表 (table_name1) 的所有记录都会加入到查询结果中,即使右侧数据表 (table_name2) 中的连接字段没有符合的值也一样。
LEFT JOIN 语法 (SQL LEFT JOIN Syntax)
1
2
3
4
|
SELECT table_column1, table_column2···
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
|
有些数据库的语法会是LEFT OUTER JOIN。
LEFT JOIN 查询实例 (Example)
现在我们想查询所有客户与其订单状况的数据,我们可以作一个 LEFT JOIN 查询:
1
2
3
4
|
SELECT customers.Name, orders.Order_No
FROM customers
LEFT JOIN orders
ON customers.C_Id=orders.C_Id;
|
查询结果如下:
Name
|
Order_No
|
张一
|
7520
|
张一
|
1054
|
王二
|
|
李三
|
2572
|
李三
|
7375
|
LEFT JOIN会返回左侧数据表中所有数据列,就算没有符合连接条件,而右侧数据表中如果没有匹配的数据值就会显示为「NULL」。
RIGHT JOIN - 右外部连接
相对于LEFT JOIN,RIGHT JOIN 可以用来建立右外部连接,查询的 SQL 叙述句 RIGHT JOIN 右侧数据表 (table_name2) 的所有记录都会加入到查询结果中,即使左侧数据表 (table_name2) 中的连接字段没有符合的值也一样。
RIGHT JOIN 语法 (SQL RIGHT JOIN Syntax)
1
2
3
4
|
SELECT table_column1, table_column2···
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
|
有些数据库的语法会是RIGHT OUTER JOIN。
RIGHT JOIN 查询实例 (Example)
现在我们想查询所有订单与相应的客户之资料,我们可以作一个 RIGHT JOIN 查询:
1
2
3
4
|
SELECT customers.Name, orders.Order_No
FROM customers
RIGHT JOIN orders
ON customers.C_Id=orders.C_Id;
|
查询结果如下:
Name
|
Order_No
|
李三
|
2572
|
李三
|
7375
|
张一
|
7520
|
张一
|
1054
|
|
1257
|
RIGHT JOIN会返回右侧数据表中所有数据列,就算是没有符合连接条件,而左侧数据表中如果没有匹配的数据值就会显示为「NULL」。
FULL JOIN - 全部外部连接
FULL JOIN 即为 LEFT JOIN 与 RIGHT JOIN 的联集,它会返回左右数据表中所有的纪录,不论是否符合连接条件。
FULL JOIN 语法 (SQL FULL JOIN Syntax)
1
2
3
4
|
SELECT table_column1, table_column2···
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
|
FULL JOIN 查询实例 (Example)
我们来作一个 FULL JOIN 查询:
1
2
3
4
|
SELECT customers.Name, orders.Order_No
FROM customers
FULL JOIN orders
ON customers.C_Id=orders.C_Id;
|
查询结果如下:
Name
|
Order_No
|
李三
|
2572
|
李三
|
7375
|
张一
|
7520
|
张一
|
1054
|
|
1257
|
王二
|
|
MySQL数据库中没有FULL JOIN,但是您可以用UNION来模拟。
CROSS JOIN - 交叉连接
交叉连接为两个数据表间的笛卡儿乘积 (Cartesian product),两个数据表在结合时,不指定任何条件,即将两个数据表中所有的可能排列组合出来,以下例而言 CROSS JOIN 出来的结果资料列数为 3×5=15 笔,因此,当有WHERE、ON、USING条件时不建议使用。
CROSS JOIN 语法 (SQL CROSS JOIN Syntax)
1
2
3
|
SELECT table_column1, table_column2···
FROM table_name1
CROSS JOIN table_name2;
|
或
1
2
|
SELECT table_column1, table_column2···
FROM table_name1, table_name2;
|
或
1
2
3
|
SELECT table_column1, table_column2···
FROM table_name1
JOIN table_name2;
|
FULL JOIN 查询实例 (Example)
这是一个客户数据表「customers」:
C_Id
|
Name
|
City
|
Address
|
Phone
|
1
|
张一
|
台北市
|
XX路100号
|
02-12345678
|
2
|
王二
|
新竹县
|
YY路200号
|
03-12345678
|
3
|
李三
|
高雄县
|
ZZ路300号
|
07-12345678
|
而这是产品订单的数据表「orders」:
O_Id
|
Order_No
|
C_Id
|
1
|
2572
|
3
|
2
|
7375
|
3
|
3
|
7520
|
1
|
4
|
1054
|
1
|
5
|
1257
|
5
|
我们来作一个 CROSS JOIN 查询:
1
2
3
|
SELECT customers.Name, orders.Order_No
FROM customers
CROSS JOIN orders;
|
查询结果如下:
Name
|
Order_No
|
张一
|
2572
|
王二
|
2572
|
李三
|
2572
|
张一
|
7375
|
王二
|
7375
|
李三
|
7375
|
张一
|
7520
|
王二
|
7520
|
李三
|
7520
|
张一
|
1054
|
王二
|
1054
|
李三
|
1054
|
张一
|
1257
|
王二
|
1257
|
李三
|
1257
|
NATURAL JOIN - 自然连接
自然连接有 NATURAL JOIN、NATURAL LEFT JOIN、NATURAL RIGHT JOIN,两个表格在进行 JOIN 时,加上 NATURAL 这个关键词之后,两数据表之间同名的字段会被自动结合在一起。
NATURAL JOIN 语法 (SQL NATURAL JOIN Syntax)
1
2
3
|
SELECT table_column1, table_column2···
FROM table_name1
NATURAL JOIN table_name2;
|
NATURAL JOIN 查询实例 (Example)
这是一个客户数据表「customers」:
C_Id
|
Name
|
City
|
Address
|
Phone
|
1
|
张一
|
台北市
|
XX路100号
|
02-12345678
|
2
|
王二
|
新竹县
|
YY路200号
|
03-12345678
|
3
|
李三
|
高雄县
|
ZZ路300号
|
07-12345678
|
而这是产品订单的数据表「orders」:
O_Id
|
Order_No
|
C_Id
|
1
|
2572
|
3
|
2
|
7375
|
3
|
3
|
7520
|
1
|
4
|
1054
|
1
|
5
|
1257
|
5
|
现在我们想列出所有客户的订单编号数据,我们可以作一个 NATURAL JOIN 查询:
1
2
3
|
SELECT customers.Name, orders.Order_No
FROM customers
NATURAL JOIN orders;
|
查询结果如下:
Name
|
Order_No
|
李三
|
2572
|
李三
|
7375
|
张一
|
7520
|
张一
|
1054
|
注意到了吗?返回结果同等于下面这个INNER JOIN查询:
1
2
3
4
|
SELECT customers.Name, orders.Order_No
FROM customers
INNER JOIN orders
ON customers.C_Id=orders.C_Id;
|