第四章 MySQL高级查询(二)

一.EXISTS子查询

在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false。除此之外,exists也可以作为where语句的子查询,语法如下:

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

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

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

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

WHERE EXISTS(

         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;

二.NOT EXISTS子查询

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

例:检查Logic Java课程最近的一次考试,如果全部没有通过考试(60分及格线),则认为考试偏难,计算该次考试的平均分+5.

分析:所有人都没有通过考试,则“不存在成绩大于60的学生”,可以采用NOT  EXISTS检测。

SELECT AVG(studentresult)+5 AS 平均分 FROM resulf

WHERE NOT EXISTS(

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')

)

三.子查询的注意事项

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

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

A)如果子查询结果为单行单列,则可以不用指定列的别名。

B) 如果子查询结果为多行多列,必须为表指定别名。

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

常见错误: SELECT * FROM (SELECT *  FROM  ‘表名’);错误

这个子查询的错误在于主查询语句的FROM子句是一个子查询语句,返回的是大于单行单列的数据,应该为子查询结果集指定别名。正确的代码如下:

语法:      SELECT * FROM (SELECT * FROM `表名`) AS TEMP(别名);

第四章 MySQL高级查询(二)的更多相关文章

  1. accp8.0转换教材第4章MySQL高级查询(二)理解与练习

    知识点:EXISTS子查询.NOT EXISTS子查询.分页查询.UNION联合查询 一.单词部分 ①exist存在②temp临时的③district区域 ④content内容⑤temporary暂时 ...

  2. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...

  3. accp8.0转换教材第3章MySQL高级查询(一)理解与练习

    一.单词部分 ①constraint约束②foreign外键③references参考 ④subquery子查询⑤inner内部的⑥join连接 二.预习部分 1.修改表SQL语句的关键字是什么 RE ...

  4. MySQL高级查询(二)

    EXISTS 和NOT EXISTS子查询 EXISTS子查询 语法:   SELECT ……… FROM 表名 WHERE EXISTS (子查询); 例: SELECT `studentNo` A ...

  5. mysql 高级查询二

    各种showshow columns from my_student;show grants for root;show aviables;show processlist;show table st ...

  6. MySQL高级查询与编程笔记 • 【目录】

    章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...

  7. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  8. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  9. 第09章 MySQL子查询

    第09章 MySQL子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入. SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要 ...

随机推荐

  1. nrm的安装 、定义和用法

    因为npm包管理工具是属于国外的,所以在中国使用它下载东西的时候比较慢.这时我们就想用国内的淘宝镜像.也有别的,所以当你想切换下载源的时候就会用到nrm了. ###首先,nrm是什么呢? 开发的npm ...

  2. mysql中int(10)与int(11)有什么区别吗?

    先来看下面的图片 声明字段是int类型的那一刻起,int就是占四个字节,一个字节8位,也就是4*8=32,可以表示的数字个数是2的32次方(2^32 = 4 294 967 296个数字). 4 29 ...

  3. 九度OJ 1016 火星A + B 未AC版,整型存储不下

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  4. 201521123063 《Java程序设计》 第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 类设计 一般在设计类的时候,要考虑这些类是否有共性,还要考虑其独特性,使共同的父类拥有这些共性 ...

  5. 201521123022 《Java程序设计》 第四周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2. 使用常规方法总结其他上课内容. ①instenceof运算符:可通过它判断父类引用对象实例的实际类型,且在父类转化成子类时 ...

  6. 201521123074 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现 ...

  7. Java课程设计 201521123078

    计时器 掌握java图形界面操作以及多线程技术. 1.Mythread1 写一个类Mythread1实现Runnable,当需要开一个线程时就是用这个类.其中的run()通过标记flag和循环实现时间 ...

  8. 201521123014 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  9. 多线程面试题系列(2): CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  10. response对象的使用

    使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面.重定向操作支持将地址重定向到不同的主机上,这一点与转发是不同的.在客户端浏览器上将会得到跳转地址,并重新发送 ...