您的位置 首页 > 数码极客

ci如何实现嵌套查询

1、带有IN谓词的子查询

查询与“刘晨”在同一个系学习的学生

SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨‘)

本题也可以用自身连接完成

SELECT S1.Sno,S1.Sname,S1.Sdept FROM Student S1,Student S2 WHERE S1.Sdept=S2.Sdept AND S2.Sname=’刘晨‘

2、带有比较运算符的子查询

找出每个学生超过他选修课程平均成绩的课程号。

SELECT Sno,Cno FROM SC x WHERE Grade>=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);

3、带有ANY(SOME)或ALL谓词的子查询

查询其它系中比计算机科学系某一学生年龄小的学生姓名和年龄。

SELECT Sname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept!='CS'; /*注意这是父查询块中的条件*/ /*注意这是父查询块中的条件*/

DSMS执行此查询时,首先处理子查询,找出CS系中所有学生的年龄,构成一个集合A,然后处理父查询,找所有不是CS系且年龄小于A中某个值的学生。

本例也可以用聚集函数来实现

SELECT Sname,Sage FROM Student WHERE Sage< (WHERE MAX(Sage) FROM Student WHERE Sdept='CS') AND Sdept<>'CS';

查询其它系中比计算机科学系所有学生年龄都小的学生姓名及年龄。

SELECT Sname,Sage FROM Student WHERE Sage<ALL (SELECT Sage FROM Student WHERE Sdept='CS') AND Sdept<>'CS'; FROM Student WHERE Sdept='CS') AND Sdept<>'CS';

4、带有EXISTS谓词的子查询

EXISTS代表存在量词。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true"或逻辑假值"false"。

查询所有选修了1号课程的学生姓名。

SELECT Sname,Sage FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=S AND Cno='1');

由EXISTS引出的子查询,其目标列表达式通常都用*,因为带有EXISTS的子查询只返回真值或假值,给出列明无实际意义。

集合查询

查询计算机科学系的学生及年龄不大于19岁的学生

SELECT * FROM Student WHERE Sdept='CS' UNION SELECT * FROM Student WHERE Sage<=19;

本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集。使用UNION将多个查询结果合并起来时,系统就会自动去掉重复元组。如果要保留重复元组则用UNION ALL操作符。

查询即选修了课程1又选修了课程2的学生。就是查询选修课程1的学生集合与选修课程2的学生集合的交集。

SELECT Sno FROM SC WHERE Cno='1' INTERSECT SELECT Sno FROM SC WHERE Cno='2';

本例也可以表示为:

SELECT Sno FROM SC WHERE Cno='1' AND Sno IN (SELECT Sno FROM SC WHERE Cno='2'); (SELECT Sno FROM SC WHERE Cno='2');

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“ci如何实现嵌套查询”边界阅读