• “子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”SQL查询错误解析


    为了实现下述代码,首先得有数据库和相应的表格,本文用的是https://blog.csdn.net/qaz13177_58_/article/details/5575711/中的案例,即先用链接中那些命令创建数据库、生成数据表,然后就有了student,teacher,course,score等表。

    最近用select做题,经常碰到下面的这两个错误:

    1.子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

    比如针对下述问题:

    1.查询成绩比该课程平均成绩低的同学的成绩表。

    我的查询:select * from score where degree<(select avg(degree) from score group by cno),执行后,出现上述错误。

    正确查询:SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO)

    2.查询出“计算机系“教师所教课程的成绩表。

    我的查询:select * from score where cno=
    (select course.cno from course where tno=(select tno from TEACHER where teacher.depart='计算机系')),执行后,出现上述错误。

    正确查询:select * from score where cno IN

    (select course.cno from course INNER JOIN TEACHER ON TEACHER.TNO=COURSE.TNO AND teacher.depart='计算机系')

    上述问题2在于用了'='于select子查询(我的查询的第二行括号内语句)之前,但是select子查询返回的不止一个元素,所以出错了。

    如果问题改一改,变为:查询出“李诚“教师所教课程的成绩表。那么我们可以用'='构成的嵌套查询语句如下:

    select * from score where cno=
    (select course.cno from course where tno=(select tno from TEACHER where teacher.depart='李诚'))

    为什么这时候可以执行而且得到想要的结果了?这是因为select tno from TEACHER where teacher.depart='李诚'只返回'804'这个tno值,而且select course.cno from course where tno='804'也只返回'3-245'这个cno值,第二行中的两个嵌套子查询都只返回一个值,因此上述语句中的两个'='不会出错。

    2.HAVING 子句中的列 'score.DEGREE' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

    比如针对下述问题:

    查询最低分大于70,最高分小于90的Sno列。

    我的查询:select sno from score group by sno having degree between 70 and 90,执行后,出现上述错误。

    正确查询:select sno from score group by sno having min(degree)>70 and max(degree)<90

    分析,having 后面应该是跟聚合函数的表达式的,直接跟按某一列的行筛选语句会无效。

    学习是熵减的过程,终身学习应当是每个人去做到的。
  • 相关阅读:
    eclipse 快捷键
    JSTL标签 参考手册
    Oracle错误代码大全
    十大编程算法
    win激活查询及修改
    LINUX安全设置
    Mac OS Ruby安装 使用RVM
    windows 说“我爱你”
    ubuntu安装
    linux下文件压缩与解压操作
  • 原文地址:https://www.cnblogs.com/alesvel/p/10060774.html
Copyright © 2020-2023  润新知