SQL语句,多表查询,连接查询,嵌套查询,集合操作,有IN谓词,有比较运算符,有ANY\EXIST谓词的查询

来源:互联网 发布:网络测试好学吗 编辑:程序博客网 时间:2024/06/05 04:39


---查询每个学生及选修课程的情况

SELECT S.*,SC.* 

FROM S,SC
WHERE S.SNO=SC.SNO;
---查询每个学生及选修课程,这个是用自然连接弄的,结果同上
SELECT S.SNO,SNAME,SEX,AGE,SDEPT,CNO,GRADE 
FROM S,SC
WHERE S.SNO=SC.SNO;
---查询每一门课的间接先修课程
SELECT FIRST.CNO,SECOND.CPNO
FROM C FIRST,C SECOND
WHERE FIRST.CPNO=SECOND.CNO;
/*利用外连接改写上一个语句
SELECT S.SNO,SNAME,SEX,AGE,SDEPT,CNO,GRAGE
FROM S LEFT OUT JOIN SC ON(S.SNO=SC.SNO);
FROM S LEFT OUT JOIN SC USING(SNO);*/
--查询选修2号课程而且成绩在90分以上的所有学生的学号姓名
SELECT S.SNO,SNAME
FROM S,SC
WHERE S.SNO=SC.SNO AND SC.CNO='2' AND SC.GRADE>90;
--查询每个学生的学号、姓名、选修的课程名和成绩
SELECT S.SNO,SNAME,CNAME,GRADE
FROM S,SC,C
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO;
--查询选修2号课程的学生学生姓名
SELECT SNAME
FROM S
WHERE SNO IN
(SELECT SNO
FROM SC
WHERE CNO='2');
--查询刘晨在同一个系学习的学生
SELECT SNO,SNAME,SDEPT
FROM S
WHERE SDEPT IN
(SELECT SDEPT
FROM S
WHERE SNAME='刘晨'
);
--查询刘晨在同一个系学习的学生,利用自身连接来完成
SELECT S1.SNO,S1.SNAME,S1.SDEPT
FROM S S1,S S2
WHERE S1.SDEPT=S2.SDEPT AND S2.SNAME='刘晨';
--查询选了信息系统这门课的学生学号和姓名
SELECT SNO,SNAME
FROM S
WHERE SNO IN
(SELECT SNO
FROM SC
WHERE CNO IN
(SELECT CNO
FROM C
WHERE CNAME='信息系统'
)
);
--查询刘晨在同一个系学习的学生
SELECT SNO,SNAME,SDEPT
FROM S
WHERE SDEPT=
(SELECT SDEPT
FROM S
WHERE SNAME='刘晨'
);
--查询每个学生超过他选修课程平均成绩的课程号
SELECT SNO,CNO
FROM SC X
WHERE GRADE>=
(SELECT AVG(GRADE)
FROM SC Y
WHERE Y.SNO=X.SNO
);
--查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄
SELECT SNAME,AGE
FROM S
WHERE AGE<ANY(SELECT AGE
FROM S
WHERE SDEPT='CS')
AND SDEPT<>'CS';
--查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄,使用聚集函数来实现
SELECT SNAME,AGE
FROM S
WHERE AGE<
(SELECT MAX(AGE)
FROM S
WHERE SDEPT='CS')
AND SDEPT<>'CS';
--查询其他系中比计算机科学系所有学生年龄都小的学生姓名和年龄
SELECT SNAME,AGE
FROM S
WHERE AGE<ALL
(SELECT AGE
FROM S
WHERE SDEPT='CS')
AND SDEPT<>'CS';
--查询其他系中比计算机科学系所有学生年龄都小的学生姓名和年龄,使用聚集函数来实现
SELECT SNAME,AGE
FROM S
WHERE AGE<
(SELECT MIN(AGE)
FROM S
WHERE SDEPT='CS')
AND SDEPT<>'CS';
---查询所有选修了1号课程的学生姓名
SELECT SNAME
FROM S
WHERE EXISTS
(SELECT *
FROM SC
WHERE SNO=S.SNO AND CNO='1');
---查询所有没有选修了1号课程的学生姓名
SELECT SNAME
FROM S
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SNO=S.SNO AND CNO='1');
--查询刘晨在同一个系学习的学生,解法4
SELECT SNO,SNAME,SDEPT
FROM S S1
WHERE EXISTS
(SELECT *
FROM S S2
WHERE S2.SDEPT=S1.SDEPT AND S2.SNAME='刘晨');
--查询选修了全部课程的学生姓名
SELECT SNAME
FROM S
WHERE NOT EXISTS
(SELECT *
FROM C
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SNO=S.SNO AND CNO=C.CNO));
--查询至少选修了学生200915122选修的全部课程的学生学号
SELECT DISTINCT SNO
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.SNO='200915122' AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO));
--查询计算机科学系的学生及年龄不大于19岁的学生信息
SELECT *
FROM S
WHERE SDEPT='CS'
UNION
SELECT *
FROM S
WHERE AGE<=19;
--查询1号课程或者2号课程的全体学生
SELECT SNO
FROM SC
WHERE CNO='1'
UNION
SELECT SNO
FROM SC
WHERE CNO='2';
--查询计算机科学系的学生与年龄不大于19岁的学生的交集
SELECT *
FROM S
WHERE SDEPT='CS'
INTERSECT
SELECT *
FROM S
WHERE AGE<=19;
--查询计算机科学系的学生与年龄不大于19岁的学生的交集,另外一种做法
SELECT *
FROM S
WHERE SDEPT='CS' AND AGE<=19;
--查询既选修了1号课程又选修了2号课程的全体学生
SELECT SNO
FROM SC
WHERE CNO='1'
INTERSECT
SELECT SNO
FROM SC
WHERE CNO='2'
--查询既选修了1号课程又选修了2号课程的全体学生,另一种解法
SELECT SNO
FROM SC
WHERE CNO='1' AND SNO IN
(SELECT SNO
FROM SC
WHERE CNO='2');
/*查询计算机科学系的学生与年龄不大于19岁的学生的差集
SELECT *
FROM S
WHERE SDEPT='CS'
EXCEPT
SELECT *
FROM S
WHERE AGE<=19;*/
--查询计算机科学系的学生与年龄不大于19岁的学生的差集,也就是查询年龄大于19岁的学生
SELECT *
FROM S
WHERE SDEPT='CS' AND AGE>19;
0 0
原创粉丝点击