1、        EXISTS和NOT EXISTS子查询:EXISTS关键字用来检测数数据库对象是否存在。

                 ★EXISTS和NOT EXISTS的结果只取决于是否有返回记录,不取决于这些记录的内容,

                     所以EXISTS或NOT EXISTS子查询后SELECT语句中的字段列表通常是无关紧要的。

     EXISTS子查询:

在执行CREATE或DROP语句前,可以使用EXISTS语句判断该数据库对象是否存在,返回值是true或false。

Eg:如果存在数据表temp,则先删除它,然后重新创建。

DROP TABLE IF EXISTS temp;

EXISTS也可以作为WHERE语句的子查询,

语法:

SELECT …… FROM 表名 WHERE EXISTS(子查询)

   ◆EXISTS关键字后面的参数是一个任意的子查询,如果该子查询有返回值,则EXISTS子查询的结果为true,此时在执行外层查询语句。

如果字查询没有返回行,则EXISTS子查询的结果为false,此时外层与不在执行查询。

Eg:检查Logic Java课程最近一次考试。如果有成绩达到80分以上者,则显示分数排在前5名学员的学号和分数

SELECT `studentNo` AS 学号,`studentResult` 成绩 FROM `result`

WHERE EXISTS (

      #查询Logic Java最后一次考试成绩大于80的记录

SELECT * FROM `result`  WHERE `subjectNo` = (

        SELECT `subjectNo` FROM `subject` WHERE `subjectName` = 'Logic Java'

      )  AND `examDate` = (

        SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo` = (    

          SELECT `subjectNo` FROM `subject`

          WHERE `subjectName` = 'Logic Java')

     ) AND `studentResult` > 80)

AND `subjectNo` = ( SELECT `subjectNo` FROM `subject`

WHERE `subjectName` = 'Logic Java') 

ORDER BY `studentResult` DESC LIMIT 5;  #按成绩降序排序,显示前5名

Eg

     NOT EXISTS子查询

EXISTS和IN一样,同样允许添加NOT关键字实现取反操作,NOT EXISTS表示不存在。

Eg:/*如果没有考试通过的学员,则平均分加5分*/

SELECT AVG(studentresult)+10 AS 平均分 FROM result

WHERE NOT EXISTS (

#查询Logic Java最后一次考试成绩小于60的记录

SELECT * FROM `result`  WHERE `subjectNo` = (

        SELECT `subjectNo` FROM `subject` WHERE `subjectName` = 'Logic Java'

     )  AND `examDate` = (

        SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo` = (   

          SELECT `subjectNo` FROM `subject`

          WHERE `subjectName` = 'Logic Java')

    ) AND `studentResult` > 60)

AND `subjectNo` = ( SELECT `subjectNo` FROM `subject`

WHERE `subjectName` = 'Logic Java')

AND `examDate` = (

     SELECT MAX(`examDate`) FROM `result` WHERE `subjectNo` = (   

        SELECT `subjectNo` FROM `subject`

        WHERE `subjectName` = 'Logic Java') );

2、        子查询注意事项:

1) 子查询语句可以嵌套在SQL与语句中任何表达式出现的位置:

在SELECT语句中,子查询可以被嵌套在SELECT语句的列、表和查询条件中,

即SELECT子句FROM子句、WHERE子句、GROUP BY子句和HAVING子句。

嵌套在SELECT语句的SELECT子句中的子查询语句如下。

语法:

SELECT (子查询) FROM 表名;

嵌套在SELECT语句的FROM子句中的子查询语句如下。

语法:

SELECT * FROM (子查询) AS 表的别名;

2)只出现在子查询中而没有出现在父查询中农的表不能包含在输出列表中

多层嵌套子查询的最终数据集值包含父查询(即最外层的查询)的SELECT子句中出现的字段,

子查询的输出结果通常会作为其外层子查询数据源或用于数据判断匹配。    

