(1)交叉连接(cross join)即我们所说的笛卡尔积。查询出满足两张表所有的记录数,A(3条记录),B(9条记录),A*B(27条记录)。

比如:雇员表(HR.employees)和货运公司(Sales.shippers)表做一个交叉连接。

1  select * from hr.employees;
2 select * from sales.shippers;

进行交叉连接以后,则找到27条记录。

1  select a.empid,b.shipperid
2 from hr.employees a cross join sales.shippers b;

(2)内连接(inner join),即必须满足某一条件的组合。

例如我们要查询产品类别表下,每种产品属于哪一分类,就需要关联产品分类表(production.categories)和产品明细表做一个inner join。

1  select a.categoryid,a.categoryname,b.productid,b.productname
2 from production.categories a inner join production.products b
3 on a.categoryid=b.categoryid;

结果如图所示:

我们可以看到产品1、都属于产品分类1.以此类推.........,这样就可以找出类别1下有哪些产品,以及产品分别属于哪一分类。

在这里我们拓展一下:假若我们要查询有哪些顾客下单了,找出下订单的顾客信息和订单信息,那么就需要关联顾客表(sales.customers)和订单表

(sales.orders)。

通过查看两张表的字段,我们可以看到两张表可以用custid顾客的ID进行连接。找出相关的顾客信息和订单信息。

1  select a.custid,a.contactname,b.custid,b.orderid
2 from sales.customers a join sales.orders b
3 on a.custid=b.custid

通过内连接(inner join)可以得出一些基本信息,

但是这里我们发现一些顾客下过很多订单,加入我们要找出该顾客下过的订单数,并且只显示该顾客的一条记录,那么我们就需要用到之前学到过的

count.....over用法,返回记录数。如要显示不重复的记录,那么我们就可以用关键字distinct进行过滤。


1  select distinct a.custid,a.contactname,
2 count(*) over(partition by a.custid) as N'顾客订单数量'
3 from sales.customers a inner join sales.orders b
4 on a.custid=b.custid

就这样我们可以得出每个顾客的订单数量。其实这里我们还有不用over开窗函数,也能实现同样的统计信息,那就是根据custid进行分组:

1  select  a.custid,a.contactname,
2 count(*) as N'group-by顾客订单数量'
3 from sales.customers a inner join sales.orders b
4 on a.custid=b.custid
5 group by a.custid ,a.contactname order by a.custid;

结果如图:

这里我们得出的结果跟上面用count.....over()结果一样。所以在这里选择哪种方式,可以根据需要,视情况而定。

但是这里我们注意一点,我们查询一下顾客表(sales.customers),看看里面的信息。

1  select * from sales.customers

我们可以看到共有91条记录,即有91为顾客光顾过相关订单,根据上面顾客下单信息的89条记录,可以知道,有两位顾客光顾过订单,但却未下单,可以理解,不买看看总行吧!

但是我们却没有看到那两位观望着顾客的信息,怎样才能将那两位观望着找出来,咱们送给他两礼品,感谢他们的支持了?这就需要用到接下来说的连接left  join。

(3)left......join ,左连接,即保证左侧条件全部有,右侧没有条件不足,则用null补齐。

继续上述未完成的任务,即找出没有下订单顾客的信息,也就是订单数量为0的顾客信息,在这里就必须保证所有的顾客信息存在,即用到左连接

(left....join)。

1  select  a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as N'group-by顾客订单数量'
3 from sales.customers a left join sales.orders b
4 on a.custid=b.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid);

结果如图所示:


 

(4)右连接(right .....join),其实右连接跟左连接相反,以右侧表为基准,保证右侧表满足所有记录,左侧表不足用null补齐。如果交换两个表位置,则就很好

的理解左右连接。

例如:将上述查询用用连接,则查询出来的是,下过订单的所有顾客信息。

1  select  a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as N'顾客订单数量'
3 from sales.customers a right join sales.orders b
4 on a.custid=b.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid);

 

根据上述信息,我们知道下过订单的顾客确实有89人,有两人没有下过订单;但是在这里我们也可以通过右连接找出所有顾客的信息。

1  select  a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as N'顾客订单数量'
3 from sales.orders b right join sales.customers a
4 on a.custid=b.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid);

可以看到找出了所有顾客信息,包括未下订单的顾客信息。其实在这里只是交换了两张表的位置而已。

所以说对于左右连接来说,左连接就以左侧表为基准,

右连接就以右表为基准。

SQLServer学习笔记<> 表连接查询----交叉连接、内连接、左连接、右连接的更多相关文章

  1. SQLServer学习笔记<>相关子查询及复杂查询

    二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...

  2. SQL多表联合查询(交叉连接,内连接,外连接)

    连接查询:     交叉连接:   交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据航数乘以第二个表中符合,查询条件的数据行数,例如department ...

  3. SQLServer学习笔记系列4

    一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学 ...

  4. SQLServer学习笔记系列2

    一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...

  5. SQLServer 学习笔记之超详细基础SQL语句 Part 3

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 2------------------- 13. 使用compute对查 ...

  6. SQLServer学习笔记系列6

    一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...

  7. SQLServer学习笔记系列5

    一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...

  8. SQLServer学习笔记系列3

    一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...

  9. SQLServer 学习笔记之超详细基础SQL语句 Part 5

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 4------------------- 21使用默认 默认(也称默认值 ...

随机推荐

  1. 解决: libcimtd.lib not found, rpcndr.lib not found

    在编译Inside COM这本书的代码的时候. 报这个错. 毕竟1996年的代码... 原因很简单: libcimtd.lib 是 VC6时代的东西(对应着iostream.h)...现在的MS编译器 ...

  2. COM学习笔记

    2015-10-22 10:24 在第八章学习Aggregation的时候搞晕了,所以就建了一个Workspace名为"COMAggregationDemo"来调试一下,使用的源码 ...

  3. J2EE MyBatis使用

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...

  4. 树形DP+RMQ+单调队列(Bob’s Race HDU4123)

    题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q, ...

  5. android设置系统模式

    android 静音与振动1,设置静音和振动静音和振动都属于来电后的动作.所以在设置静音和振动时都只是设置一些标识,并往数据库写入相应标识. 文件:packages/apps/settings/src ...

  6. css3:与背景的相关样式

    1. (1)background-origin : border-box | padding-box | content-box;(设置元素背景图片的原始起始位置.) //需要注意的是,如果背景不是n ...

  7. 夺命雷公狗---微信开发17----自定义菜单的事件推送,响应菜单的CLICK

    废话不多说,index.php 代码如下所示: <?php /** * wechat php test */ //define your token require_once "com ...

  8. PAT乙级 1016. 部分A+B (15) C语言实现

    1016. 部分A+B (15) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 正整数A的“DA(为1位整数)部 ...

  9. 仅支持webkit浏览器的多行内容超出显示省略号

    .box { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; ...

  10. archlinux安装输入法需要的包及archlinux无法使用输入法的解决

    所需的包: fcitx #这货应该是主要的程序 fcitx-configtool #图形化的配置工具,非必须 fcitx-gtk2 fcitx-gtk3 fcitx-qt4 fcitx-qt5 fci ...