数据库知识整理<七>
组合查询:
7.1使用子查询:
嵌套在其他查询中的查询,我们称之为子查询。子查询本身也可能包含一个子查询。子查询也称为内部查询,而包含子查询的语句也称为外部查询。
所有的子查询可以被分为两个类别:子查询和非相关子查询。
- 非相关子查询是独立于外部查询的子查询。子查询总共执行一次,执行完毕后将值传递给外部查询。
- 相关子查询的执行依赖于外部查询的数据,外部查询返回一行,子查询就执行一次。
- 子查询作为计算列:子查询的一个最简单的形式就是内部查询为外部查询的每行返回一个单值结果,他通常作为一个结果插入到一个计算列。select columnA ,(子查询)AS columnB from 表名;
- where子句中的子查询:select columnA from TableA where columnB = (子查询);比如在实际中:select examId,studentOn from exam where studentOn <= (select studentOn from exam where examId = 5) order by studentOn desc;
- 返回多个结果的子查询:当子查询返回多行时,我们可以用in关键字来解决上面出现的问题。select 列A,列B from table1 where 列C in (select 列D from table2);这种做法用起来相当复杂,实际上我们可以使用更简单的语法来执行得到同样的结果,就是使用多表联接join查询。当然子查询不仅仅是在select中使用,在其他的修改、删除、插入中也能使用子查询。
- 在子查询中使用运算符:上面我们学了使用子查询与in运算符来查找字段属于某一组值的行。当然除了in以外还可以使用exists、all、any(或者some。二者是同义词)等运算符。
- 其中exists(翻译为:‘存在’)用来测试子查询是否返回任何结果(不只是特定的结果):exists运算符允许我们查找满足特定条件的行。后面总是跟着一个子查询,只要子查询返回了行,exists的值就为真。比如:查询任何一次考试中分数低于40的学生姓名和id。select Id,Name from student s where exists (select Id from studentExam se where mark <40 and e.Id = es.Id);
- all测试子查询结果集的所有行是满足指定条件:all 运算符与子查询和比较运算符一起使用。如果子查询返回的所有值都满足比较运算,那么比较表达式就为真。如果不是所有值都满足比较运算或子查询没有给外部语句返回行,则返回假。如基本语法:select 列A from 表A where 列A > All (select 列B from 表B);实例:查找出enrollment表中总成绩大于同一个学生的最高考试分数的所有行。select Id,grade from enrollment e where grade > All (select mark from studentExam s where e.Id = s.Id);
- any测试子查询的结果集是否有一行或多行满足指定的条件:any 与 All 的工作方式大体相同,不同的地方在于:在子查询返回值中,只要满足比较运算,那么比较表达式就为真。如果所有值都不满足,则返回假。基本语法:select 列A from 表A where 列A > any (select 列B from 表B);这个查询的意思就是说,从表A中返回列A的值大于表中列B的任何一个值的所在行。也即是说返回比列B中最小值大的行。实例:查询出学生的考分和他们总成绩之间的差异。select Id,grade from enrollment e where grade < any(select mark/2 from studentExam s where e.Id = s.Id);
7.2组合查询数据:
如果我们需要使用多个表中的数据,然后将所有的这些数据或者数据子集组合成一个结果集返回,那么SQL提供了几种运算符允许我们组合多个SQL查询来实现这个用途。这些运算符分别是:union、unionall、intersect、difference。
使用这些的语法如:select 列A,列B from 表A <operator> select 列C,列D from 表B;
使用这些运算符的通用规则是:从一个表中获取的数据必须是和其他表中的数据具有相同的列数目,同时两个表中相对应的列必须是具有相同的数据类型或者至少两个数据类型之间必须存在可能的隐性数据转化,或者提供了显示转换。所以,这些运算符是被设计用来组合有相同结构的不同数据的多个表的内容,而从不同结构的组合数据则要用到变链接技术。
- 使用union运算符:select 列A,列B from 表A union select 列C,列D from 表B;通常union的结果集列名与union运算符中第一个select语句的结果集的列名相同。另一个select语句的结果集列名将被忽略。实际的例子中:比如查询从与某节课相关的professor表和student表中抽取姓名。Sql语句是:
select name,'教授' as role from professor where pId = (select pId from class where cId = 1) union select name,'学生' from student where sId in (select sId from enrollment where cId = 1);
使用union的意义就好比:{1,2,3,4} union {3,4,5,6};结果是:{1,2,3,4,5,6}
2. 保留重复行:SQL不管集合理论的通常规则,使用union all 运算符返回每个数据集的所有成员。而不考虑重复。
如:select 列A,列B from 表A union all select 列C,列D from 表B;如:{1,2,3,4} union all {3,4,5,6};最终的结果是:{1,2,3,4,3,4,5,6}
3. 理解交集和差分:最后的两个只能被oracle支持了。intersect运算符允许仅返回在两个查询都出现的行。如:{1234} intersect {3456} 结果是:{34}。difference 在oracle中使用minus ,此运算符允许返回在一个查询中出现但是不在另一个查询中出现的行。如:{1234} except(or minus){3456};结果是:{1256},排除重复的数,显示不重复的数据并且连重复出现的数据都抹掉。
数据库知识整理<七>的更多相关文章
- 数据库知识整理<六>
聚合函数与分组 6.1使用聚合函数进行数据统计: 聚合函数常见的有以下几种: count:返回该结果集中行的数目. sum:返回结果集中所有值的总和. avg:返回结果集中所有值的平均值. max:返 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 数据库知识整理<八>
联接: 8.1理解简单的单联接: 基本上联接的结果是每个集合的笛卡尔积.例如:两个集合{a,b,c}和{a,b}的笛卡尔积是如下的成对集合:{(a,a),(a,b),(b,a),(b,b),(c,a) ...
- 数据库知识整理<五>
简单的数据查询: 5.1查询的基本结构: Sql语句:select [distinct] (* | column [alias],...) from table [where condition] [ ...
- 数据库知识整理<二>
又继续写的博客,希望自己能坚持每天写博客.分享自己的点滴,对自己成长有帮助.今天下午高强度打了三个小时篮球,小腿都抽筋了.很爽,失落的心情似乎变得开明了一些.想到了一句话:“像SB式的坚持总会有好的收 ...
- 数据库知识整理<三>
保证数据的完整性: 3.1数据完整性概述: 数据完整性的意义:我们知道数据库能防止储存垃圾数据,RDBMS实现该功能主要是通过维护数据完整性来实现的.根据数据完整性实施方法我们将其分为四类:实体完整性 ...
- 数据库知识整理<四>
使用DML语句更改数据: 所谓DML语句是指数据库操作语句,其中包括的是对数据库数据的修改.删除.插入. 4.1添加新数据: 插入单行的记录:基本的SQL语句为-insert into <表明& ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
- MySQL 索引知识整理(创建高性能的索引)
前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...
随机推荐
- EMR,电子病历(Electronic Medical Record)
电子病历 电子病历(EMR,Electronic Medical Record),也叫计算机化的病案系统或称基于计算机的病人记录(CPR,Computer-Based Patient Record). ...
- modelsim(1) - 安装和使用 心得
最近一段时间使用modelsim, 一,安装 使用的时候,出现license验证不对. 由于经常换虚拟机,要注意首先MAC地址是否换了,如果换了,license要重新做! 其次/etc/hosts的I ...
- QuerySet转化为JSON
import json data = json.dumps(list(my_table.objects.all().values())) return HttpResponse(data)
- django中的静态文件管理
一个站点通常需要保存额外的文件,比如图片 css样式文件 js脚本文件 ,在django中,倾向于将这些文件称为 静态文件.django提供了django.contrib.staticfile ...
- 【转载】H264--2--语法及结构
名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片: 每个图象中,若干宏块被排列成片的形式.片分为 ...
- [原创]Spring MVC 学习 之 - URL参数传递
原文参考地址: http://www.cnblogs.com/rhythmK/p/3971191.html 目的和缘由: 本人想做一个分享的页面,分析给朋友注册,注册按分享ID进行级联; 过程: 很多 ...
- Android之ADB指令
Android打包过程 aapt Android应用打包工具 adb Android调试桥 下面打包过程,eclipse帮我们自动打包好run as->Android application r ...
- Dx unsupported class file version 52.0
最近用ADT时遇到这个bug,折腾了好几天. 报错信息: Dx unsupported class file version 52.0 Conversion to Dalvik format fail ...
- php设计模式学习之观察者模式
什么都不说,先看代码: interface userOperateImpl { public function operate($username); } class userLoginLog imp ...
- HTTP协议-引自孤傲苍狼博客
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...