组合查询:


7.1使用子查询:

  嵌套在其他查询中的查询,我们称之为子查询。子查询本身也可能包含一个子查询。子查询也称为内部查询,而包含子查询的语句也称为外部查询。

  所有的子查询可以被分为两个类别:子查询和非相关子查询。

  • 非相关子查询是独立于外部查询的子查询。子查询总共执行一次,执行完毕后将值传递给外部查询。
  • 相关子查询的执行依赖于外部查询的数据,外部查询返回一行,子查询就执行一次。
  1. 子查询作为计算列:子查询的一个最简单的形式就是内部查询为外部查询的每行返回一个单值结果,他通常作为一个结果插入到一个计算列。select columnA ,(子查询)AS columnB from 表名;
  2. 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;
  3. 返回多个结果的子查询:当子查询返回多行时,我们可以用in关键字来解决上面出现的问题。select 列A,列B from table1 where 列C in (select 列D from table2);这种做法用起来相当复杂,实际上我们可以使用更简单的语法来执行得到同样的结果,就是使用多表联接join查询。当然子查询不仅仅是在select中使用,在其他的修改、删除、插入中也能使用子查询。
  4. 在子查询中使用运算符:上面我们学了使用子查询与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;

  使用这些运算符的通用规则是:从一个表中获取的数据必须是和其他表中的数据具有相同的列数目,同时两个表中相对应的列必须是具有相同的数据类型或者至少两个数据类型之间必须存在可能的隐性数据转化,或者提供了显示转换。所以,这些运算符是被设计用来组合有相同结构的不同数据的多个表的内容,而从不同结构的组合数据则要用到变链接技术。

  1.   使用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},排除重复的数,显示不重复的数据并且连重复出现的数据都抹掉。

  

数据库知识整理<七>的更多相关文章

  1. 数据库知识整理<六>

    聚合函数与分组 6.1使用聚合函数进行数据统计: 聚合函数常见的有以下几种: count:返回该结果集中行的数目. sum:返回结果集中所有值的总和. avg:返回结果集中所有值的平均值. max:返 ...

  2. 数据库知识整理<一>

    关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...

  3. 数据库知识整理<八>

    联接: 8.1理解简单的单联接: 基本上联接的结果是每个集合的笛卡尔积.例如:两个集合{a,b,c}和{a,b}的笛卡尔积是如下的成对集合:{(a,a),(a,b),(b,a),(b,b),(c,a) ...

  4. 数据库知识整理<五>

    简单的数据查询: 5.1查询的基本结构: Sql语句:select [distinct] (* | column [alias],...) from table [where condition] [ ...

  5. 数据库知识整理<二>

    又继续写的博客,希望自己能坚持每天写博客.分享自己的点滴,对自己成长有帮助.今天下午高强度打了三个小时篮球,小腿都抽筋了.很爽,失落的心情似乎变得开明了一些.想到了一句话:“像SB式的坚持总会有好的收 ...

  6. 数据库知识整理<三>

    保证数据的完整性: 3.1数据完整性概述: 数据完整性的意义:我们知道数据库能防止储存垃圾数据,RDBMS实现该功能主要是通过维护数据完整性来实现的.根据数据完整性实施方法我们将其分为四类:实体完整性 ...

  7. 数据库知识整理<四>

    使用DML语句更改数据: 所谓DML语句是指数据库操作语句,其中包括的是对数据库数据的修改.删除.插入. 4.1添加新数据: 插入单行的记录:基本的SQL语句为-insert into <表明& ...

  8. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  9. MySQL 索引知识整理(创建高性能的索引)

    前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...

随机推荐

  1. js实现判断浏览器版本

    //判断浏览器版本是否过低 var ua = navigator.userAgent.toLowerCase(); if (window.ActiveXObject) var IEversion = ...

  2. maven安装(linux)

    1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令: 2.进入下载文件夹,找到下载的文件,运 ...

  3. (1)as_view() (2)在urls.py里面出现的pk是怎么回事 (3)RetrieveAPIView表示什么

    下面的代码都是我从github上下载的源码中摘取的django: https://github.com/django/django 下载命令: git clone https://github.com ...

  4. 修改Django的默认打印时间

    环境 Django版本:1.10 前言 默认情况下,Django会把日期按照“月份 天数, 年”的格式打印,比如2003年2月4日会打印成“Feb. 4, 2003”,这种格式对于西方人来说很好看,但 ...

  5. 通过微信企业号发送zabbix报警

    采用微信报警时,管理员账户中必须要设置"示警媒体"一项,"收件人"一项可随便填写一下.其它成员则可以不用添加设置. ---------------------- ...

  6. [Tomcat 源码分析系列] (附件) : catalina.bat 脚本

    摘自 apache-tomcat-8.0.39-src 源码包中的 catalina.bat 脚本内容 @echo off rem Licensed to the Apache Software Fo ...

  7. c++学习笔记——字面值常量类

    字面值常量类:数据成员都是字面值类型的聚合类是字面值常量类.如果一个类不是聚合类,但是它符合一下要求,则它也是个字面值常量类: 1.数据成员都必须是字面值类型. 2.类必须至少含有一个constexp ...

  8. 深入理解js——一切都是对象

    "一切皆对象" 当然也不是所有的都是对象,值类型(undefined,number,string,boolean)就不是对象:而函数.对象.数组.null.new Number(1 ...

  9. swift 批量 取出中间文本

    func stringmid_pl (wholestring:String,front:String,behind:String,inout return_string:String,getheroi ...

  10. HTML DOM appendChild() 方法

    <!DOCTYPE html> <html> <body> <ul id="myList"> <li>Coffee< ...