SQLServer之多表联合查询
多表联合查询简介
定义:连接查询是关系型数据库最主要的查询,通过连接运算符可以实现多个表连接数据查询。
分类:内连接,外连接,全外连接。
内连接
定义
内联接使用比较运算符根据每个表的通用列中的值匹配两个表中的行。
语法
select 表1.*,表2.* from 表1 as a [wtih(锁)] inner join 表2 as b [wtih(锁)] on a.值 {= | != } b.值 [条件1] [where 条件] [group by 条件] [having 条件] [order by 条件];
语法注释
{}:大括号内的值必选一个,例如:选择=号。
[]:索引符号的值表示是可添加也可不添加的,例如:选择不添加[条件1]。
[条件1]:[条件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等于b.值。
[where 条件]:where后跟表中数据的筛选条件,例如:where a.值=1。
[group by 条件]:group by后面跟分组条件,可以跟一个或者多个分组条件,例如:group by a.值,b.值。
[having 条件]:having后边主要是筛选group by条件分组后的结果,后面可以跟一个或者多个条件,例如:select max(a.id),min(b.name) from A as a inner join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。
[order by 条件]:order by后面跟排序条件,可以根据一个值或者多个值排序,例如:根据多个值排序,select a.* from A as a inner join B as b on a.id=b.id order by a.值 asc,b.值 desc。
示例:A表内连接B表,使用A表中的数据逐行匹配B表的中数据,匹配成功则返回,匹配失败则不返回值,匹配成功一共返回五行数据,where条件筛选返回五行数据,group by条件筛选返回两行数据,having条件筛选返回两行数据,order by条件筛选3大于1,则3在第一行,1在第二行。

外连接
分类
left outer join(左外连接)和right outer join(右连接)。
左外连接
定义
从表(右表)中的数据逐条匹配主表(左表)中的数据,如果匹配,如果右表匹配一行或者多行则将右表匹配值一行或者多行追加到左表匹配行输出到结果集,如果无匹配,NULL值追加到左表不匹配行输出到结果集。
语法
select 表1.*,表2.* from 表1 as a [wtih(锁)] left [outer] join 表2 as b [wtih(锁)] on a.值 {= | != } b.值 [条件1] [where 条件] [group by 条件] [having 条件] [order by 条件];
语法注释
{}:大括号内的值必选一个,例如:选择=号。
[]:索引符号的值表示是可添加也可不添加的,例如:选择不添加[条件1]。
[条件1]:[条件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等于b.值。
[where 条件]:where后跟表中数据的筛选条件,例如:where a.值=1。
[group by 条件]:group by后面跟分组条件,可以跟一个或者多个分组条件,例如:group by a.值,b.值。
[having 条件]:having后边主要是筛选group by条件分组后的结果,后面可以跟一个或者多个条件,例如:select max(a.id),min(b.name) from A as a left outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。
[order by 条件]:order by后面跟排序条件,可以根据一个值或者多个值排序,例如:根据多个值排序,select a.* from A as a left outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。
示例:A表左外连接B表,B表中数据逐行取出与A表中数据匹配,右表取出第一行数据1与A表逐行匹配,匹配到两行,将B表数据1追加到A表数据行输出到结果集,同理剩余的数据3和1匹配到三行数据,共匹配到五行数据输出,A中存在数据2与B表无匹配行,则将NULL值追加到A表数据2行输出,匹配的结果集和不匹配的结果集共七行数据输出到结果集。(where条件筛选后输出七行数据,group by条件筛选后会输出三行数据,having筛选后会输出三行数据,order by条件筛选后则会按照数据从大到小排列),依次显示不加筛选条件和添加所有筛选条件的结果。


右外连接
定义
从表(左表)中的数据逐条匹配主表(右表)中的数据,如果匹配,如果左表匹配一行或者多行则将左表匹配值一行或者多行追加到右表匹配行输出到结果集,如果无匹配,NULL值追加到右表不匹配行输出到结果集。
语法
select 表1.*,表2.* from 表1 as a [wtih(锁)] right [outer] join 表2 as b [wtih(锁)] on a.值 {= | != } b.值 [条件1] [where 条件] [group by 条件] [having 条件] [order by 条件];
语法注释
{}:大括号内的值必选一个,例如:选择=号。
[]:索引符号的值表示是可添加也可不添加的,例如:选择不添加[条件1]。
[条件1]:[条件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者,or a.值等于b.值。
[where 条件]:where后跟表中数据的筛选条件,例如:where a.值=1。
[group by 条件]:group by后面跟分组条件,可以跟一个或者多个分组条件,例如:group by a.值,b.值。
[having 条件]:having后边主要是筛选group by条件分组后的结果,后面可以跟一个或者多个条件,例如:select max(a.id),min(b.name) from A as a right outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。
[order by 条件]:order by后面跟排序条件,可以根据一个值或者多个值排序,例如:根据多个值排序,select a.* from A as a right outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。
示例:A表右外连接B表,A表中数据逐行取出与B表中数据匹配,左表取出第一行数据1与B表逐行匹配,匹配到两行,将A表数据1追加到B表数据行输出到结果集,同理剩余的数据1和3匹配到三行数据,共匹配到五行数据输出,A中存在数据2与B表无匹配行,自动过滤掉并不添加输出,B表数据全部匹配完成,不匹配的结果集为零行,匹配的结果集和不匹配的结果集共五行数据输出到结果集。(where条件筛选后输出五行数据,group by条件筛选后会输出两行数据,having筛选后会输出两行数据,order by条件筛选后则会按照数据从大到小排列),依次显示不加筛选条件和添加所有筛选条件的结果。


全外连接
定义
全外连接又称为完全外连接,该连接查询方式返回两个连接中所有的记录数据。根据匹配条件,如果满足匹配条件时,则返回匹配的一行或者多行数据;如果不满足匹配条件时,同样返回数据,但在相应的列中填入NULL,全外连接返回的结果集中包含了两个完全表的所有数据。全外连接关键字FULL OUTER JOIN。
语法
select 表1.*,表2.* from 表1 as a [wtih(锁)] full [outer] join 表2 as b [wtih(锁)] on a.值 { = | != } b.值 [条件1] [where 条件] [group by 条件] [having 条件] [order by 条件];
语法注释
{}:大括号内的值必选一个,例如:选择=号。
[]:索引符号的值表示是可添加也可不添加的,例如:选择不添加[条件1]。
[条件1]:[条件1]=[and | or ] [a.值=b.值 | a.值!=b.值 | a.值=值 | a.值!=值 | b.值=值 | b.值!=值],例如:and a.值=b值,或者or a.值等于b.值。
[where 条件]:where后跟表中数据的筛选条件,例如:where a.值=1。
[group by 条件]:group by后面跟分组条件,可以跟一个或者多个分组条件,例如:group by a.值,b.值。
[having 条件]:having后边主要是筛选group by条件分组后的结果,后面可以跟一个或者多个条件,例如:select max(a.id),min(b.name) from A as a full outer join B as b on a.id=b.id group by a.id,b.name having a,id>1 and b.name=1。
[order by 条件]:order by后面跟排序条件,可以根据一个值或者多个值排序,例如:根据多个值排序,select a.* from A as a full outer join B as b on a.id=b.id order by a.值 asc,b.值 desc。
示例:全外连接A表与B表,首先输出所有符合条件的数据,A表中数据逐行取出和B表中数据逐行匹配,存在1和3的数据匹配行,匹配成功输出5行数据,然后输出不符合条件的行,A中存在2行不符合条件的值,B表数据全部匹配成功无不符合条件的值,返回A中不符合条件的值并将其它列值置为NULL输出2行数据,总共输出5加2共七行数据。

SQLServer之多表联合查询的更多相关文章
- MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例
有二三年没写代码了,**内的工作就是这样,容易废人!看到园子里这么多大侠朝气蓬勃的,我想也要学点东西并和大家分享,共同进步!快乐每一天,进步每一天!言归正传! 通过最近一段时间对MVC5.EF6的学习 ...
- yii 多表联合查询的几种方法
yii多表联合查询, 第一种,用command,自己拼接sql语句执行查询 第二种,用AR,model需继承下面的ar,执行queryall或queryrow方法 <?php //applica ...
- Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- MyBatis 多表联合查询及优化 以及自定义返回结果集
下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...
- 一步步学Mybatis-实现多表联合查询(4)
上一章节中我们已经完成了对单表的CRUD操作,接下来今天这一讲讲述的是关于Mybatis在多表查询时候的应用,毕竟实际业务中也是多表的联合查询比较多嘛~ 还记得最一开始我们新建过一张Website表吗 ...
- MyBatis之三:多表联合查询
在这篇文章里面主要讲解如何在mybatis里面使用一对一.一对多.多表联合查询(类似视图)操作的例子. 注:阅读本文前请先大概看一下之前两篇文章. 一.表结构 班级表class,学生表student, ...
- MyBatis 多表联合查询,字段重复的解决方法
MyBatis 多表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名: <resultMap type=&q ...
- ormlite 多表联合查询
ormlite 多表联合查询 QueryBuilder shopBrandQueryBuilder = shopBrandDao.queryBuilder(); QueryBuilder shopQu ...
随机推荐
- 结合JDK源码看设计模式——原型模式
定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.不需要知道任何创建的细节,不调用构造函数适用场景: 类初始化的时候消耗较多资源 new产生的对象需要非常繁琐的过程 构造函数比较 ...
- vmware P2V迁移域内windows服务器脱域问题
windows 域服务器采用vmware converter进行物理机转换为虚拟机,需要在完成后进行退域重新加域操作. 否则,有可能会出现服务器在30天后脱域情况.出现脱域情况,可以通过退域加域的方式 ...
- Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决
最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...
- 【spring源码分析】IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...
- .NET Core 必备安全措施
.NET Core大大简化了.NET应用程序的开发.它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量,本文目的是介绍如何创建更安全的.NET Core应用程序. 1.在生产中使用HTTP ...
- ReactiveSwift源码解析(六) SignalProtocol的take(first)与collect()延展实现
上篇博客我们聊了observe().map().filter()延展函数的具体实现方式以及使用方式.我们在之前的博客中已经聊过,Signal的主要功能是位于SignalProtocol的协议延展中的, ...
- 关于单元测试的思考--Asp.Net Core单元测试最佳实践
在我们码字过程中,单元测试是必不可少的.但在从业过程中,很多开发者却对单元测试望而却步.有些时候并不是不想写,而是常常会碰到下面这些问题,让开发者放下了码字的脚步: 这个类初始数据太麻烦,你看:new ...
- 免费申请使用IBM Cloud Lite(轻量套餐) 续
之前尝试申请了IBM的轻量套餐,过程很简单,操作起来也比较方便,就是能够用到的地方不多,虽说几乎是无限流量且永久免费,我能做的也只是做个小网站 免费用户默认的是轻量应用服务,如果需要功能更多更全的应用 ...
- EL表达式 if 和 if else语句的写法
JavaScript的if else大家都不会陌生,但可能很多小伙伴并不知道在jsp文件里,el表达式的if else是怎么写的,下面安利给各位小伙伴 el表达式 if 代码示例 <c:if t ...
- 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识
什么是REST REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络资源是如何定义和寻址的. ...