嵌套查詢(一般嵌套查詢+含有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

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