JAVA / MySql 编程—— 第四章 高级查询(二)的更多相关文章

  1. JAVA / MySql 编程—— 第三章 高级查询(一)

    1.        修改表: (1)修改表名语法: ALTER TABLE <旧表名> RENAME [ TO ] <新表名>: 注意:其中[TO]为可选参数,使用与否不影响结 ...

  2. JAVA / MySql 编程——第七章 JDBC

    1.JDBC:JDBA是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力:         ●Java是通过JDBC技术实现对各种数据 ...

  3. JAVA / MySql 编程——第五章 事务、视图、索引、备份和恢复

    1.事务(Transaction): 事务是将一系列数据操作绑成一个整体进行统一管理. 如果一事务执行成功,则咋子该事务中进行的所有数据更改均会提交,称为数据库中的永久成部分. 如果事务执行是遇到错误 ...

  4. JAVA / MySql 编程——第六章 Mysql 创建账户的相关命令

    1.        创建普通用户: 语法: CREATE USER `user`@`host` [IDENTIFIED 'password'];   //user:用户名,host:主机名,passw ...

  5. java面向对象编程——第四章 类和对象

    OO:面向对象 OOP:面向对象编程 OOA:面向对象分析 OOD:面向对象设计 结构化编程:从顶向下,将一个大问题分解成更小的任务,然后为每一个更小的任务编写一个过程.最后程序员会编写一个主过程来启 ...

  6. Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象

    1  参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...

  7. 《Java程序设计》第四章-认识对象

    20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...

  8. [Java并发编程(四)] Java volatile 的理论实践

    [Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...

  9. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

随机推荐

  1. Unicode汉字编码表以及参考源码分享

    1 Unicode编码表  Unicode只有一个字符集,中.日.韩的三种文字占用了Unicode中0x3000到0x9FFF的部分  Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个 ...

  2. Python第三方库使用感言

    Python第三方库使用的感言加使用笔记 一般来讲第三方库会提供大量的类与对象, 对象方法的返回值和库中函数的返回值一般不会是Python原始自带的对象, 而是由该第三方库提供的对象, 因为Pytho ...

  3. c++隐式类型转换和explicit

    什么是隐式转换? 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了哪些 ...

  4. css内容整理2

    10.6.css伪类.伪元素 伪类用于向某些选择器添加特殊效果:伪元素用于将特殊的效果添加达到某选择器. 区别:伪类的效果可通过添加一个实际的类达到,用::伪元素效果则需要添加一个实际的元素,用:: ...

  5. 使用InstallShield打包VS程序

    使用InstallShield打包VS程序 InstallShield是微软自己的一个打包工具,这个打包工具,有其优势也有其弊端.其优势,可以很好且方便地将.NET平台的控件以及程序所需要的dll打包 ...

  6. c++ 控制台输入参数

    #include <iostream>#include <string> using namespace std; int main(int argc,char **argv) ...

  7. 什么是css sprites,如何使用?

    css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片.背景图是否重复.背景图定位),显示图片,减轻服务器对图片的请求数量 优点: 1.减少网页的HTT ...

  8. 从零开始的全栈工程师——js篇(闭包)

    闭包是js中的一大特色,也是一大难点.简单来说,所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量. 闭包的三大特点为: 1.函数嵌套函数 2.内部函数可以访问外部函数的变量 3.参数和变量不会 ...

  9. Android实现异步的几种方法

    在Android项目中,有经验的开发人员都知道,一些耗时的IO操作等都必须在子线程中去操作,那么可以有哪些方法来开启子线程呢,一般可以使用Java中自带的几种方法,也可以使用Andorid特有的一些类 ...

  10. FinFET简介

    什么是FET? FET 的全名是“场效电晶体(Field Effect Transistor,FET)”,先从大家较耳熟能详的“MOS”来说明.MOS 的全名是“金属-氧化物-半导体场效电晶体(Met ...