专栏首页Java学习网SQL复杂查询和视图--Java学习网

SQL复杂查询和视图--Java学习网

子查询


现实中,很多情况下需要进行下述条件判断

  • 某一元素是否是某一集合成员
  • 某一集合是否包含另一集合
  • 测试集合是否为空
  • 测试集合是否存在另一元组

子查询是出现在WHERE子句中的SELECT语句被称为子查询,子查询返回了一个集合。

IN子查询


基本语法:查询语句 [NOT] IN 子查询

语义:查询语句产生的结果是否在子查询当中

  • 列出选修了001号课程的学生学号和姓名

SELECT sn, sname FROM student WHERE sn IN (SELECT sn FROM sc WHERE cn="001");

括号中产生的结果是一个集合(这里称为子集合),集合中的元素是学过001课程的学生的学号。前半部分的查询语句是从student中每取一条记录来查看记录中的sn是否在子集合中。如果是则将该记录进行标记,否则取出下一条继续比较。最后将被标记的记录中sn和snames属性值输出。

  • 查询既学过001课程又学过002课程的同学学号

SELECT sn FROM sc WHERE cn="001" AND sn IN (SELECT sn FROM sc WHERE cn="002");

非相关子查询


查询分为外层查询和内层查询

外层查询的参数可以被带入到内层查询中,而内层查询的参数不能在外层查询中使用,这和高级编程中的循环一个道理。

当内层查询没有使用到外查询的参数时,我们可以内层查询是非相关子查询。上图中就是非相关子查询。判断是否相关最简单的方式就是内层查询是否能独立执行。

相关子查询


上图的例子中内层子查询使用到了外层的变量(Stud),这样内层查询就不能独立执行

SOME与ALL子查询


基本语法:查询语句 Θ SOME 子查询

查询语句 Θ ALL 子查询

Θ 是运算符:<,>,<=,>=,<>

Θ SOME表示前面的记录需要与子查询结果中某个记录做运算,如果为TRUE则该记录被接受

Θ ALL表示前面的记录需要与子查询结果中所有记录做运算,如果全为TRUE则该记录才被接受

  • 找出工资最低的教师姓名

SELECT tname FROM teacher WHERE salary <= ALL( SELECT salary FROM teacher)

  • 找出001号课成绩不是最高的所有学生的学号

SELECT sn FROM sc WHERE cn="001" AND score < SOME( SELECT score FROM sc WHERE cn = "001")

  • 找出所有成绩都不及格的学生姓名(相关查询)

SELECT sname FROM student WHERE 60 > ALL( SELECT score FROM sc WHERE sc.sn = student.sn)

  • 找出张三同学成绩最低的课程号

SELECT cn FROM sc,student WHERE sname="张三" AND sc.sn=student.sn AND score <=ALL( SELECT score FROM sc WHERE sn=student.sn)

EXISTS查询


基本语法: [NOT] EXISTS (子查询)

含义:判断子查询结果集是否为空,当子查询为空时,EXISTS判断为false,而NOT EXISTS判断为true。NOT EXISTS使用情况比较多

  • 检索学过001号教师主讲的所有课程的同学姓名

等价转换为不存在这样一门课程,该课程由001教师主讲并且该课程该同学没学过

SELECT sname FROM student WHERE NOT EXISTS( SELECT * FROM course WHERE tn="001" AND NOT EXISTS( SELECT * FROM sc WHERE sn=student.sn AND cn=course.cn) )

  • 列出没有学过李明老师课的学生姓名

等价于不存在这样的学生,他学过李明老师的课

SELECT sname FROM student WHERE NOT EXISTS( SELECT * FROM course,sc,teacher WHERE course.cn=sc.cn AND teacher.tn=course.tn AND tname="李明" AND student.sn=sc.sn)

  • 列出至少学过98030101号同学学过所有课程的同学学号

等价于不存在98030101同学学过的课程,该同学没有学过

SELECT sn FROM sc AS sc1 WHERE sn !="98030101" AND NOT EXISTS( SELECT * FROM sc AS sc2 WHERE sn="98030101" NOT EXISTS( SELECT * FROM sc AS sc3 WHERE sc2.cn=cn AND sn=sc1.sn) )

结果计算与聚类计算


结果计算和聚类计算是对查询结果集中的一些数据进行计算

  • 求任意两名教师的薪水差额(差额>0)

SELECT t1.tname AS teacher1, t2.tname AS teacher2,t1.salary-t2.salary FROM teacher AS t1, teacher AS t2 WHERE t1.salary >t2.salary

聚类计算

  • 求教师工资总和

SELECT SUM(salary) FROM teacher

  • 求数据库课程的平均成绩

SELECT AVG(score) FROM sc,course WHERE sc.cn=course.cn AND course.cname="数据库"

本文分享自微信公众号 - Java学习网(javalearns),作者:javalearns

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习SQL【6】-复杂查询

    到目前为止,我们学习了表的创建、查询和更新等数据库的基本操作方法。现在我们将会在这些基本方法的基础上,学习一些实际应用的方法。 一:视图 1:视图和表 表中存...

    爱吃西瓜的番茄酱
  • HBase操作组件:Hive、Phoenix、Lealone

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务...

    王知无-import_bigdata
  • 大数据学习路线

    上图是一个简化的大数据处理流程图,大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。下面我们逐一对各个环节所需要的技术栈进行讲解:

    小歪
  • 大数据学习资源汇总

    关系数据库管理系统(RDBMS) SQLServer:世界最有活力的数据库; MySQL:世界最流行的开源数据库; PostgreSQL:世界最先进的开...

    逸鹏
  • 大数据学习资源最全版本(收藏)

    Apache Hadoop:分布式处理架构,结合了 MapReduce(并行处理)、YARN(作业调度)和HDFS(分布式文件系统);

    风火数据
  • 7天快速掌握SQL-DAY1

    配置路径:计算机—属性—高级系统设置—环境变量—系统变量—path—编辑—新建—粘贴mysql的bin目录

    披头
  • java后端开发面经_数据库相关

    你答:有这样一个故事,讲的是一个小男孩和一个小女孩,这个小男孩呢,用很多好玩石头,而这个小女孩呢,有好多好吃的糖果,有一天,他们相互约定:小男孩用所有的石头交互...

    用户6055494
  • 【赵强老师】什么是Spark SQL?

    Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。

    赵强老师
  • kafka sql入门

    问题导读 1.kafka sql与数据库sql有哪些区别? 2.KSQL有什么作用? 3.KSQL流和表分别什么情况下使用?

    用户1410343

扫码关注云+社区

领取腾讯云代金券