SQL 语句(四)--------------数据查询(嵌套查询)
2017-07-13 21:38
417 查看
/**********************************嵌套查询******************************************/
--在SQL语言中,一个SELECT-FROM-WHERE语句称为一个“查询块”
--将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为“嵌套查询”
--SQL语言允许多层嵌套,即一个子查询中还可以嵌套其他子查询
--子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序
/**********************************带有IN谓词的子查询******************************************/
--查询与“宋杰”在同一个系学习的学生
--第一步 查‘宋杰’所在的系名
SELECT 院系号
FROM 学生选课.学生
WHERE 学生.姓名='宋杰';
--结果为 06001
--第二步 查该院系的学生
SELECT 学生.学号,姓名,名称
FROM 学生选课.学生,学生选课.院系
WHERE 学生.院系号='06001' AND 院系.院系号=学生.院系号;
--第三步 嵌套:
SELECT 学生.学号,姓名,名称
FROM 学生选课.学生,学生选课.院系
WHERE 学生.院系号 IN
(SELECT 院系号
FROM 学生选课.学生
WHERE 学生.姓名='宋杰')
AND 院系.院系号=学生.院系号;
--查询选修了课程名为'数据库系统' 的学生学号和姓名
SELECT 学号,姓名
FROM 学生选课.学生
WHERE 学号 IN
(SELECT 学号
FROM 学生选课.选课
WHERE 课程号 IN
(SELECT 课程号
FROM 学生选课.课程
WHERE 名称='数据库系统'
)
);
--查询涉及多个关系时,用嵌套查询逐步求解,层次清楚,易于构造,具有结构化程序设计的优点
--子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询
--如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询
/**********************************带有比较运算符的子查询******************************************/
--找出每个学生超过他选修课程平均成绩的课程号
SELECT 学号,课程号
FROM 学生选课.选课 x
WHERE 成绩 >
(SELECT AVG(成绩)
FROM 学生选课.选课 y
WHERE x.学号=y.学号
);
/*******************************带有ANY(SOME)或ALL谓词的子查询***************************************/
--子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符
--使用ANY或ALL谓词时必须同时使用比较运算符
--查询其他学院中比经济学院某一学生年龄小的学生姓名和年龄
SELECT 姓名,年龄
FROM 学生选课.学生 x
WHERE x.年龄 < ANY
(SELECT 年龄
FROM 学生选课.学生 y,学生选课.院系 z
WHERE z.名称='经济学院' AND y.院系号=z.院系号
)
AND 院系号 !=
(SELECT 院系号
FROM 学生选课.院系
WHERE 院系.名称='经济学院'
);
--用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高!
/*******************************带有EXISTS谓词的子查询***************************************/
--带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真true假false
--查询所有选修了0001号课程的学生姓名
SELECT 姓名
FROM 学生选课.学生 x
WHERE EXISTS
(SELECT *
FROM 学生选课.选课
WHERE 选课.学号=x.学号 AND 选课.课程号='0001'
);
--本题的思路是遍历学生表,取出每一个元组,如果子查询返回true,则为目标元组
--由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
--查询没有选修0003号课程的学生姓名
SELECT 姓名
FROM 学生选课.学生 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课
WHERE 选课.学号=x.学号 AND 选课.课程号='0003'
);
SELECT 姓名
FROM 学生选课.学生 x
WHERE x.学号 NOT IN
(SELECT 学号
FROM 学生选课.选课
WHERE 选课.课程号='0003'
);
--查询选修了全部课程的学生姓名
--注:sql中没有全程量词,需要把带有全称量词的谓词转换为等价的带有存在量词的谓词---没有很好的理解!!!!!!!!!
--没有一门课是他没有选修的!
SELECT 姓名,学号
FROM 学生选课.学生 s
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.课程 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课
WHERE x.课程号=选课.课程号 AND s.学号=选课.学号
)
);
--查询至少选修了学生020002选修的全部课程的学生学号
--不存在这样的课程y,学生020002选修了y,而学生x没有选
SELECT 学号
FROM 学生选课.选课 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课 y
WHERE y.学号='020002' AND NOT EXISTS
(SELECT *
FROM 学生选课.选课 z
WHERE z.学号=x.学号 AND z.课程号=y.课程号
)
);
--在SQL语言中,一个SELECT-FROM-WHERE语句称为一个“查询块”
--将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为“嵌套查询”
--SQL语言允许多层嵌套,即一个子查询中还可以嵌套其他子查询
--子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序
/**********************************带有IN谓词的子查询******************************************/
--查询与“宋杰”在同一个系学习的学生
--第一步 查‘宋杰’所在的系名
SELECT 院系号
FROM 学生选课.学生
WHERE 学生.姓名='宋杰';
--结果为 06001
--第二步 查该院系的学生
SELECT 学生.学号,姓名,名称
FROM 学生选课.学生,学生选课.院系
WHERE 学生.院系号='06001' AND 院系.院系号=学生.院系号;
--第三步 嵌套:
SELECT 学生.学号,姓名,名称
FROM 学生选课.学生,学生选课.院系
WHERE 学生.院系号 IN
(SELECT 院系号
FROM 学生选课.学生
WHERE 学生.姓名='宋杰')
AND 院系.院系号=学生.院系号;
--查询选修了课程名为'数据库系统' 的学生学号和姓名
SELECT 学号,姓名
FROM 学生选课.学生
WHERE 学号 IN
(SELECT 学号
FROM 学生选课.选课
WHERE 课程号 IN
(SELECT 课程号
FROM 学生选课.课程
WHERE 名称='数据库系统'
)
);
--查询涉及多个关系时,用嵌套查询逐步求解,层次清楚,易于构造,具有结构化程序设计的优点
--子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询
--如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询
/**********************************带有比较运算符的子查询******************************************/
--找出每个学生超过他选修课程平均成绩的课程号
SELECT 学号,课程号
FROM 学生选课.选课 x
WHERE 成绩 >
(SELECT AVG(成绩)
FROM 学生选课.选课 y
WHERE x.学号=y.学号
);
/*******************************带有ANY(SOME)或ALL谓词的子查询***************************************/
--子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符
--使用ANY或ALL谓词时必须同时使用比较运算符
--查询其他学院中比经济学院某一学生年龄小的学生姓名和年龄
SELECT 姓名,年龄
FROM 学生选课.学生 x
WHERE x.年龄 < ANY
(SELECT 年龄
FROM 学生选课.学生 y,学生选课.院系 z
WHERE z.名称='经济学院' AND y.院系号=z.院系号
)
AND 院系号 !=
(SELECT 院系号
FROM 学生选课.院系
WHERE 院系.名称='经济学院'
);
--用聚集函数实现子查询通常比直接用ANY或ALL查询效率要高!
/*******************************带有EXISTS谓词的子查询***************************************/
--带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真true假false
--查询所有选修了0001号课程的学生姓名
SELECT 姓名
FROM 学生选课.学生 x
WHERE EXISTS
(SELECT *
FROM 学生选课.选课
WHERE 选课.学号=x.学号 AND 选课.课程号='0001'
);
--本题的思路是遍历学生表,取出每一个元组,如果子查询返回true,则为目标元组
--由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
--查询没有选修0003号课程的学生姓名
SELECT 姓名
FROM 学生选课.学生 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课
WHERE 选课.学号=x.学号 AND 选课.课程号='0003'
);
SELECT 姓名
FROM 学生选课.学生 x
WHERE x.学号 NOT IN
(SELECT 学号
FROM 学生选课.选课
WHERE 选课.课程号='0003'
);
--查询选修了全部课程的学生姓名
--注:sql中没有全程量词,需要把带有全称量词的谓词转换为等价的带有存在量词的谓词---没有很好的理解!!!!!!!!!
--没有一门课是他没有选修的!
SELECT 姓名,学号
FROM 学生选课.学生 s
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.课程 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课
WHERE x.课程号=选课.课程号 AND s.学号=选课.学号
)
);
--查询至少选修了学生020002选修的全部课程的学生学号
--不存在这样的课程y,学生020002选修了y,而学生x没有选
SELECT 学号
FROM 学生选课.选课 x
WHERE NOT EXISTS
(SELECT *
FROM 学生选课.选课 y
WHERE y.学号='020002' AND NOT EXISTS
(SELECT *
FROM 学生选课.选课 z
WHERE z.学号=x.学号 AND z.课程号=y.课程号
)
);
相关文章推荐
- Linux命令:MySQL系列之三--mysql数据类型及SQL结构化查询语句使用
- web day15 数据库概述,MySQL,SQL语句,数据查询语法DQL
- 分享一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询等)。
- oracle 不小心把表数据锁掉,sys查询被锁对象和解锁SQL语句
- 用@Query标注自定义查询语句用原生sql查询符合时间要求的数据与分页等功能
- 全面复习之 SQL(2)-数据查询语句
- php中mysql一条sql语句查询出所有符合条件的数据,该怎么写?
- 将Sql查询语句获取的数据插入到List列表里面
- 使用SQL语句查询MySQL,SQLServer,Oracle所有数据库名和表名,字段名
- sql语句,查询前一个月数据。
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
- sql语句之查询与删除重复数据
- 统计:后台通过查询数据表(该表存放统计的sql语句)返回规定格式的json数据
- sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月 数据
- 求sql查询语句(转换数据表由纵向转换成横向)
- 使用sql语句查询日期在一周内的数据
- sql语句查询一张表中某字段值重复的记录数据
- ADO带密码的数据连接、查询一个记录集、执行一SQL语句
- Sql Server中查询当天,最近三天,本周,本月,最近一个月,本季度的数据的sql语句
- 营配数据质量核查,关于营销mis系统与配电gis系统里面的sql语句查询,做为积累使用,下次就不用重复写同样的语句了。