EXISTS和 NOT EXISTS 子查询 (高级查询 二)

子查询:嵌入到另一个查询语句之中的查询语句

子查询注意事项:

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

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

-----学生表
DROP TABLE IF EXISTS student;
CREATE TABLE `student`(
`studentNo` INT(4) NOT NULL COMMENT ‘学号‘,
`loginPwd` VARCHAR(20) NOT NULL COMMENT ‘密码‘,
`studentName` VARCHAR(50) NOT NULL COMMENT ‘学生姓名‘,
`sex` CHAR(2) DEFAULT ‘男‘ NOT NULL COMMENT ‘性别‘,
`gradeId` INT(4) UNSIGNED COMMENT ‘年级编号‘,
`phone` VARCHAR(50) COMMENT ‘联系电话‘,
`address` VARCHAR(255) COMMENT ‘地址‘,
`bornDate` DATETIME COMMENT ‘出生时间‘,
`email` VARCHAR(50) COMMENT‘邮件账号‘,
identityCard VARCHAR(18) COMMENT‘身份证号码‘,
PRIMARY KEY(`studentNo`)
);

-----年级表
DROP TABLE IF EXISTS grade;
CREATE TABLE `grade`(
gradeID INT(4) NOT NULL COMMENT ‘年级编号‘,
gradeName VARCHAR(50) NOT NULL COMMENT‘年级名称‘
);

-----科目表
DROP TABLE IF EXISTS subject;
CREATE TABLE `subject`(
subjectNo INT(4) NOT NULL COMMENT ‘课程编号‘ PRIMARY KEY, #主键标识列 自增1
subjectName VARCHAR(50) COMMENT ‘课程名称‘,
classHour INT(4) COMMENT ‘学时‘,
gradeID INT(4) COMMENT ‘年级编号‘

);

-----成绩表
DROP TABLE IF EXISTS result;
CREATE TABLE `result`(
`studentNo` INT(4) NOT NULL COMMENT ‘学号‘,
`subjectNo` INT(4) NOT NULL COMMENT ‘课程编号‘,
`examDate` DATETIME NOT NULL COMMENT ‘考试日期‘,
`studentResult` INT(4) NOT NULL COMMENT ‘考试成绩‘
);

-----插入年级表
INSERT INTO `grade` VALUES (‘1‘, ‘S1‘);
INSERT INTO `grade` VALUES (‘2‘, ‘S2‘);
INSERT INTO `grade` VALUES (‘3‘, ‘Y2‘);

-----插入成绩表
INSERT INTO `result` VALUES (‘10000‘, ‘1‘, ‘2016-02-15 00:00:00‘, ‘71‘);
INSERT INTO `result` VALUES (‘10000‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘60‘);
INSERT INTO `result` VALUES (‘10001‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘46‘);
INSERT INTO `result` VALUES (‘10002‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘83‘);
INSERT INTO `result` VALUES (‘10003‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘60‘);
INSERT INTO `result` VALUES (‘10004‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘60‘);
INSERT INTO `result` VALUES (‘10005‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘95‘);
INSERT INTO `result` VALUES (‘10006‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘93‘);
INSERT INTO `result` VALUES (‘10007‘, ‘1‘, ‘2016-02-17 00:00:00‘, ‘23‘);

----插入学生表

INSERT INTO `student` VALUES (‘10000‘, ‘123‘, ‘郭靖‘, ‘男‘, ‘1‘, ‘13645667783‘, ‘天津市河西区‘, ‘1990-09-08 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10001‘, ‘123‘, ‘李文才‘, ‘男‘, ‘1‘, ‘13645667890‘, ‘地址不详‘, ‘1994-04-12 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10002‘, ‘123‘, ‘李斯文‘, ‘男‘, ‘1‘, ‘13645556793‘, ‘河南洛阳‘, ‘1993-07-23 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10003‘, ‘123‘, ‘张萍‘, ‘女‘, ‘1‘, ‘13642345112‘, ‘地址不详‘, ‘1995-06-10 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10004‘, ‘123‘, ‘韩秋洁‘, ‘女‘, ‘1‘, ‘13812344566‘, ‘北京市海淀区‘, ‘1995-07-15 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10005‘, ‘123‘, ‘张秋丽‘, ‘女‘, ‘1‘, ‘13567893246‘, ‘北京市东城区‘, ‘1994-01-17 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10006‘, ‘123‘, ‘肖梅‘, ‘女‘, ‘1‘, ‘13563456721‘, ‘河北省石家庄市‘, ‘1991-02-17 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10007‘, ‘123‘, ‘秦洋‘, ‘男‘, ‘1‘, ‘13056434411‘, ‘上海市卢湾区‘, ‘1992-04-18 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘10008‘, ‘123‘, ‘何晴晴‘, ‘女‘, ‘1‘, ‘13053445221‘, ‘广州市天河区‘, ‘1997-07-23 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘20000‘, ‘123‘, ‘王宝宝‘, ‘女‘, ‘2‘, ‘13318877954‘, ‘地址不详‘, ‘1995-09-10 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘20010‘, ‘123‘, ‘何小华‘, ‘女‘, ‘2‘, ‘13318877954‘, ‘地址不详‘, ‘1995-09-10 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘30011‘, ‘123‘, ‘陈志强‘, ‘女‘, ‘3‘, ‘13689965430‘, ‘地址不详‘, ‘1994-09-27 00:00:00‘, null, null);
INSERT INTO `student` VALUES (‘30012‘, ‘123‘, ‘李露露‘, ‘女‘, ‘3‘, ‘13685678854‘, ‘地址不详‘, ‘1992-09-27 00:00:00‘, null, null);

