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)
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
或
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 USING (column_name);
INNER JOIN查询实例(Example)
现在我们想列出所有客户的订单编号数据,我们可以作一个INNER JOIN查询:
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)
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查询:
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)
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查询:
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)
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查询:
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)
SELECT table_column1, table_column2··· FROM table_name1 CROSS JOIN table_name2;
或
SELECT table_column1, table_column2··· FROM table_name1, table_name2;
或
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查询:
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)
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查询:
SELECT customers.Name, orders.Order_No FROM customers NATURAL JOIN orders;
查询结果如下:
Name | Order_No |
---|---|
李三 | 2572 |
李三 | 7375 |
张一 | 7520 |
张一 | 1054 |
注意到了吗?返回结果同等于下面这个INNER JOIN查询:
SELECT customers.Name, orders.Order_No FROM customers INNER JOIN orders ON customers.C_Id=orders.C_Id;
到此这篇关于SQL连接查询的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。