zoukankan      html  css  js  c++  java
  • MySQL出错信息: Subquery returns more than 1 row及其解决方法

    练习MySQL联表查询时遇到这样一道题

     - 问题: 查询"生物课程"比"物理课程"成绩高的所有学生的相关信息

     - 出错指令: 

     
    1 SELECT  student.sid AS '学号', student.sname AS '姓名', course.cname AS '课程', score.num AS '成绩' 
    2 FROM student INNER JOIN course INNER JOIN score  
    3 ON student.sid=score.student_id AND course.cid=score.course_id AND course.cid=2 
    4 WHERE score.num < (SELECT score.num FROM course INNER JOIN score ON course.cid=score.course_id AND course.cid=1);
    存在问题的指令

     - 报错信息:

      ERROR 1242 (21000): Subquery returns more than 1 row

     报错信息翻译:

      子查询返回超过1行

     分析与解决方法:

      1. 在重复写入时会出现这种问题, 可通过去掉重复数据解决

        - 通过在写入时加逻辑判断或者外键防止数据重复写入

       2. 利用IN、SOME、ANY、ALL关键字进行限制

        - 报错信息出自子查询, 因此需要对子查询涉及指令进行条件修改

     - 最终解决指令:

     
    1 SELECT  student.sid AS '学号', student.sname AS '姓名', course.cname AS '课程', score.num AS '成绩'
    2 FROM student INNER JOIN course INNER JOIN score
    3 ON student.sid=score.student_id AND course.cid=score.course_id AND course.cid=2 
    4 WHERE score.num < ANY(SELECT score.num FROM course INNER JOIN score ON course.cid=score.course_id AND course.cid=1);
    最终解决指令

     补充

       子查询就是指在一个SELECT语句中嵌套另一个SELECT语句
        IN、SOME、ANY、ALL都是子查询涉及的关键词

        - ANY可与= (>, >=, <, <=, <>)结合使用,分别表示等于(大于, 大于等于, 小于, 小于等于, 不等于)其中的任何一个数据

          -- ANY关键字必须与一个比较操作符一起使用

          -- ANY关键词可以理解为"对于子查询返回的列中的任一数值, 如果比较结果为True, 则返回True"

        - ALL可与= (>, >=, <, <=, <>)结合使用,分别表示等于(大于, 大于等于, 小于, 小于等于, 不等于)其中的所有数据

          -- ALL关键字必须与一个比较操作符一起使用

          -- ALL关键词可以理解为"对于子查询返回的列中的所有值, 如果比较结果为True, 则返回True"

        - 关键词IN 与关键词组合"=ANY"作用相同

     
    1 SELECT s1 
    2 FROM t1 
    3 WHERE s1 =ANY(SELECT s1 FROM t2);
    4 -- 效果等同
    5 SELECT s1 
    6 FROM t1 
    7 WHERE s1 IN(SELECT s1 FROM t2);
    IN与=ANY的例子

        - NOT IN 与 "<>ALL"用法与作用相同

     
    1 SELECT s1 
    2 FROM t1 
    3 WHERE s1 <>ANY(SELECT s1 FROM t2);
    4 -- 效果等同
    5 SELECT s1 
    6 FROM t1 
    7 WHERE s1 NOT IN(SELECT s1 FROM t2);
    <>ANY与NOT IN的例子

        - SOME相当于ANY的别名

     
    1 SELECT s1 FROM t1 WHERE s1 <> ANY(SELECT s1 FROM t2);
    2 -- 效果等同
    3 SELECT s1 FROM t1 WHERE s1 <> SOME(SELECT s1 FROM t2);
    ANY与SOME的例子

          -- 在理解上SOME较ANY更容易解释, 如上例子中涉及关键词SOME的指令可以解释为"表t1中有部分s1与表t2中的s1不相等", 涉及关键词ANY的指令解释为"表t1中的s1与表t2中的s1不全部相等"      

  • 相关阅读:
    数独
    canvas生成图片并保存到本地文件夹主要代码
    2048未完成
    Page
    IDEA新建MAVEN项目时速度缓慢
    Bug 记录(持续更新。。。)
    RecyclerBaseAdapter 和 OnItemClickListener
    AutoLoadRecyclerView
    BaseActionBarActivity
    Volley + OkHttp3 + Gson 组合的简单网络请求封装
  • 原文地址:https://www.cnblogs.com/dmcs95/p/10777013.html
Copyright © 2011-2022 走看看