嵌套查询(一般嵌套查询+含有EXISTS函数的嵌套查询)和连接查询的练习

/**********一、用含由EXISTS谓词的查询完成以下题目**********/
--例3.55 查询与“刘晨”在同一系的学生。
SELECT *
FROM Student A
WHERE Sdept IN(
	SELECT Sdept
	FROM Student B
	WHERE B.Sname='刘晨'AND A.Sdept=B.Sdept)--嵌套查询
	
SELECT A.*
FROM Student A,Student B
WHERE B.Sname='刘晨' AND A.Sdept=B.Sdept--连接查询

SELECT *
FROM Student A
WHERE EXISTS(
	SELECT *
	FROM Student B
	WHERE B.Sdept=A.Sdept AND B.Sname='刘晨')--带有EXISTS的嵌套查询

--练习1:查询至少有一门课程不及格的学生的信息。

SELECT *
FROM Student
WHERE Sno IN(
	SELECT Sno
	FROM SC
	WHERE Grade<60)--嵌套查询
	
SELECT Student.*
FROM Student,SC
WHERE Student.Sno=SC.Sno AND SC.Grade<60--连接查询

SELECT *
FROM Student
WHERE EXISTS (
	SELECT *
	FROM SC
	WHERE Student.Sno=SC.Sno AND Grade<60)--带有EXISTS的嵌套查询


--练习2:查询选修2号课程所有学生的学号和姓名。

SELECT Sname,Sno
FROM Student
WHERE Sno IN(
	SELECT Sno
	FROM SC
	WHERE Cno='2') --嵌套查询
	
SELECT Sname,Student.Sno
FROM Student,SC
WHERE Student.Sno=SC.Sno AND Cno='2'--连接查询

SELECT Sname,Sno
FROM Student
WHERE EXISTS(
	SELECT *
	FROM SC
	WHERE Student.Sno=SC.Sno AND Cno='2')--带有EXISTS的嵌套查询

--练习3:查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。

SELECT Sname,Sno
FROM Student
WHERE Sno IN(
	SELECT Sno
	FROM SC
	WHERE Student.Sno=SC.Sno AND Cno='2' AND Grade>90)
	
SELECT Student.Sname,Sno
FROM Student,SC
WHERE Student.Sno=SC.Sno AND Cno='2' AND Grade>90

SELECT Sname,Sno
FROM Student
WHERE EXISTS(
	SELECT*
	FROM SC
	WHERE Student.Sno=SC.Sno AND Cno='2' AND Grade>90)

--例3.56 查询选修了课程名为“信息系统”的学生学号和姓名。

SELECT Sname,Sno
FROM Student
WHERE Sno IN(
	SELECT Sno
	FROM SC
	WHERE Cno IN(
		SELECT Cno
		FROM Course
		WHERE Cname='信息系统'))
		
SELECT Student.Sname,Student.Sno
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Cname='信息系统'

SELECT Sname,Sno
FROM Student
WHERE EXISTS(
	SELECT *
	FROM SC
	WHERE EXISTS(
		SELECT *
		FROM Course
		WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Cname='信息系统'))

--练习4  查询大于平均年龄的男学生的详细情况 

SELECT *
FROM Student
WHERE Sage > (
	SELECT  AVG(Sage)
	FROM Student)
AND Ssex='男'

SELECT *
FROM Student A
WHERE EXISTS (
	SELECT * 
	FROM Student B
	WHERE Sage >(
		SELECT AVG(Sage)
		FROM Student C 
		WHERE A.Sno=B.Sno))   --AND A.Sno=B.Sno)
AND Ssex='男'


--例3.57 找出每个学生超过他选修课程平均成绩的课程号。(一种方法)

SELECT A.Sno,Cno
FROM SC A
WHERE Grade>=(
	SELECT AVG(Grade)
    FROM SC B
    WHERE A.Sno=B.Sno)
    --GROUP BY Sno)

/*SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
21   79
22   75
26   76
*/

--例3.58 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage < ANY(
	SELECT Sage
	FROM Student
	WHERE Sdept='SC')
AND Sdept<>'SC'

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

SELECT A.Sname,Sage
FROM Student A
WHERE EXISTS(
	SELECT*
	FROM Student B
	WHERE Sage<ANY(
		SELECT MAX(Sage)
		FROM Student 
		WHERE Sdept='SC')
	AND A.Sno=B.Sno)
AND Sdept<>'SC'

--例3.59 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。

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

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

