zoukankan      html  css  js  c++  java
  • EXIST子查询

    已知关系模式:S(Sno,Sname,Sclass),C(Cno,Cname,Cteacher),SC(Sno,Cno,Scgrade)。其中,S为学生关系:Sno学号, Sname姓名,Sclass班级; C为课程关系:Cno课程号, Cname课程名, Cteacher任课教师;SC为学生选课关系:Scgrade成绩。你能书写出下列SQL语句吗?这些语句的书写是衡量你是否掌握数据库语言的标志。

    (1)找出学过“李明”老师讲授课程的所有学生;

    (2)找出学全了“李明”老师讲授课程的所有学生;

    (3)找出没学过“李明”老师讲授课程的所有学生;

    (4)找出没学全“李明”老师讲授课程的所有学生。

    解:

    (1)“学过”词语的含义表示只要为其中一种情况即可,所以,可以采用IN子查询,刚开始做的时候把它想为了EXIST,但其是它和IN不等价

    代码如下:

     SELECT DISTINCT S.Sname FROM S
    
       WHERE SNO IN(SELECT SNO FROM SC,C
                               SC.Cno=C.Cno AND C.Cteacher='李明');            

    (2)“全”代表着所有,根据句意,可以等价为不存在有一门“李明”老师主讲的课程该学生没有学过

    SELECT S.Sname FROM S
    WHERE NOT EXISTS ---不存在
    (SELECT * FROM C         ----李明教授课程          
    WHERE C.Cteacher='李明' AND NOT EXISTS 
    (SELECT * FROM SC  ---该同学没学过
       WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno));

    (3)“没学过”则正好与(1)相反,只要改为NOT IN即可

     SELECT Sname FROM S
    
       WHERE Sno NOT IN(SELECT Sno FROM SC,C 
    
                          WHERE C.Cteacher='李明' AND  S.Sno=SC.Sno AND SC.Cno=C.Cno);

    (4)“没学全”在(2)的基础上加上了否定,则只要在其前面加上否定即可

    SELECT DISTINCT S.Sname FROM S
    
       WHERE S.Sno NOT IN (SELECT SC.Sno FROM SC
    
                           WHERE NOT EXISTS (SELECT * FROM C
    
                                            WHERE C.Cteacher='李明' AND NOT EXISTS (SELECT * FROM SC  
    
                                                                WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno)))
  • 相关阅读:
    32 renren-fast-vue安装报错问题
    31 element自定义图片上传
    30 图片预览
    29 element-table样式更改
    28 ant-design-vue-jeecg运行报错问题
    27 mysql8安装
    25 mybatis-plus常用语法
    24 element表单校验
    23 鼠标移入移出更换样式
    22 初识mysql外键
  • 原文地址:https://www.cnblogs.com/X-Do-Better/p/9090228.html
Copyright © 2011-2022 走看看