一.写在前面的话

好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量。今天看到一幅图,特此分享出来。

通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学习知识一样,总觉得自己的理解才是最独特的,有时候适当把东西分享出

去,听听别人的见解,或许会让我们理解的更加深刻。换位思考,冷静处理,沉着淡定,不骄不躁,bug只不过生活的一部分,正因为有了bug才会让我们进

步,让我们去学习,去追寻问题的答案,一起努力,做一个快乐的程序猿。这个世界唯一不变的就是变化,学习才会让我们适应这个变化。Keep study,

keep moving!进入今天的sql学习正题。

二.sqlserver连接

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

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

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

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

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

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

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

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

结果如图所示:

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

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

(sales.orders)。

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

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

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

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

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


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

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

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

结果如图:

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

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

  select * from sales.customers

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

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

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

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

(left....join)。

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

结果如图所示:


 

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

的理解左右连接。

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

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

 

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

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

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

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

右连接就以右表为基准。

希望各位大牛给出指导,不当之处虚心接受学习!谢谢!

SQLServer学习笔记系列4的更多相关文章

  1. SQLServer学习笔记系列3

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

  2. SQLServer学习笔记系列2

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

  3. SQLServer学习笔记系列6

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

  4. SQLServer学习笔记系列5

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

  5. SQLServer学习笔记系列1

    一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...

  6. SQLServer学习笔记系列12

    一.写在前面的话 这个sql学习系列,今天准备告一段落,虽然短短的十几篇文章,深刻感受到将学习的东西记录下来,是需要一种坚持! 这些东西只有反复的学习吸收,最终沉淀下来的才是属于自己的知识.也是提醒自 ...

  7. SQLServer学习笔记系列11

    一.写在前面的话 身体是革命的本钱,这句放在嘴边常说的话,还是拿出来一起共勉,提醒一起奋斗的同僚们,保证睡眠,注意身体!偶尔加个班,也许不曾感觉到身体发出的讯号,长期晚睡真心扛不住!自己也制定计划,敦 ...

  8. SQLServer学习笔记系列10

    一.写在前面的话 生活的路很长,还是要坚持走下去,自己选择的生活,就该让这样的生活放射精彩!我不奢求现在的积累,在将来能够收获多少,至少在以后的日子里回忆起来,我不曾放弃过,我坚持过,我不后悔!最近跟 ...

  9. SQLServer学习笔记系列8

    一.写在前面的话 最近一直在思考一个问题,什么才能让我们不显得浮躁,真正的静下心来,用心去感受,用心去回答每个人的问题,用心去帮助别人.现实的生活,往往让我们显得精疲力尽,然后我们仔细想过没用,其实支 ...

随机推荐

  1. MQTT V3.1--我的理解

    最近因为工作需要,需要对推送消息了解,因此对MQTT进行了整理,这里更多的是对MQTT英文版的翻译和理解. MQTT(Message Queue Telemetry Transport),遥测传输协议 ...

  2. [你必须知道的NOSQL系列]专题二:Redis快速入门

    一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...

  3. Java语法糖3:泛型

    泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: public static void main(String[] args) { List list = ne ...

  4. 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。

    问题一:上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?(以下内容为网上查询所得) Microsoft TFS(Team Foundation Server): 优点: ...

  5. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  6. 分享最新的博客到LinkedIn Timeline

    使用Octopress作为我的博客框架有两年了.使用起来一直很顺手,这个工具真正的把博客跟写代码等同起来,非常酷炫.再加上各种各样的定制化,简直是随心所欲.我针对自己的需求对Octopress框架进行 ...

  7. CocoaPod问题

    CocoaPod问题 升级10.11后使用CocoaPod出现-bash: pod: command not found 解决办法 字数91 阅读10946 评论24 喜欢27 升级10.11后,运行 ...

  8. java 内存观察

    总结一下上周的工作. 主要就是用到了 jmap jvisualvm jmap 用来生成jvm堆内存的bin文件 jvisualvm则更强大. 待续.

  9. 每天一个linux命令(56):netstat命令

    netstat命令​用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UD ...

  10. redis常用命令小结

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/107.html?1455867352 1.redis-benchmarkr ...