SQL 数据库 学习 031 查询-14 连接查询 --- 左(右)外连接、完全连接、交叉连接、联合


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

本篇博客里面使用了 scott 库,如何你现在还没有添加这个库到你的服务器里面,请在查看本篇博客前,访问这篇博文来在你的服务器里面附加scott库。


连接查询

定义:

将两个表或者两个以上的表以一定的连接条件连接起来。从中检索出满足条件的数据。


内连接 (innor join 或者 join

请看这篇博客:SQL 数据库学习 查询 — 内连接


左(右)外连接 (left joinright join

select * from emp "E"
    left join dept "D"
    on "E".deptno = "D".deptno

Alt text

实现的步骤:

  1. 用左表的第一行分别和右表的所有行进行的连接,如果有匹配的行,则一起输出,如果右表有多行匹配,则结果集输出多行,如果没有匹配行,则结果集中只输出一行,该输出行左边为左表第一行内容,右边全部输出null
  2. 然后再用左表第二行和右边所有行进行连接,如果没有匹配行,则结果集中只输出一行,该输出行左边为左表第二行内容,右边全部输出null
  3. 以此类推,直至左边所有行连接完毕。
  4. 因为右边很可能出现有多行和左边的某一行匹配,所以左连接产生的结果集的行数很可能大于 left join 左边表的记录的总数。
  5. 帮助文档:左向外连接的结果集包括LEFT OUTER 子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表均为空值。

左外连接的实际意义

  • 返回一个事情及其该事物的相关信息,如果该事物没有相关信息,则输出null
  • 例子:
    • 已知条件: productStocks 货物库存表、 orderform 订单表、pID 是产品的编号
    • sql语句
    • select productStocks.*, orderform.* from productStocks left join orderform on productStocks.pID=orderform.pID
    • 实际意义: 返回仓库中现存货物的信息及其该货物的订单信息,如果该货物没有订单信息,在把该货物的订单信息全部输出为null

完全连接(full join

select * from productStocks
    full join orderform
    on productStocks.pid = orderform.pid

Alt text

结果集中包含三部分内容:

  1. 两个表中匹配的所有行记录
  2. 左表中那些在右表中找不到匹配的行的记录。这些记录的右边全为null
  3. 右表中那些在左表中找不到匹配的行的记录。这些记录的左边全为null

交叉连接(cross join

select *
    from emp
    cross join dept

等价于:

select * from emp, dept

效果都是将两个表进行笛卡尔积。

Alt text


自连接

定义: 一张表自己和自己连接起来查询数据。

例子:不准用聚合函数 求薪水最高的员工的信息。

--用聚合函数 求出薪水最高的员工的信息
select * 
    from emp
    where sal = (select max(sal) from emp)
--不准用聚合函数 求出薪水最高的员工的信息
select * from emp 
    where empno not in (
        select distinct "E1".empno
        from emp "E1"
        join emp "E2"
        on "E1".sal < "E2".sal
    )

Alt text


联合(union

例子:

输出每一个员工的姓名、工资、上司的姓名。

select "E1".ename as "员工姓名","E1".sal as "员工工资", "E2".ename as "上司姓名" 
    from emp "E1", emp "E2"
    where "E1".mgr = "E2".EMPNO 
union
select ename, sal, '已是最大老板' from emp where mgr is null

Alt text


定义:

表和表之间的数据以纵向的方式连接在一起。注意:我们以前讲的所有的连接是以横向的方式连接在一起的。

注意:

联合就是:若干个select 子句要联合成功的话,必须得满足两个条件:

  1. 这若干个 select 子句输出的列数必须是相等的。
  2. 这若干个 select 子句输出列的数据类型至少是兼容的。

请访问:http://www.aobosir.com/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值