SQL Join连接查询是怎样,有哪些简单实例
Admin 2022-08-03 群英技术资讯 298 次浏览
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!
Inner Join : 内部连接
LEFT (OUTER) JOIN : 左外部连接
RIGHT (OUTER) JOIN : 右外部连接
FULL (OUTER) JOIN : 全部外部连接
CROSS JOIN : 交叉连接
NATURAL JOIN : 自然连接
INNER JOIN (内部连接) 为等值连接,必需指定等值连接的条件,而查询结果只会返回符合连接条件的数据。
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 查询:
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 可以用来建立左外部连接,查询的 SQL 叙述句 LEFT JOIN 左侧数据表 (table_name1) 的所有记录都会加入到查询结果中,即使右侧数据表 (table_name2) 中的连接字段没有符合的值也一样。
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 查询:
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」。
相对于LEFT JOIN,RIGHT JOIN 可以用来建立右外部连接,查询的 SQL 叙述句 RIGHT JOIN 右侧数据表 (table_name2) 的所有记录都会加入到查询结果中,即使左侧数据表 (table_name2) 中的连接字段没有符合的值也一样。
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 查询:
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 即为 LEFT JOIN 与 RIGHT JOIN 的联集,它会返回左右数据表中所有的纪录,不论是否符合连接条件。
SELECT table_column1, table_column2··· FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
我们来作一个 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来模拟。
交叉连接为两个数据表间的笛卡儿乘积 (Cartesian product),两个数据表在结合时,不指定任何条件,即将两个数据表中所有的可能排列组合出来,以下例而言 CROSS JOIN 出来的结果资料列数为 3×5=15 笔,因此,当有WHERE、ON、USING条件时不建议使用。
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;
这是一个客户数据表「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 LEFT JOIN、NATURAL RIGHT JOIN,两个表格在进行 JOIN 时,加上 NATURAL 这个关键词之后,两数据表之间同名的字段会被自动结合在一起。
SELECT table_column1, table_column2··· FROM table_name1 NATURAL JOIN table_name2;
这是一个客户数据表「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;
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
SQL 撤销索引、撤销表以及撤销数据库怎样做?通过使用 DROP 语句,可以轻松地删除索引、表和数据库。下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
这篇文章主要介绍了SQL Server 获取服务器时间的sql语句,需要的朋友可以参考下
Microsoft SQL Server 事物日志中每个记录都由一个唯一的日志序列号(LSN)标识,如果 LSN2 大于 LSN1,则 LSN2 所标识的日志记录描述的更改发生在日志记录 LSN1 描述的更改之后。
这篇文章主要为大家介绍了SQLServer数据库的设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
SQL 别名(Aliases)是什么?通过使用 SQL,可以为表名称或列名称指定别名(Alias)。SQL 别名用于为表或表中的列提供临时名称,数据库中的实际表名不会更改。SQL 别名通常用于使列名更具可读性。SQL 一个别名只存在于查询期间。表别名的使用是在特定SQL语句中重命名表。列别名用于为特定SQL查询重命名表的列。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008