MSSQL Join的使用

假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

id name             id  name
-- ----             --  ----
1  Pirate           1   Rutabaga
2  Monkey           2   Pirate
3  Ninja            3   Darth Vader
4  Spaghetti        4   Ninja

1、内联合(inner join)只生成同时匹配表A和表B的记录集。结果如下:

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

2、全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。结果如下: 

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

3、左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。结果如下:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。结果如下:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

4、右外联合(right outer join)生成表B的所有记录,包括在表A里匹配的记录。如果没有匹配的,左边将是null。结果如下:

SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.name = TableB.name

id     name     id    name
--    ----       --    ----
null   null        1    Rutabaga
1      Pirate     2    Pirate
null   null        3    Darth Vader
3      Ninja      4    Ninja

5、为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。结果如下:

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

6、还有一种笛卡尔积或者交叉联合(cross join),这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。

下表显示每种外部联接(outer join)匹配时保留数据行的情况:


联接类型


保留数据行


A left outer join B


all A rows


A right outer join B


all B rows


A full outer join B


all A and B rows

  

  

  

  

 

时间: 2024-10-24 10:29:11

MSSQL Join的使用的相关文章

数据批量插入MSSQL

MSSQL数据批量插入优化详细 序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探讨. 压测mvc的http接口看下数据 首先说下这里只是做个参照,来理解插入数据库的性能状况,与开篇的需求无半毛钱关系. mvc接口代码如下: public bool Add(CustomerFeedbackEntity m) { using (var conn=Co

MSSQL 基础知识002

---启用sa账号 1. 先使用一个windows账号登陆. 2.在数据库实例上面右键,属性,安全性,登录名,sa. 右键,属性. 常规,修改sa的密码. 状态,启用sa账号. 主键的作用: 1.唯一标识表中的一条记录. 选择什么样的列作为主键: 1.没有重复的列. 2.不能为空(null)的列. 3.选择比较稳定的列.(列不经常发生变化的),主键中的值一般不修改. 4.选择那些比较“小”的列.(列的数据类型所占用的字节数小). 5.尽量选择那些没有实际意义的列作为主键(逻辑主键 不建议选择那些

MSSQL 详解SQL Server连接(内连接、外连接、交叉连接)

在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 知道了连接查询的概念之后,什么时候用连接查询呢? 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表(T_student)和班级表(T_class) 1 --创建DB 2 --filename修改为自己电脑上MSSQL存储的位置

【51CTO/BBS】请教: SQL里有没有字符串组合Join的函数??

[51CTO/BBS]请教: SQL里有没有字符串组合Join的函数?? 原帖地址:http://bbs.51cto.com/thread-1133863-1.html 问题描述: VB 中有两个非常好用的字符串处理函数: Split(字符串,分隔符)作用:将[字符串]以[分隔符]作为边界,分解成数组. 返回:一个字符串数组. Join(字符数组,分隔符)作用:将[字符数组]中的元素,以[分隔符]作为边界,连接成一个字符串.返回:一个字符串. 请教老师们,SQL里是否有类似的函数? 解决方案:

【转】MSSQL获取指定表的列名信息,描述,数据类型,长度

/* --作用:根据特定的表名查询出字段,以及描述,数据类型,长度,精度,是否自增,是否为空等信息 --作者:wonder QQ:37036846 QQ群:.NET顶级精英群 ID:124766907 --时间:2011-03-23 11:25 --描述:创建存储过程 --参数:@tableName 表名 */ CREATE PROC sp_GetListsColumnInfoByTableName( @tableName nvarchar(255)) AS BEGIN SELECT CASE

mssql Row_Number() 分页 DISTINCT 问题

转载原文地址http://www.cnblogs.com/pumaboyd/archive/2008/04/20/1162376.html 这周碰到了很多奇怪的问题,有些是莫名的低级错误,有些这是一直以来未发现的错误.其中这个RowNumber()这个问题就是这样. 敬德兄写的底层负责自动生成T-SQL.当我需求对数据DISTINCT的时候就发现RowNuber() 和DISTINCT是有冲突的. WITH ListOrder AS(SELECT DISTINCT A.*,ROW_NUMBER(

MSSQL 常见故障处理

MSSQL 常见故障处理以及维护办法1.数据库文件收缩1.1 释放未使用的空间1.2 在释放未使用的空间前重新组织页1.3 将指定文件中的所有数据迁移到同一文件组中的其他文件2.日志文件收缩2.1 设置简单模式直接收缩3.Sql Agent作业代理3.1 错误日志相关3.1.1 循环生成错误日志4.AlwaysOn问题相关4.1 备份以及日志收缩问题4.2 Error: 35285, Severity: 16, State: 15.数据库登录/启动问题5.1 数据库处于可疑状态5.2 客户端登录

2014-07-24 MSSQL数据库分离及获取存放地址

我们的系统,是支持同一台机器上安装多套的. 安装方法就是鼠标右键“复制”.“粘贴”(启动时会自动附加目录下的.mdf). 有的人安装多套以后,想要删除某一套的时候,为了省事儿就自作聪明的鼠标右键“删除”. 这样一来,MSSQL里的数据库就乱了,客户就会打电话过来囧. 我们一没实施,二没客服,就老程序员和我两个程序员...... 所以我要做一个清理数据库的小工具,处理被客户搞乱的数据库: 首先,通过数据库名称找出所有我们系统的数据库. 然后,遍历每个数据库,分成可以连接的和不可以连接的两种. 最后

mssql数据库分页查询效率的一次体会

这几天在一个项目,合同管理系统(是对老系统的升级和改造,老系统是VS2008做的),由于数据库的表是项目组根据老系统的数据库建的,所以在查询的适合我就需要自己创建视图来完成多表的查询,起初我是读取项目组成员建好的视图,里面有7张表,其中还包含视图,由于视图中join视图是不支持索引的,所以在查询第一页的时候(每一页20条数据,总共数据量是10W条左右),耗时800毫秒,但是 当row_number达到上千的时候,基本查询要6秒以上,每点击下一页,耗时会增加十几毫秒,到40000条也就是中间的时候