1
--
-带有IN 谓词的子查询
2 -- -039查询与刘晨在同一个系的学生-----------------------------------------
3 USE student_course
4 SELECT Sno,Sname,Sdept
5 FROM Student
6 WHERE Sdept IN
7 (
8 SELECT Sdept
9 FROM Student
10 WHERE Sname = ' 刘晨 '
11 );
12 USE student_course
13 SELECT S1.Sno,S1.Sname,S1.Sdept
14 FROM S1.Student,S2.Student
15 WHERE S1.Sdept = S2.Sdept AND S2.Sname = ' 刘晨 ' ;
16 SELECT * FROM Student ;
17 -- -040查询选修了课程名为信息系统的学生学号和姓名----------------------------
18 SELECT Sno,Sname
19 FROM Student
20 WHERE Sno IN
21 (
22 SELECT Sno
23 FROM SC
24 WHERE Cno IN
25 (
26 SELECT Cno
27 FROM Course
28 WHERE Cname = ' 信息系统 '
29 )
30 );
31 -- -采用复合查询--------------------------------------------------------
32 SELECT Student.Sno,Student.Sname
33 FROM Student,Course,SC
34 WHERE Student.Sno = SC.Sno AND Course.Cno = SC.Cno AND Cname = ' 信息系统 ' ;
35 /*
36 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=
37 或< >)。
38 */
39 -- -041找出每个学生超过他选修课程平均成绩的课程号----------------------------
40 SELECT Sno,Cno,Grade
41 FROM SC X
42 WHERE Grade >=
43 (
44 SELECT AVG (Grade)
45 FROM SC Y
46 WHERE Y.Sno = X.Sno
47 );
48 SELECT * FROM SC;
49 SELECT SC.Sno, AVG (Grade) AS 平均分
50 FROM SC
51 GROUP BY Sno;
52 /*
53 带有ANY、ALL 谓词的子查询
54 谓词语义ANY:任意一个值;ALL:所有值。需要配合使用比较运算符:
55 > ANY 大于子查询结果中的某个值
56 > ALL 大于子查询结果中的所有值
57 < ANY 小于子查询结果中的某个值
58 < ALL 小于子查询结果中的所有值
59 >= ANY 大于等于子查询结果中的某个值
60 >= ALL 大于等于子查询结果中的所有值
61 <= ANY 小于等于子查询结果中的某个值
62 <= ALL 小于等于子查询结果中的所有值
63 = ANY 等于子查询结果中的某个值
64 =ALL 等于子查询结果中的所有值(通常没有实际意义)
65 !=(或<>)ANY 不等于子查询结果中的某个值
66 !=(或<>)ALL 不等于子查询结果中的任何一个值
67 */
68 -- -042查询其它系中比计算机科学某一学生年龄小的学生姓名和年龄------------------
69 SELECT Sname,Sage
70 FROM Student
71 WHERE Sdept <> ' CS ' AND Sage <ANY
72 (
73 SELECT Sage
74 FROM Student
75 WHERE Sdept = ' CS '
76 )
77 SELECT Sname,Sage
78 FROM Student
79 WHERE Sdept <> ' CS ' AND Sage <
80 (
81 SELECT MAX (Sage)
82 FROM Student
83 WHERE Sdept = ' CS '
84 );
85 SELECT * FROM Student ;
86 UPDATE Student
87 SET Sdept = ' IS '
88 WHERE Sno = ' 200215125 ' ;
89 -- -[例] 查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄-------------
90 USE Student_course;
91 SELECT Sname,Sage
92 FROM Student
93 WHERE Sdept <> ' CS '
94 AND Sage <ALL
95 (
96 SELECT Sage
97 FROM Student
98 WHERE Sdept = ' CS '
99 )
100 SELECT Sname,Sage
101 FROM Student
102 WHERE Sdept <> ' CS '
103 AND Sage <
104 (
105 SELECT MIN (Sage)
106 FROM Student
107 WHERE Sdept = ' CS '
108 );
109 SELECT * FROM Student;
110 /*
111 带有EXISTS 谓词的子查询
112 1. EXISTS 谓词
113 EXISTS 谓词代表存在量词 £¬带有EXISTS 谓词的子查询不返回任何数据,
114 只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则外层的
115 WHERE 子句返回真值;若内层查询结果为空,则外层的WHERE 子句返回假值。
116 由EXISTS 引出的子查询,其目标列表达式通常都用* ,因为带EXISTS 的
117 子查询只返回真值或假值,给出列名无实际意义。
118 2. NOT EXISTS 谓词
119 若内层查询结果非空,则外层的WHERE 子句返回假值
120 若内层查询结果为空,则外层的WHERE 子句返回真值
121 */
122 -- -[例]查询所有选修了号课程的学生姓名。------------------------------------
123 SELECT Sname
124 FROM Student
125 WHERE EXISTS
126 (
127 SELECT Sno -- Sno 可以改为---
128 FROM SC
129 WHERE Cno = ' 1 ' and Student.Sno = SC.Sno
130 );
131 SELECT * FROM Student;
132 SELECT * FROM SC;
133 -- -[例]查询没有选修号课程的学生姓名。--------------------------------------
134 SELECT Sname
135 FROM Student
136 WHERE NOT EXISTS
137 (
138 SELECT Sno -- Sno 可以改为*---
139 FROM SC
140 WHERE Cno = ' 1 ' and Student.Sno = SC.Sno
141 );
142 SELECT * FROM Student;
143 SELECT * FROM SC;
144 -- -[例] 查询选修了全部课程的学生姓名。-------------------------------------
145 INSERT INTO SC VALUES ( ' 200215121 ' , ' 4 ' , 100 )
146 INSERT INTO SC VALUES ( ' 200215121 ' , ' 5 ' , 90 )
147 INSERT INTO SC VALUES ( ' 200215121 ' , ' 6 ' , 800 )
148 INSERT INTO SC VALUES ( ' 200215121 ' , ' 7 ' , 70 )
149 SELECT Sname
150 FROM Student
151 WHERE NOT EXISTS
152 (
153 SELECT *
154 FROM Course
155 WHERE NOT EXISTS
156 (
157 SELECT *
158 FROM SC
159 WHERE Student.Sno = SC.Sno AND Course.Cno = SC.Cno
160 )
161 );
162 SELECT * FROM Student;
163 SELECT * FROM Course;
164 SELECT * FROM SC;
165 -- -删除四条数据----
166 DELETE
167 FROM SC
168 WHERE Sno = ' 200215121 ' AND Cno INT ( ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' ); -- 保持原始记录不变----
169 -- -[例]查询至少选修了学生选修的全部课程的学生号码。--------------------------
170 -- -不存在这样的课程y,学生选修了y,而学生x 没有选
171 /* 解题思路:用逻辑蕴函表达:查询学号为x 的学生,对所有的课程y,只要
172 200215122 学生选修了课程y,则x 也选修了y。 */
173 /* 形式化表示:
174 用P 表示谓词“学生选修了课程y”
175 用q 表示谓词“学生x 选修了课程y”
176 则上述查询为: ( ∀ y) p→q
177 */
178 /* 等价变换:
179 p→q ⇔ ¬p ∨q
180 ( ∀ y) (p→q) ⇔ ( ∀ y)( ¬p ∨q)
181 ⇔ (( )( )) y p q ¬ ∃ ∧¬ 变换后语义:不存在这样的课程y,学生选修了y,而学生x 没有选。
182 */
183 -- -不存在这样的课程y,学生选修了y,而学生x没有选-----------------------------
184 SELECT DISTINCT Sno
185 FROM SC SCX
186 WHERE NOT EXISTS
187 (
188 SELECT *
189 FROM SC SCY
190 WHERE Sno = ' 200215122 ' AND NOT EXISTS
191 (
192 SELECT *
193 FROM SC SCZ
194 WHERE SCZ.Sno = SCX.sno
195 AND SCZ.Cno = SCY.Cno
196 )
197 );
198 SELECT * FROM SC;
199
2 -- -039查询与刘晨在同一个系的学生-----------------------------------------
3 USE student_course
4 SELECT Sno,Sname,Sdept
5 FROM Student
6 WHERE Sdept IN
7 (
8 SELECT Sdept
9 FROM Student
10 WHERE Sname = ' 刘晨 '
11 );
12 USE student_course
13 SELECT S1.Sno,S1.Sname,S1.Sdept
14 FROM S1.Student,S2.Student
15 WHERE S1.Sdept = S2.Sdept AND S2.Sname = ' 刘晨 ' ;
16 SELECT * FROM Student ;
17 -- -040查询选修了课程名为信息系统的学生学号和姓名----------------------------
18 SELECT Sno,Sname
19 FROM Student
20 WHERE Sno IN
21 (
22 SELECT Sno
23 FROM SC
24 WHERE Cno IN
25 (
26 SELECT Cno
27 FROM Course
28 WHERE Cname = ' 信息系统 '
29 )
30 );
31 -- -采用复合查询--------------------------------------------------------
32 SELECT Student.Sno,Student.Sname
33 FROM Student,Course,SC
34 WHERE Student.Sno = SC.Sno AND Course.Cno = SC.Cno AND Cname = ' 信息系统 ' ;
35 /*
36 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=
37 或< >)。
38 */
39 -- -041找出每个学生超过他选修课程平均成绩的课程号----------------------------
40 SELECT Sno,Cno,Grade
41 FROM SC X
42 WHERE Grade >=
43 (
44 SELECT AVG (Grade)
45 FROM SC Y
46 WHERE Y.Sno = X.Sno
47 );
48 SELECT * FROM SC;
49 SELECT SC.Sno, AVG (Grade) AS 平均分
50 FROM SC
51 GROUP BY Sno;
52 /*
53 带有ANY、ALL 谓词的子查询
54 谓词语义ANY:任意一个值;ALL:所有值。需要配合使用比较运算符:
55 > ANY 大于子查询结果中的某个值
56 > ALL 大于子查询结果中的所有值
57 < ANY 小于子查询结果中的某个值
58 < ALL 小于子查询结果中的所有值
59 >= ANY 大于等于子查询结果中的某个值
60 >= ALL 大于等于子查询结果中的所有值
61 <= ANY 小于等于子查询结果中的某个值
62 <= ALL 小于等于子查询结果中的所有值
63 = ANY 等于子查询结果中的某个值
64 =ALL 等于子查询结果中的所有值(通常没有实际意义)
65 !=(或<>)ANY 不等于子查询结果中的某个值
66 !=(或<>)ALL 不等于子查询结果中的任何一个值
67 */
68 -- -042查询其它系中比计算机科学某一学生年龄小的学生姓名和年龄------------------
69 SELECT Sname,Sage
70 FROM Student
71 WHERE Sdept <> ' CS ' AND Sage <ANY
72 (
73 SELECT Sage
74 FROM Student
75 WHERE Sdept = ' CS '
76 )
77 SELECT Sname,Sage
78 FROM Student
79 WHERE Sdept <> ' CS ' AND Sage <
80 (
81 SELECT MAX (Sage)
82 FROM Student
83 WHERE Sdept = ' CS '
84 );
85 SELECT * FROM Student ;
86 UPDATE Student
87 SET Sdept = ' IS '
88 WHERE Sno = ' 200215125 ' ;
89 -- -[例] 查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄-------------
90 USE Student_course;
91 SELECT Sname,Sage
92 FROM Student
93 WHERE Sdept <> ' CS '
94 AND Sage <ALL
95 (
96 SELECT Sage
97 FROM Student
98 WHERE Sdept = ' CS '
99 )
100 SELECT Sname,Sage
101 FROM Student
102 WHERE Sdept <> ' CS '
103 AND Sage <
104 (
105 SELECT MIN (Sage)
106 FROM Student
107 WHERE Sdept = ' CS '
108 );
109 SELECT * FROM Student;
110 /*
111 带有EXISTS 谓词的子查询
112 1. EXISTS 谓词
113 EXISTS 谓词代表存在量词 £¬带有EXISTS 谓词的子查询不返回任何数据,
114 只产生逻辑真值“true”或逻辑假值“false”。若内层查询结果非空,则外层的
115 WHERE 子句返回真值;若内层查询结果为空,则外层的WHERE 子句返回假值。
116 由EXISTS 引出的子查询,其目标列表达式通常都用* ,因为带EXISTS 的
117 子查询只返回真值或假值,给出列名无实际意义。
118 2. NOT EXISTS 谓词
119 若内层查询结果非空,则外层的WHERE 子句返回假值
120 若内层查询结果为空,则外层的WHERE 子句返回真值
121 */
122 -- -[例]查询所有选修了号课程的学生姓名。------------------------------------
123 SELECT Sname
124 FROM Student
125 WHERE EXISTS
126 (
127 SELECT Sno -- Sno 可以改为---
128 FROM SC
129 WHERE Cno = ' 1 ' and Student.Sno = SC.Sno
130 );
131 SELECT * FROM Student;
132 SELECT * FROM SC;
133 -- -[例]查询没有选修号课程的学生姓名。--------------------------------------
134 SELECT Sname
135 FROM Student
136 WHERE NOT EXISTS
137 (
138 SELECT Sno -- Sno 可以改为*---
139 FROM SC
140 WHERE Cno = ' 1 ' and Student.Sno = SC.Sno
141 );
142 SELECT * FROM Student;
143 SELECT * FROM SC;
144 -- -[例] 查询选修了全部课程的学生姓名。-------------------------------------
145 INSERT INTO SC VALUES ( ' 200215121 ' , ' 4 ' , 100 )
146 INSERT INTO SC VALUES ( ' 200215121 ' , ' 5 ' , 90 )
147 INSERT INTO SC VALUES ( ' 200215121 ' , ' 6 ' , 800 )
148 INSERT INTO SC VALUES ( ' 200215121 ' , ' 7 ' , 70 )
149 SELECT Sname
150 FROM Student
151 WHERE NOT EXISTS
152 (
153 SELECT *
154 FROM Course
155 WHERE NOT EXISTS
156 (
157 SELECT *
158 FROM SC
159 WHERE Student.Sno = SC.Sno AND Course.Cno = SC.Cno
160 )
161 );
162 SELECT * FROM Student;
163 SELECT * FROM Course;
164 SELECT * FROM SC;
165 -- -删除四条数据----
166 DELETE
167 FROM SC
168 WHERE Sno = ' 200215121 ' AND Cno INT ( ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' ); -- 保持原始记录不变----
169 -- -[例]查询至少选修了学生选修的全部课程的学生号码。--------------------------
170 -- -不存在这样的课程y,学生选修了y,而学生x 没有选
171 /* 解题思路:用逻辑蕴函表达:查询学号为x 的学生,对所有的课程y,只要
172 200215122 学生选修了课程y,则x 也选修了y。 */
173 /* 形式化表示:
174 用P 表示谓词“学生选修了课程y”
175 用q 表示谓词“学生x 选修了课程y”
176 则上述查询为: ( ∀ y) p→q
177 */
178 /* 等价变换:
179 p→q ⇔ ¬p ∨q
180 ( ∀ y) (p→q) ⇔ ( ∀ y)( ¬p ∨q)
181 ⇔ (( )( )) y p q ¬ ∃ ∧¬ 变换后语义:不存在这样的课程y,学生选修了y,而学生x 没有选。
182 */
183 -- -不存在这样的课程y,学生选修了y,而学生x没有选-----------------------------
184 SELECT DISTINCT Sno
185 FROM SC SCX
186 WHERE NOT EXISTS
187 (
188 SELECT *
189 FROM SC SCY
190 WHERE Sno = ' 200215122 ' AND NOT EXISTS
191 (
192 SELECT *
193 FROM SC SCZ
194 WHERE SCZ.Sno = SCX.sno
195 AND SCZ.Cno = SCY.Cno
196 )
197 );
198 SELECT * FROM SC;
199