有t_student(s),t_course(c),t_score (sc)三张表,表结构如下
t_student(s)
    列名           类型          字段说明
  sno(s#)        Varchar2(40)       学号
  sname(sn) Vc2(40)      学员姓名
  sd(sd)          Vc2(40)        所属单位
  sage(sa) number       学员年龄 t_course(c)
     列名           类型      字段说明
   cno (c#) Varchar2(40)   课程编号
   cname (cn) Vc2(40)       课程名称

t_score (sc)
     列名          类型 字段说明
     sno (S#) number 学号
     cno (C#) Vc2(40) 课程编号
     score (G) number 学习成绩
题目:
1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 。2. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位。要求使用exists 或 not exists 实现。
一直以来都是使用in或not in 没有使用过exists ,现在公司要求必须会使用exists 。崩溃了,百度N久,
对exists还是没有搞明白。希望高手指点,不胜感激!!!
希望给出实现代码,最好再给点解释说明。 

解决方案 »

  1.   

    对于你的题目还是自己思索一下把,不难,只要你理清思路,找出3个表的关系后就很好做了。
    我只给你解释一下exists和not exists的用法,举例:如oracle中scott用户下的emp 和dept表。
    我现在要找出(emp表)部门编号(deptno)必须在dept表中存在的雇员信息
    SELECT E.* FROM EMP E WHERE EXISTS (SELECT 1 FROM DEPT D WHERE E.DEPTNO = E.DEPTNO);
    用exists的好处是不要像in 语法那样找出子查询中的所有记录在一一匹配,而exists只要满足e.deptno=d.deptno条件即可,效率会比in高很多。
    我再贴断文字给你把。
     (15)用EXISTS替代IN、用NOT EXISTS替代NOT IN:  在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,
    使用EXISTS(或NOT EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。而且当not in 字句中存在null值的话,整条语句返回值将为空,
    无论在哪种情况下,NOT IN都是最低效的 (因为他对子查询中的表执行了一个全表遍历)。
    为了避免使用NOT IN ,我们能够把他改写成外连接(Outer Joins)或NOT EXISTS。  例子:  (高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB');    (低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB') 
            
      

  2.   

    回答前有个下建议:两表都学号这个字段,但类型不一致,最好类型一致。-- 1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名 。
    SELECT SNO, SNAME
      FROM T_STUDENT
     WHERE EXISTS (SELECT 0
              FROM T_COURSE, T_SCORE
             WHERE T_COURSE.CNO = T_SCORE.CNO
               AND T_SCORE.SNO = T_STUDENT.SNO
               AND T_COURSE.CNAME = '税收基础')--2. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位。SELECT SNAME, SD
      FROM T_STUDENT
     WHERE NOT EXISTS (SELECT 0
              FROM T_SCORE
             WHERE T_SCORE.SNO = T_STUDENT.SNO
               AND T_SCORE.CNO = 'c5')
      

  3.   

    select sname,sno
    from t_student(s)
    where sno in(select sno
    from t_score(sc)
    where cno=(select cno from t_course(c) where cname='税收基础' )
    );