SQL中的连接查询详解


Posted in SQL Server onJune 21, 2022

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连接查询的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

SQL Server 相关文章推荐
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer2019 数据库环境搭建与使用的实现
Apr 08 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SQL Server数据库备份和恢复数据库的全过程
一次SQL查询优化原理分析(900W+数据从17s到300ms)
Jun 10 #SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
SQL Server携程核心系统无感迁移到MySQL实战
SQL解决未能删除约束问题drop constraint
May 30 #SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 #SQL Server
SQL Server中的逻辑函数介绍
May 25 #SQL Server
You might like
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
用python读写excel的方法
2014/11/18 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
详解flask入门模板引擎
2018/07/18 Python
python 两个数据库postgresql对比
2019/10/21 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
web页面录屏实现
2019/02/12 HTML / CSS
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
央视元宵晚会主持串词
2014/03/25 职场文书
英语系毕业生求职信
2014/07/13 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
个人先进材料范文
2014/12/30 职场文书