【SQL Server】链接查询

前言:

       之前学过数据库原理,在做题的时候感觉还是挺简单的,但是真正用到实际中,就感觉虚了好多,所以今天在把数据库中的知识拾起来,看看在实际过程中是如何应用的。

   连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询

   首先设计测试的两张表,表的名字分别为T_Student和T_Course

  

  


1.Union

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

注意:使用UNION时,必须在其目标列表中有相同数目的表达式,也就是上面的表选择两个列,下面的表也必须选择两个列

  

<span style="font-family:KaiTi_GB2312;font-size:18px;">select id,name from T_Student 
Union
select courseid,coursename from T_Course</span>


结果:




这是一种比较少用的链接方式,Oracle、MySQL均不支持,作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。


2、INNER JOIN(内连接)

内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

 NNER JOIN(内连接),也成为自然连接

作用:根据两个或多个表中的列之间的关系,从这些表中查询数据。

注意: 内连接是从结果中删除其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

实例:查询学生信息,包括id,姓名,专业名称

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student join T_Course
on T_Student.courseid=T_Course.Courseid</span>

查询结果:


3 外连接

外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。

重点:至少有一方保留全集,没有匹配行用NULL代替。

(1)LEFT OUTER JOIN,简称LEFT JOIN,左外连接(左连接)

结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入NULL值。

实例:用左链接查询学生的的id,姓名,专业名称

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student left join T_Course
on T_Student.courseid=T_Course.Courseid</span>


结果:


通过结果我们可以看出,left join是以表1的记录为基础,即左表的记录全部显示出来,而表2只显示符合搜索条件的记录显示出来,即右表根据条件显示,那这里的条件就是a.ID=b.ID,记录不足的会以NULL填充显示


(2)右外链接

实例:用左链接查询学生的的id,姓名,专业名称

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student right join T_Course
on T_Student.courseid=T_Course.Courseid</span>


结果:



我们会发现,right join执行的效果刚好和left join执行的效果相反,即以右表的数据为基础,显示右表全部数据,而只显示左表符合搜索条件的数据。


4、CROSS JOIN(交叉连接)

交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。 
简单查询两张表组合,这是求笛卡儿积,效率最低。


笛卡儿积:笛卡尔乘积,也叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student cross join T_Course</span>

结果:


图没有截完。 可以看出是查询所有的信息。


总结:

1、 查两表关联列相等的数据用内连接。
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值