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)))
  • 相关阅读:
    JS日期比较,使用正则表达式转换
    Using SQL*Loader to create an external table
    USACO试题beads的两种解法
    activiti5学习资料(5.12版本流程图的生成)
    黑马程序员_day20_Map集合
    开发者使用JasperReport——不同数据源之Map数据源
    给自己科谱:控制字符
    507 Jill Rides Again
    探讨工作流能给公司带来的几点益处
    ubuntu linux安装双系统的方法Win7、XP下均可
  • 原文地址:https://www.cnblogs.com/X-Do-Better/p/9090228.html
Copyright © 2011-2022 走看看