多表连接查询

联接的表
联接的表是由两个或更多表的积构成的结果集。 对于多个联接,请使用圆括号来更改联接的自然顺序

联接类型
指定联接操作的类型。

1、内连接Inner Join

指定返回所有匹配的行对,放弃两个表中不匹配的行;如果未指定任何联接类型,此设置为默认设置。
内连接使用用 inner join(其中 inner 可以省略),来指明左表和右表,使用 on 关键字来指明匹配条件。
表连接的默认结果是 整合 两个表(或者结果集)中的列。因而以后遇到要将两张表的列合在一起的业务时,要立刻想起使用表连接。
select c.RealName,lm.*
from Customers c join dbo.LeaveMessages lm 
on c.UserId=lm.CustomerId   
--上边代码中,c 是 Customers 表的别名,lm 是 LeaveMessages 表的别名。
--起别名可以在 select 等子句中使用,提高编码效率。

语法:1)select 字段列表 from 表名1  [inner]  join 表名2  on 关联条件
     2)select a.,b. from a [inner]join b on a.id=b.id where 其他条件
     3)select 字段列表 from 表名1  [inner]  join 表名2  on 关联条件 and 添加条件
--1. 也可以将条件放到 where 子句中,我更推荐这种方式。
--2. 连接中可以添加条件 如代码3中的and。

2、外连接 Outer Join

内连接消除与被链接表中任何不匹配的行,但是外连接根据方式不同(左、右、完全)会返回 from 子句中至少一个表中的所有行,另一个没有匹配上的列的值将保持空值。

FULL [ OUTER ] JION

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
在这里插入图片描述语法:语法:select 字段列表 from 表1 full[outer] join 表2 on 关联条件;

LEFT [ OUTER ] JOIN

指定在结果集中包括左表中所有不满足联接条件的行,除了由内部联接返回所有的行之外,还将另外一个表的输出列设置为 NULL。
在这里插入图片描述语法:select 字段列表 from 表1 left [outer] join 表2 on 关联条件;

RIGHT [OUTER] JOIN

查出右表中的所有数据,左表中无法匹配的项将自动补为 NULL。
在这里插入图片描述语法:select 字段列表 from 表1 right [outer] join 表2 on 关联条件;

3、自连接

自连接是指连接的双方都是同一个表,比较抽象,
这两张表可以进行上边提到的各种连接(内、外、交叉)。
在这里插入图片描述

--查询产品分类及其父类的信息,要求显示(编号、名称、父编号、父名称)
select pc1.Id as 编号,pc1.Name as 名称,pc1.ParentId as 父编号,isnull(pc2.Name,'服装') as 父名称
from dbo.ProductCategory pc1 left join dbo.ProductCategory pc2 
on pc1.ParentId = pc2.Id
-- isnull 函数的使用:(将空值转换为其他值)

3、UNION

将两个查询的结果连接到一个结果集中,可控制结果集是否包含重复行:
UNION ALL - 包括重复行。
UNION - 排除重复行。

语法:
SELECT * FROM 表A
UNION
SELECT * FROM 表B;

--UNION 操作不同于 JOIN 操作 :
UNION 连接两个查询中的结果集。 但 UNION 不会从两个表收集的列中创建单独的行。
JOIN 比较两个表中的列,以创建由两个表中的列组成的结果行。

--使用 UNION 合并两个查询结果集的基本规则:
所有查询中的列数和列的顺序必须相同。
数据类型必须兼容。

4、交叉连接 cross Join

结果是两个表的笛卡尔积
假如表A中有2条数据,表B中有 5 条数据,则交叉连接的结果将会有 10 条数据,
也就是说以表A的每一条数据和和表B中的 8 条数据进行连接
select * from 表A cross join 表B;

5、查询的步骤

  1. 先确定要查询的表;
  2. 确定查询的列名;
  3. 结合条件看是否符合条件;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值