第四章 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. 微信小程序简单入门理解

    简单的小程序示例结构: (一):理解小程序结构app.js,app.json,app.wxss ①app.js,app.json是小程序结构必要的部分,app.wxss可选择 ②app.js用于创建小 ...

  2. 【Alpha】——First scrum Meeting

    一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 · 李永豪 编写测试计划 学习JAVA编程及UI设计 · 郑靖涛 Alpha任务分配计划 学习JAVA编程及UI设 ...

  3. 201521123109《java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

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

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. (1)多线程的冲突 当我们不想一种资源被同时使用,导致最后结果不一致,解决方法: 使用synchronized标记 ...

  5. SQL数据库基础知识-巩固篇<一>

    SQL数据库基础知识-巩固篇<一>... =============== 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用 ...

  6. 从GO内存模型与调用协议理解defer closure的坑

    资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...

  7. SQLite中Cursor类的说明

    在Android 查询数据是通过Cursor 类来实现的.当我们使用 SQLiteDatabase.query()方法时,就会得到Cursor对象, Cursor所指向的就是每一条数据. Cursor ...

  8. YYHS-NOIP2017Training0928-ZCC loves Isaac

    题目描述 [背景]ZCC又在打Isaac.这次他打通了宝箱关进入了表箱关.[题目描述]表箱关有一个房间非常可怕,它由n个变异天启组成.每个天启都会在进入房间后吐出绿弹并炸向某一个位置且范围内只有一个天 ...

  9. UI自动化测试简介及Selenium工具的介绍和环境搭建

    自动化测试简介 1.1何为自动化测试? 是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程.换言之,就是以程序实现的方式来代替手工测试. 1.2自动化测试分类 分为功能自动化测 ...

  10. vue学习之父组件与子组件之间的交互

    1.父组件数据传给子组件 父组件中的msgfather定义数据 在之组件中通过设置props来取得希望从父组件中获得的值 通过设置这两个属性就可以从父组件传数据到子组件 2.子组件传数据给父组件(这里 ...