SELECT A.Sname,Sage
FROM Student A
WHERE EXISTS(
	SELECT*
	FROM Student B
	WHERE Sage<ALL(
		SELECT MIN(Sage)
		FROM Student 
		WHERE Sdept='SC')
	AND A.Sno=B.Sno)
AND Sdept<>'SC'

--练习5 查询比任意一门课程学分小的课程信息。

SELECT *
FROM Course
WHERE Ccredit<ANY(
	SELECT Ccredit
	FROM Course)

SELECT *
FROM Course
WHERE Ccredit < ANY (
	SELECT MAX(Ccredit)
	FROM Course)
	
SELECT *
FROM Course A
WHERE EXISTS(
	SELECT *
	FROM Course B
	WHERE Ccredit<ANY(
			SELECT MAX(Ccredit)
			FROM Course)
     AND A.Cno=B.Cno)


--练习6 查询无先行课的课程比所有有先行课的课程学分都小的课程情况。

SELECT *
FROM Course A
WHERE Ccredit < ALL(
	SELECT MIN(Ccredit)
	FROM Course B
	WHERE  Cpno IS NOT NULL ) 
AND Cpno IS NULL

SELECT *
FROM Course A
WHERE Ccredit < ALL(
	SELECT Ccredit
	FROM Course B
	WHERE  Cpno IS NOT NULL ) 
AND Cpno IS NULL
	
SELECT *
FROM Course X
WHERE EXISTS(
	SELECT *
	FROM Course A
	WHERE Ccredit < ALL(
		SELECT Ccredit
		FROM Course B
		WHERE  Cpno IS NOT NULL ) 
AND Cpno IS NULL  AND X.Cno=A.Cno)

--例3.61 查询没有选修1号课程的学生姓名。

SELECT Sname
FROM Student
WHERE Sno IN(
	SELECT DISTINCT Sno
	FROM SC
	WHERE Sno NOT IN(
		SELECT Sno
		FROM SC
		WHERE Cno='1'))
		
SELECT DISTINCT Sname
FROM Student,SC
WHERE  Student.Sno=SC.Sno AND  SC.Sno NOT IN(
	SELECT Sno
	FROM SC
	WHERE Cno='1')

SELECT Sname
FROM Student
WHERE EXISTS(
	SELECT *
    FROM SC
    WHERE Sno IN(
	    SELECT DISTINCT Sno
	    FROM SC
	    WHERE Sno NOT IN(
		   SELECT Sno
		    FROM SC
		    WHERE Cno='1'))
	AND Student.Sno=SC.Sno)

		

--例3.62 查询选修了全部课程的学生姓名。

SELECT Sname
FROM Student
WHERE Sno IN(
	SELECT Sno
	FROM SC
	GROUP BY Sno
	HAVING Count(Sno) =(
		SELECT Count(Cno)
		FROM Course))

SELECT Sname
FROM Student
WHERE NOT EXISTS(
	SELECT*
	FROM Course
	WHERE NOT EXISTS(
		SELECT*
		FROM SC
		WHERE Sno=Student.Sno AND Cno=Course.Cno)
	    )
  
--例3.63查询至少选修了学生201215122选修的全部课程的学生号码。


SELECT DISTINCT Sno
FROM SC A
WHERE NOT EXISTS(
	SELECT *
	FROM SC B
	WHERE B.Sno='201215122' AND NOT EXISTS(
		SELECT*
		FROM SC C
		WHERE C.Sno=A.Sno AND C.Cno=B.Cno))

/***********二、用集合操作方法完成下列题目(两种方法)*********/
--[例3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT*
FROM Student
WHERE Sdept='SC'
UNION
SELECT*
FROM Student
WHERE Sage<=19

SELECT*
FROM Student
WHERE Sdept='SC'
UNION ALL
SELECT*
FROM Student
WHERE Sage<=19

SELECT*
FROM Student
WHERE Sdept='SC' OR Sage<=19 
--[例3.65] 查询选修了1号课程或者选修了2号课程的学生

SELECT Sno
FROM SC
WHERE Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Cno='2'

SELECT Sno
FROM SC
WHERE Cno='1' OR Cno='2'

--[例.66]  查询计算机科学系的学生与年龄不大于19岁的学生的交集。

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

SELECT*
FROM Student
WHERE Sdept='SC' AND Sage<=19

--[例3.67] 查询既选修了1号课程又选修了2号课程的学生。

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

--[例3.68] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。

SELECT *
FROM Student
WHERE Sdept='SC'
EXCEPT
SELECT*
FROM Student
WHERE Sage<=19

SELECT*
FROM Student
WHERE Sdept='SC' AND Sage>19

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章