SQL中的left join right join_MsSql

以下是它们的共同点:
1. 关于左右表的概念。左表指的是在SQL语句中排在left join左边的表,右表指的是排在left join右边的表。
2. 在拼成的大表中,左表排在左边,右表排在右边。
3. on条件语句最好用=号对两表相应的主外键进行连接。当然,也可以用其他操作符,如>, <, 来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定。如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的!
4. on条件语句不能省略。
5. 可以连锁使用join,每次使用join都令另一表与当前的表或连接的结果相连接。
在下文中,用到了两个表,"部门"表与"组织"表,其中,"部门"表有一名为"组织编号"的外键,指向"组织"表中的主键"编号"。
inner join
格式:select * from 部门 inner join 组织 on 部门.组织编号 = 组织.编号
目的:将两表中符合on条件的所有记录都找出来。
规律:
1. 拼出的大表记录不会增加。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过=号将主外键进行连接,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。
备注:inner join 是默认的连接方式,可缩写为join。
转化为where子句:
select * from 部门, 组织 where 部门.组织编号 = 组织.编号
left outter join
格式: select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
格式: select * from 组织 left join 部门 on 组织.编号 = 部门.组织编号
目的:将左表的所有记录列出,右表中只要符合on条件的,与左表记录相拼合,不符合条件的,填以null值。
规律:
1. 选出所有符合条件的左表,如果左边与右表的关系是一对一的关系,则拼成的大表记录不会改变。
如果左边与右表的关系是多对一的关系,则拼成的大表记录也不会改变。
如果左边与右表的关系是一对多的关系,则拼成的大表记录会增加。对于每一具有一对多关系的左表记录,如果左表1:N与右表对应,那么会多出N-1条记录。例如,如果左表第一条记录1:3对应于右表,多出2条记录。如果左表第二条记录1:2对应于右表,则再多出1条记录。这样,总共多出3条记录。其他类推。
2. 如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
3. 如果左边与右表的关系是一对多的关系,对于左表任一记录,如果右表没有记录与其相对应,则全部填以null值。
典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。
备注:left outter join可用left join代替。在有些数据库中,如HSqlDb, 只能使用left join而不能使用left outter join。
转化为where子句:
select * from 部门, 组织 where 部门.组织编号 = 组织.编号
right outter join
格式: select * from 部门 right join 组织 on 部门.组织编号 = 组织.编号
格式: select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号
目的:将右表的所有记录列出,左表中只要符合on条件的,与右表记录相拼合,不符合条件的,填以null值。
规律:(与left outter join相反)
典型应用:可转化成left outter join。例如
select * from 组织 right join 部门 on 部门.组织编号 = 组织.编号

select * from 部门 left join 组织 on 部门.组织编号 = 组织.编号
的效果一样

时间: 2024-12-22 18:22:42

SQL中的left join right join_MsSql的相关文章

跪求高手赐教,两个数据库两个表怎样象SQL中做Left join关联然后在datagrid中输出!!!!

问题描述 目前有两个数据库,一个ORACLE一个sqlserver,想比较两个数据库中两张表的差异,并把结果输出到datagrid,能不能实现象在SQL中LEFTJOIN那样的效果进行关联?(DTS做起来效率太低)DATASETDATATABLE可以实现这样的效果吗?查阅了很多资料和MSDN,都没找到答案,求高手赐教!!!最好是有思路和代码,谢谢!!! 解决方案 解决方案二:关注-解决方案三:明确的告诉你不行!解决方案四:呜呜....连变通的方法也没有吗?解决方案五:比较两个数据库中两张表的差异

如何在Linq to sql中进行left join

可以用 into 语法,配合 DefaultIfEmpty() 方法加载右侧表中的空值. 例子: var query = from r in db.Roles join sr in ( from ss in db.StaffInRoles where ss.StaffId == staffId select ss ) on r.Id equals sr.RoleId into x from y in x.DefaultIfEmpty() select new RoleInfo { RoleId

SQL中的left join right join

以下是它们的共同点: 1. 关于左右表的概念.左表指的是在SQL语句中排在left join左边的表,右表指的是排在left join右边的表. 2. 在拼成的大表中,左表排在左边,右表排在右边. 3. on条件语句最好用=号对两表相应的主外键进行连接.当然,也可以用其他操作符,如>, <, 来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定.如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的! 4. on条件语句

mongodb-spring data mongo使用@DBRef,怎么执行一个类似sql中的join操作

问题描述 spring data mongo使用@DBRef,怎么执行一个类似sql中的join操作 解决方案 假设我要获取title,name两个字段,我该如何操作?翻了很多资料没好方法,, 解决方案二: 我这么操作,会获得User的所有字段,怎么获取指定字段呢? 我的操作是下面这样: @Query(value="{}", fields="{'title':1, 'user':1}") List<Archive> search(); 结果: [{&qu

基于SQL中的数据查询语句汇总

以下是对SQL中的数据查询语句进行了汇总介绍,需要的朋友可以过来参考下   where条件表达式 --统计函数 复制代码 代码如下: Select count(1) from student; --like模糊查询 --统计班上姓张的人数 复制代码 代码如下: select count(*) from student where realName like '张%'; --统计班上张姓两个字的人数 复制代码 代码如下: select count(*) from student where rea

SQL优化器原理 - Join重排

这是ODPS有关SQL优化器原理的系列文章之一.我们会陆续推出SQL优化器有关优化规则和框架的其他文章.添加钉钉群"关系代数优化技术"(群号11719083)可以获取最新文章发布动态. 本文的目标是解释Join重排这个特性的基础概念和算法,如果想快速了解并在MaxCompute上使用这个特性,请直接跳到"总结". 简介 Join重排是经典的SQL优化问题.考虑3个表的自然连接 A ⋈ B ⋈ C ,在不影响最终结果集的前提下,可以改变连接的顺序为下列: A ⋈ C

sql中怎样在多表联合查询后的表中进行增删改操作,新手求大神详细讲解

问题描述 sql中怎样在多表联合查询后的表中进行增删改操作,新手求大神详细讲解 我在C#的winform的DataGridView中显示联合查询的结果,下面就是4张表的联合查询的语句,我需要在DataGridView显示的表中做删除操作,只需要知道删除的sql语句就行,用存储过程也好,级联删除也好,希望详细,我已经在这个问题上困扰很久了,万分感谢! 解决方案 在做C#桌面程序时,我们通常会遇到删除dataGridview中选中的一和或都多行数据,在网上查了好多方法,有些只能删除dataGridv

sql 中select语句问题

问题描述 sql 中select语句问题 求问:在做C#程序中,我sql查询语句: select InvtID,Descr ,User2, User2 from (SELECT Inventory.InvtID, Inventory.Descr, Inventory.User2,IA.User2 FROM Inventory LEFT OUTER JOIN InventoryAdg IA ON Inventory.InvtID=IA.InvtID )v 问题是我需要查询两张表的User2字段,可

sql中select查询的一个简单问题

问题描述 sql中select查询的一个简单问题 表A结构如下: 设备编号 预检日期 A01 2014-1-2 A02 2014-6-7 A01 2015-3-2 A02 2015-9-1 怎样写SQL语句会得到下面的结果集,注意,得到3列,表中原来两列 设备编号 2014预检日期 2015预检日期 A01 2014-1-2 2015-3-2 A02 2014-6-7 2015-9-1 各位大侠,困扰我一下午了.... 解决方案 这是SQL Server的写法. SELECT ISNULL(a1