-----插入科目表
INSERT INTO `subject` VALUES (‘1‘, ‘Logic Java‘, ‘220‘, ‘1‘);
INSERT INTO `subject` VALUES (‘2‘, ‘HTML‘, ‘160‘, ‘1‘);
INSERT INTO `subject` VALUES (‘3‘, ‘Java OOP‘, ‘230‘, ‘2‘);

-------------------------------检查Logic Java 课程最近一次考试 。如果成绩达到80分
--------------------------------以上者,则显示分数排在前5,名学员和分数
#1.获取Logic java 课程编号
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java";

#2.获取ogic Java最近一次考试日期
SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java");

#3.找到考试达到80分的记录
SELECT subjectNo,studentResult
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

#4.显示Logic Java最近一次考试前5名的学生信息
SELECT subjectNo,studentResult
FROM result
WHERE EXISTS(
SELECT subjectNo,studentResult
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")
AND examDate=(SELECT MAX(examDate) FROM result WHERE subjectNo=(
SELECT subjectNo FROM `subject` WHERE subjectName="Logic Java"))
ORDER BY studentResult DESC
LIMIT 5;

-------------------------------检查Logic Java 课程最近一次考试 。如果全部成绩未通过考试
--------------------------------(60分及格),认为本次考试偏难,计算的该次考试平均分加5分

#1.找到考试达到60分的记录
SELECT subjectNo,studentResult
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

#2.计算平均分加5分
SELECT AVG(studentResult)+5 AS 平均分
FROM result
WHERE NOT EXISTS(
SELECT subjectNo,studentResult
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"));

-----。。。。。。
UPDATE result SET studentResult=50 WHERE subjectNo=1 AND examDate=‘2016-02-17‘

原文地址:https://www.cnblogs.com/BingBing-Deng/p/9214282.html

时间: 2024-08-28 18:14:14

EXISTS和 NOT EXISTS 子查询 (高级查询 二)的相关文章

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

liferay 高级查询 (1)

pointExchangeLocalServiceImpl.java 加入的代码 /** * 积分管理中的查询方法 * * @param searchTerms * @param companyId * @param groupId * @param start * @param end * @return * @throws SystemException */ //查询PointExchange表中所有记录 @SuppressWarnings("unchecked") public

关于T-SQL中exists或者not exists子查询的“伪优化”的做法

问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种“伪优化”的一些做法,并且向不明真相的群众传递这一种写法“优越性”,实在看不下去,无法传递给他人正确的指导思想无可厚非,给他人传递错误的思想或者说误导人倒是一种罪恶.本来这个事情是不值得一提的,看到越来越多被误导的群众开始推崇这种做法(甚至开始坚信了),实在是看不习惯,不吐不快.典型的问题如下select * from TableA awhere exists(selec

Oracle基本语法&&函数&&子查询&&分页查询&&排序&&集合操作&&高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

SQL编程之高级查询(子查询)以及注意事项

1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌套在一个 SELECT.SELECT...INTO 语句.INSERT...INTO 语句.DELETE 语句.或 UPDATE 语句或嵌套在另一子查询中. 语法:select ....from  表1  where  列1  > (子查询) 外面的查询成为父查询,圆括号嵌入的查询成为称

数据库基础学习4--表格的 增 删 改 查(简单查询与高级查询)

一.增 C:create 增加,创建,向数据库里面添加数据. insert into Fruit values('K009','苹果',3.0,'高青',90,'') insert into Fruit(Ids,Name,Price,Source,Numbers) values('K010','苹果',3.0,'高青',90) 二.改 U:update修改,从数据库表里面修改数据. update Fruit set Source='烟台' where Ids='K001' 三.删 D:delet

SQL Server T-SQL高级查询(转)

高级查询在数据库中用得是最频繁的,也是应用最广泛的.   ? 基本常用查询   --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select distinct sex from student; --count 统计 select count(*) from student; select count(sex) from student; select count(di

oracle数据库的高级查询方法 多表联合查询

oracle查询 一,简单查询 order by 1,2 select t.sno, t.sname, t.ssex from STUDENT t order by 1,2,3 group by 增强版 SELECT p.toma, p.ptype, SUM(p.lastcou) FROM product p GROUP BY rollup(p.toma, p.ptype) 二,高级查询(多表连接查询) 笛卡尔积的概念: 所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合

SQL Server T-SQL高级查询

name like 'ja%'; select * from student where name not like '%[j,n]%'; select * from student where name like '%[j,n,a]%'; select * from student where name like '%[^ja,as,on]%'; select * from student where name like '%[ja_on]%'; --in 子查询 select * from

15-07-17 数据库--高级查询

高级查询 --连接查询 select * from 表1,表2 -- 形成笛卡尔积 select * from 表1,表2 where 表1.主键=表2.外键 --主外键位置可以互换 --join on 内连接 select * from 表1 join 外键 on 表1.主键 = 表2.外键 --查哪位学生的哪一门课考了多少分 select student.sname,course.cname,score.degree from student join score on score.sno=