有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还是没有搞明白。希望高手指点,不胜感激!!!
希望给出实现代码,最好再给点解释说明。
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还是没有搞明白。希望高手指点,不胜感激!!!
希望给出实现代码,最好再给点解释说明。
我只给你解释一下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')
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')
from t_student(s)
where sno in(select sno
from t_score(sc)
where cno=(select cno from t_course(c) where cname='税收基础' )
);