JAVA / MySql 编程—— 第四章 高级查询(二)
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子句中出现的字段, 子查询的输出结果通常会作为其外层子查询数据源或用于数据判断匹配。 |