1 关系除法概念
首先,SQL运算其实就是集合的运算,大体也就是投影(select),筛选(where),分组(group by,分组后的聚合和having筛选我们统一划分到分组),集合的加(union,也可以叫集合
并运算
),减(not in,not exists,minus等,也叫结合
补预算
,差运算),乘(inner join、left join等各种连接,也可以归结到结合
交运算
),除(貌似没怎么弄过)。
那么问题来了,什么是关系除法,网上搜一下,概念解释有很多。本博客我们给除法运算下一个通俗的解释。我们看上面的不同集合的运算方法,
交并补
,都有了,还差一个子集运算,对,集合除法描述的问题就是子集运算,也就是包含关系。
严谨的关系除法(我自定义的严谨)有两种实现方式,
双重的not exists
(not in是否可行还请自行验证),和用
集合减法进行转换
。
2 环境准备
我们基于选课业务构造如下环境
数据脚本:
create table student(stu_name varchar2(20),subject_id varchar2(10));
create table subject(subject_id varchar2(10),subject_name varchar2(20),teacher varchar2(20));
insert into student values('狗蛋','M');
insert into student values('狗蛋','C');
insert into student values('狗蛋','P');
insert into student values('翠花','M');
insert into student values('翠花','C');
insert into student values('小红','M');
insert into subject values('M','数学','张老师');
insert into subject values('C','语文','张老师');
insert into subject values('M','数学','李老师');
insert into subject values('C','语文','李老师');
insert into subject values('P','物理','李老师');
insert into subject values('M','数学','孙老师');
insert into subject values('P','物理','孙老师');
commit;
3 SQL实现关系除法
3.1 SQL实现除法1
我们需要求
同时
选了数学和语文的学生姓名,即狗蛋和翠花。
这里的同时其实描述的就是包含关系,即,语文和数学包含在学生的选课项目里面。
select distinct st1.stu_name
from student st1
where not exists (select 1
from subject sj1 --
①
where sj1.SUBJECT_ID in ('M','C')
and not exists (select 1
from student st2
where st1.STU_NAME=st2.STU_NAME --
②
and sj1.SUBJECT_ID=st2.SUBJECT_ID )); --
③
可以看到执行计划是Filter嵌套Filter,性能好坏不能一概而论,只能说这种执行计划比较危险。
我们简单说一下运算方法(
辅助理解,和运算顺序无关
):
①处,我们先获得数学和语文的结果集;
②处,外层st1的学生姓名传给内层的st2学生姓名,获得学生选课的结果集
③处,①处取得的结果集和②处取得结果集用课程编号进行关联,此时,要求①处取得的结果集包含在②的结果集内,最外层的not exists才会返回数据。
上面的实现方式我感觉还是比较抽象的,我们现在先考虑用减运算改一下实现方式。
select distinct st1.stu_name
from student st1
where not exists (select sj1.SUBJECT_ID
from subject sj1
where sj1.SUBJECT_ID in ('M','C') --①
minus --③
select st2.SUBJECT_ID
from student st2
where st2.STU_NAME=st1.STU_NAME); --②
虽然少了一层Filter,性能貌似也没有好太多,还请大神在评论区留下更好的实现方法。
我们依然简单说一下运算方法,
还是辅助理解,与运算顺序无关。
①处,我们获得语文和数学的结果集;
②处,内层学生表和外层学生表用学生姓名关联,获得学生选课信息结果集
③处,①和②取得的结果集进行减法运算,如果无数据返回,外层查询返回数据。
相比之下,这种写法更好理解。
3.2 SQL实现除法2
需求加强一下,我们要求同时选了语文和数学的学生及同时能教语文和数学的老师。
同时选课+同时教课,不废话,上SQL。
with tmp1 as ( --
tmp1
求同时选课的学生
select st1.*
from student st1
where not exists (select 1
from subject sj1
where sj1.SUBJECT_ID in ('M','C')
and not exists (select 1
from student st2
where st1.STU_NAME=st2.STU_NAME
and sj1.SUBJECT_ID=st2.SUBJECT_ID )))
,tmp2 as ( --
tmp2
求同时教课的老师
select sj1.*
from subject sj1
where not exists (select 1
from subject sj2
where sj2.subject_id in ('M','C')
and not exists (select 1
from subject sj3
where sj1.TEACHER=sj3.TEACHER
and sj2.subject_id = sj3.subject_id)))
select distinct t1.STU_NAME,t2.TEACHER
from tmp1 t1
,tmp2 t2
where t1.SUBJECT_ID=t2.SUBJECT_ID;
仔细看,并不复杂,我们只是把同时选课和同时教课分别抽取了我with视图,如果有更好的写法,还请留言区评论。
LINQ 实战 .NET 2010
SQL
出版社:人民邮电出版社 ISBN:9787115208514
原价:65元 作者:(法)马格里,(美)艾歇特,(美)伍利 著,陈黎夫 译
出版日期:2009-8-1 字数:668000 页码:416
--------------------------------------------------------------------------------
作为.NET上连接编程语言和数据库、内存对象、XML等各种类型数据之间的桥梁,LINQ引入了一种处理数据的全新理念,将查询无缝集成至开发语言之上。本书第一部分介绍了LINQ技术及C#和VB为此提供的新语言特性,第二、三、四部分详细介绍了LINQ的三大主要功能LINQ to Objects、LINQ to
SQL
、LINQ to XML,第五部分研究了LINQ的可扩展性、在应用程序中使用各种LINQ功能的方法以及LINQ to DataSet。
本书适合于使用C#和VB.NET的软件开发者。
--------------------------------------------------------------------------------
微软MVP呕心沥血之作,LINQ圣经,深入全面,引人入胜,丰富实例,兼顾C#和VB.NET语言。
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。
——Matt Warren,微软主架构师,LINQ之父
LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!
——Patrick Smacchia,微软MVP,《C#和.NET 2.0 实战》作者
--------------------------------------------------------------------------------
第一部分 从这里开始
第1章 LINQ简介 2
1.1 LINQ是什么 2
1.1.1 概览 3
1.1.2 LINQ的功能 3
1.1.3 作为语言扩展的LINQ 4
1.2 为什么需要LINQ 6
1.2.1 常见问题 6
1.2.2 解决理念上的失调 8
1.2.3 LINQ给出解决方案 12
1.3 LINQ的设计目标及起源 13
1.3.1 LINQ项目的设计目标 13
1.3.2 一点历史 14
1.4 LINQ to Objects初步:查询内存中的集合 15
1.4.1 先决条件 15
1.4.2 Hello LINQ to Objects 17
1.5 LINQ to XML初步:查询XML文档 20
1.5.1 为什么需要LINQ to XML 20
1.5.2 Hello LINQ to XML 22
1.6 LINQ to
SQL
初步:查询
关系
型数据库 26
1.6.1 LINQ to
SQL
功能概览 26
1.6.2 Hello LINQ to
SQL
26
1.6.3 进一步了解LINQ to
SQL
30
1.7 小结 30
第2章 C#和VB语言的增强特性 31
2.1 新语言的增强特性一瞥 31
2.1.1 列出当前正在运行的所有进程 32
2.1.2 将返回结果封装成类 33
2.2 隐式类型局部变量 34
2.2.1 语法 35
2.2.2 使用隐式类型局部变量改进实例程序 35
2.3 对象和集合的初始化器 37
2.3.1 引入对象初始化器的动机 37
2.3.2 集合初始化器 38
2.3.3 用对象初始化器改进实例程序 39
2.4 Lambda表达式 40
2.4.1 委托回顾 40
2.4.2 匿名方法 42
2.4.3 Lambda表达式介绍 42
2.5 扩展方法 47
2.5.1 创建扩展方法的示例 47
2.5.2 更多使用LINQ标准查询操作符的例子 50
2.5.3 将扩展方法引入到实例程序中 51
2.5.4 注意事项 52
2.6 匿名类型 54
2.6.1 使用匿名类型组合数据 55
2.6.2 没有名字的类型也是类型 55
2.6.3 使用匿名类型改进实例程序 56
2.6.4 匿名类型的限制 57
2.7 小结 58
第3章 LINQ构建块 61
3.1 LINQ对.NET的扩展 61
3.1.1 语言扩展回顾 61
3.1.2 构成LINQ基础的核心元素 62
3.2 序列 63
3.2.1 IEnumerableT接口 63
3.2.2 迭代器回顾 64
3.2.3 延迟查询执行 66
3.3 查询操作符 69
3.3.1 查询操作符是什么 69
3.3.2 标准查询操作符 71
3.4 查询表达式 72
3.4.1 查询表达式是什么 72
3.4.2 编写查询表达式 73
3.4.3 标准查询操作符与查询表达式的
关系
75
3.4.4 限制 76
3.5 表达式树 78
3.5.1 Lambda表达式回顾 78
3.5.2 表达式树是什么 78
3.5.3 IQueryable,另一种
实现
延迟查询执行的方法 81
3.6 LINQ的程序集以及命名空间 81
3.7 小结 83
第二部分 查询内存中的对象
第4章 熟悉LINQ to Objects 86
4.1 实例程序简介 86
4.1.1 程序目标 86
4.1.2 程序功能 87
4.1.3 业务逻辑实体 87
4.1.4 数据库架构 87
4.1.5 示例数据 89
4.2 用LINQ操作内存中的集合 90
4.2.1 能够查询什么 90
4.2.2 支持的操作 94
4.3 在ASP.NET和Windows Forms中使用LINQ 95
4.3.1 Web应用程序中的数据绑定 95
4.3.2 Windows Forms应用程序中的数据绑定 100
4.4 常用的标准查询操作符 103
4.4.1 约束操作符Where 104
4.4.2 投影操作符 105
4.4.3 Distinct操作符 107
4.4.4 转换操作符 108
4.4.5 聚合操作符 109
4.5 用不同的方式显示内存中的集合 110
4.5.1 排序 110
4.5.2 嵌套查询 111
4.5.3 分组 113
4.5.4 使用连接 114
4.5.5 分区 117
4.6 小结 121
第5章 超越基本的内存数据查询 122
5.1 常见使用场景 122
5.1.1 查询非泛型集合 123
5.1.2 按照多个条件分组 125
5.1.3 动态查询 127
5.1.4 LINQ to Text Files 135
5.2 设计模式 137
5.2.1 函数式创建模式 138
5.2.2 ForEach模式 140
5.3 性能分析 142
5.3.1 选择恰当的流操作方式 142
5.3.2 当心立即执行 144
5.3.3 LINQ to Objects会降低代码的性能吗 146
5.3.4 使用LINQ to Objects的代价 149
5.3.5 性能和简洁:鱼和熊掌不可兼得吗 151
5.4 小结 152
第三部分 查询
关系
型数据
第6章 LINQ to
SQL
入门 156
6.1 走入LINQ to
SQL
157
6.1.1 创建对象映射 159
6.1.2 设定DataContext 161
6.2 通过LINQ to
SQL
读取数据 161
6.3 继续改进查询 165
6.3.1 过滤 165
6.3.2 排序和分组 167
6.3.3 聚集 168
6.3.4 连接 169
6.4 操作有层级
关系
的对象 171
6.5 数据加载的时机以及为何要关心这些 174
6.5.1 延迟加载 174
6.5.2 立即加载详细信息 175
6.6 更新数据 177
6.7 小结 179
第7章 揭开LINQ to
SQL
的本质 180
7.1 对象与
关系
数据的映射 180
7.1.1 通过在类中添加属性 181
7.1.2 使用外部XML文件
实现
映射 185
7.1.3 使用
Sql
Metal工具 186
7.1.4 LINQ to
SQL
设计器 188
7.2 将查询表达式转换为
SQL
190
7.2.1 IQueryable接口 190
7.2.2 表达式树 191
7.3 业务实体的生命周期 193
7.3.1 跟踪变化 195
7.3.2 提交变化 196
7.3.3 操作离线数据 198
7.4 小结 200
第8章 LINQ to
SQL
高级特性 201
8.1 处理并发修改 201
8.1.1 悲观式并发 201
8.1.2 乐观式并发 202
8.1.3 处理并发异常 204
8.1.4 使用事务解决冲突 207
8.2 高级的数据库功能 208
8.2.1 使用
SQL
语句直接得到结果对象 209
8.2.2 使用存储过程 210
8.2.3 用户自定义函数 217
8.3 改进业务逻辑层 220
8.3.1 预编译的查询 220
8.3.2 使用部分类
实现
自定义业务逻辑 221
8.3.3 使用部分方法 223
8.3.4 使用对象继承 225
8.4 LINQ to Entities简介 229
8.5 小结 231
第四部分 操作XML
第9章 LINQ to XML入门 234
9.1 什么是XML API 234
9.2 为什么需要另外一种XML编程API 235
9.3 LINQ to XML设计原则 236
9.3.1 核心概念:函数式创建 238
9.3.2 核心概念:上下文无关的XML创建过程 238
9.3.3 核心概念:简化了的名称 239
9.4 LINQ to XML中相关类的继承体系 241
9.5 在LINQ中操作XML 243
9.5.1 加载XML 243
9.5.2 解析XML 245
9.5.3 创建XML 246
9.5.4 使用Visual Basic XML字面量创建XML 249
9.5.5 创建XML文档 251
9.5.6 向XML中添加内容 254
9.5.7 从XML中移除内容 255
9.5.8 更新XML的内容 256
9.5.9 操作属性 258
9.5.10 保存XML 258
9.6 小结 259
第10章 使用LINQ to XML查询并转换XML 260
10.1 LINQ to XML轴方法 261
10.1.1 Element 262
10.1.2 Attribute 263
10.1.3 Elements 264
10.1.4 Descendants 264
10.1.5 Ancestors 267
10.1.6 ElementsAfterSelf、NodesAfterSelf、ElementsBeforeSelf和NodesBeforeSelf方法 268
10.1.7 Visual Basic的XML轴属性 269
10.2 标准查询操作符 271
10.2.1 使用Select进行投影 273
10.2.2 使用Where
实现
过滤 274
10.2.3 排序和分组 275
10.3 使用XPath查询LINQ to XML对象 278
10.4 转换XML 279
10.4.1 LINQ to XML转换 279
10.4.2 使用XSLT转换LINQ to XML对象 282
10.5 小结 284
第11章 LINQ to XML常见场景 285
11.1 根据XML构建对象 285
11.1.1 目标 286
11.1.2
实现
287
11.2 根据对象创建XML 290
11.2.1 目标 290
11.2.2
实现
291
11.3 根据数据库中的数据创建XML 295
11.3.1 目标 296
11.3.2
实现
297
11.4 过滤并混合从数据库以及XML中得到的数据 301
11.4.1 目标 302
11.4.2
实现
302
11.5 读取XML并更新数据库 306
11.5.1 目标 306
11.5.2
实现
307
11.6 将文本文件转换为XML 319
11.6.1 目标 319
11.6.2
实现
320
11.7 小结 322
第五部分 LINQ无处不在
第12章 扩展LINQ 324
12.1 探寻LINQ的扩展机制 324
12.1.1 LINQ各个特性是如何
实现
的 325
12.1.2 自定义LINQ扩展能够
实现
什么 326
12.2 创建自定义查询操作符 327
12.2.1 改进标准查询操作符 327
12.2.2 辅助或领域相关的查询操作符 330
12.3 基本查询操作符的自定义
实现
334
12.3.1 回顾查询翻译机制 334
12.3.2 查询表达式模式的规范 335
12.3.3 示例1:跟踪标准查询操作符的执行过程 337
12.3.4 限制:查询表达式冲突 338
12.3.5 示例2:非泛型的、领域相关的操作符 340
12.3.6 示例3:非序列的查询操作符 342
12.4 查询Web服务:LINQ to Amazon 343
12.4.1 LINQ to Amazon介绍 344
12.4.2 需求 345
12.4.3
实现
346
12.5 IQueryable和IQueryProvider:LINQ to Amazon高级版本 352
12.5.1 IQueryable和IQueryProvider接口 353
12.5.2
实现
356
12.5.3 究竟发生了什么 357
12.6 小结 358
第13章 应用程序各层中的LINQ 359
13.1 LinqBooks应用程序概览 359
13.1.1 功能 359
13.1.2 程序UI概览 360
13.1.3 数据模型 362
13.2 LINQ to
SQL
及数据访问层 362
13.2.1 回顾传统的三层架构 362
13.2.2 用专门的数据访问层还是LINQ to
SQL
364
13.2.3 LinqBooks中对LINQ to
SQL
的使用 368
13.3 LINQ to XML的使用 374
13.3.1 从Amazon中导入数据 374
13.3.2 生成RSS 376
13.4 LINQ to DataSet的使用 377
13.5 使用LINQ to Objects 380
13.6 可扩展性 380
13.6.1 自定义查询操作符 380
13.6.2 创建并使用自定义LINQ提供器 381
13.7 展望未来 381
13.7.1 自定义LINQ功能 382
13.7.2 LINQ to XSD:强类型的LINQ to XML 382
13.7.3 PLINQ:支持并行计算的LINQ 383
13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383
13.8 小结 384
第14章 使用LINQ操作DataSet 385
14.1 LINQ to DataSet概览 385
14.2 DataSet回顾 386
14.2.1 DataSet使用场景及功能 386
14.2.2 DataSet是什么 387
14.2.3 Visual Studio 2008和.NET 3.5为支持LINQ to DataSet进行的改进 389
14.3 查询弱类型DataSet 390
14.3.1 为DataSet加载数据 390
14.3.2 不使用LINQ查询DataSet 394
14.3.3 使用LINQ to DataSet查询弱类型DataSet 395
14.4 查询强类型DataSet 399
14.4.1 生成强类型的DataSet 400
14.4.2 为强类型DataSet加载数据 402
14.4.3 使用LINQ to DataSet查询强类型DataSet 404
14.5 将LINQ to DataSet查询结果绑定至UI控件 406
14.5.1 使用CopyToDataTable将LINQto DataSet查询结果复制到DataTable 406
14.5.2 使用AsDataView
实现
双向数据绑定 408
14.6 在LINQ to DataSet中使用查询操作符 410
14.6.1 用于DataRow的FieldT和SetFieldT操作符 410
14.6.2 集合操作符以及用DataRowComparer比较DataRow 411
14.7 小结 412
附录 标准查询操作符 414
--------------------------------------------------------------------------------
马格里(Fabrice Marguerie),微软C# MVP,资深.NET软件架构师,LINQ社区专家。
SQL
Server中的运算有并,交,差,笛卡尔积,除运算个人感觉除运算时最难理解算的
什么是除运算
定义:设
关系
R除以
关系
S结果为
关系
T,则T包含所有在R中但不在S中的属性及其值,并且T的元组与S的元组的所有组合都在R中
定义看不懂没
关系
,正常人都看不懂的,我们来举个简单的例子:
还没懂?那我们把X表再稍微改造一下
这样应该懂了吧
展开全部select case when 除数 =0 then 0 else 被除数/除数 end一. 基本概念
SQL
语言,是结构化查询语言(StructuredQueryLanguage)的简称。e69da5e6ba9062616964757a686964616f31333365633864
SQL
语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理
关系
数据库系统;同时也是数据...
在
sql
server中做
除法
处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,
sql
server会抛出 遇到以零作除数错误 的异常,我们总不希望把这个异常显示给用户吧。再利用isnull函数,我们就可以
实现
当@b=0的时候,结果返回1的需求了。OK,两种方法介绍完毕,相对于方法一,我更推荐大家使用方法二,因为方法二的代码更简省。这样写当然是正确的,但显的麻烦,下面我们看一下第二处理方法。其作用就是,当参数1等于null时,就返回参数2的值。isnull(参数1,参数2)
1.
除法运算
的定义:给定
关系
R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。R中Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算可以得到一个新的
关系
P(X),P是R中满足下列条件的元组在X 属性列上的投影: 元组在X上的分量值x的像集Y(x)包含S在Y上的投影的集合。2.求解步骤过程:第一步:找出
关系
R和
关系
S中相同的属性,即Y属性。在
关系
S中对Y做投影(即将Y列取出);第
SQL
Server中的运算有并,交,差,笛卡尔积,除运算,其中笛卡尔积是最费时间的。除运算个人感觉是最难理解的,所以,花了点时间整理以下除运算方便以后查。
例如,有以下R表,S表,T表
当我们计算R除以T时:(不区分大小写)
先找出R表中和T表相同的属性,这里是B和C。
也就是说R表中的其他属性A可以取值为{a,b,c}
其中, a的象集为{(b,c),(d,e)},b的象集为{(b...
关系
代数中
除法
的
SQL
实现
文章目录引言
关系
代数中的运算主要有选择、投影、连接(或者说乘法,即笛卡尔积)、
除法
,以及集合运算。其中,选择、投影、连接能直接用
SQL
表达,但
除法
和大部分集合运算不能。尤其是
除法
的缺失,使得涉及该操作的查询难以编写。本文将介绍用如何现有
SQL
实现
除法
,并分析困难产生的原因。
除法
笛卡尔积的逆
关系
除法
可以看作笛卡尔积的逆,即对于R÷SR\div SR÷S,其结果为所有满足T×...
感谢博主:http://www.cnblogs.com/wokofo/archive/2011/05/24/2055127.html
除法运算
的定义:
这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明
除法运算
的求解过程设有
关系
R、S 如图所示,求R÷S 的结果
求解步骤过程:
R÷S:列S中同属性Y(Y1,Y2...)-->列...
这次查寻过程如下:选取Course的第1个元组(1),与该学生95001结合,发现sc中存在(95001,1),即95001选了1号课,由于not exists ,故course第一个元组(1)排除了,不显示;按照上诉分析,对于95001这个学号,not exists(空集)=true。即95001选了全部课程,接下来循环遍历检查学号就可以得到全部要求的学号了。SC÷Course得到选了全部课程的学生学号=得到学号,该学生没有一门课没选。SC÷Course得到就是选了全部课程的学生学号,即95001.