您的位置:首页 > 数据库

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

2015-12-27 11:10 609 查看
---查询每个学生及选修课程的情况

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息