作业7

【3.49】查询每个学生及其选修课程的情况
SELECT Student., SC.
FROM Student, SC
WHERE Student.Sno = SC.Sno;
【3.50】对例【3.49】用自然连接完成
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
【3.51】查询选修2号课程并且成绩在86分以上的所有学生的学号和姓名
SELECT Student.Sno,Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno=‘2’ AND SC.Grade>86;
【3.52】查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST_TABLE.Cno, SECOND_TABLE.Cpno
FROM Course FIRST_TABLE, Course SECOND_TABLE
WHERE FIRST_TABLE.Cpno = SECOND_TABLE.Cno;
【3.53】
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
【3.54】查询每一个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC,sno AND SC.Cno = Course.Cno;

SELECT *
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno;
多表连接,两个以上的表进行连接

嵌套查询,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询。一个SELECT-FROM-WHERE语句称为一个查询块。

SQL语言允许多层嵌套查询,不能使用ORDER BY子句

外层查询(父查询),外层的查询块

内层查询(子查询),内层的查询块
SELECT * /外层查询/父查询/
FROM Student
WHERE Sno IN
(SELECT Sno /内层查询/子查询/
FROM SC
WHERE Cno= ‘2’);
不相关子查询,子查询的查询条件不依赖于父查询。由里向外逐层处理。就是说每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ‘刘晨’);
相关子查询,子查询的查询条件依赖于父查询。先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组,重复这一过程,直至外层表全部检查完为止。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=( SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);

【3.55】查询与“刘晨”在同一个系学习的学生
SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’;

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept=‘CS’;
先查找刘晨所在系,然后再查找所在系学习的学生
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ‘刘晨’);
带有IN谓词的不相关子查询,将第一步查询嵌入到第二步查询的条件中
SELECT S1.Sno, S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND S2.Sname = ‘刘晨’;

【3.56】查询选修了课程名为信息系统的学生学号和姓名
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname= ‘信息系统’
)
);
先在Course关系中找出“信息系统”的课程号,为3号。然后在SC关系中找出选修了3号课程的学生学号,最后在Student关系中取出Sno和Sname。
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname=‘信息系统’;

【3.57】找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno, Cno
FROM SC x
WHERE Grade >=( SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);

【3.58】查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY ( SELECT Sage
FROM Student
WHERE Sdept= ‘CS’)
AND Sdept <> ‘CS’;
先查询计算机科学系学生的年龄,然后查询年龄小于任意一个上述年龄且不是计算机科学系的学生的姓名和年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < (SELECT MAX(Sage)
FROM Student
WHERE Sdept= 'CS ')
AND Sdept <> ‘CS’;

【3.59】查询非计算机科学系中比计算机科学系所有学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL ( SELECT Sage
FROM Student
WHERE Sdept= ‘CS’)
AND Sdept <> ‘CS’;
先查询计算机科学系学生的年龄,然后查询年龄小于上述所有年龄且不是计算机科学系的学生的姓名和年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= 'CS ')
AND Sdept <> ‘CS’;
先查询计算机科学系学生的年龄的最小值,然后找所有不是计算机科学系且年龄小于最小值的学生的姓名和年龄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值