SQL Server 数据查询 --- 复杂查询
/********************************************
例1查询每个学生及其选修课程的情况
*********************************************/
1 SELECT STUDENT.*,SC.* FROM SC,STUDENT WHERE SC.SNO = STUDENT.SNO;
/********************************************
对例1用自然连接完成
*********************************************/
1 SELECT STUDENT.SNAME,STUDENT.SSEX,STUDENT.SAGE,STUDENT.SDEPT,SC.* 2 FROM SC,STUDENT 3 WHERE SC.SNO = STUDENT.SNO;
/*****************************************
查询每一门课程的间接先修课
*****************************************/
1 SELECT SY.CNO,SX.CPNO FROM COURSE SX,COURSE SY WHERE SX.CNO = SY.CPNO
/********************************************
对例1用左外连接连接完成
*********************************************/
1 SELECT STUDENT.SNAME,STUDENT.SSEX,STUDENT.SAGE,STUDENT.SDEPT,SC.* 2 FROM STUDENT LEFT JOIN SC ON(SC.SNO = STUDENT.SNO);
/********************************************
查询每个学生的学号、姓名、选修的课程名及成绩 *********************************************/
1 SELECT STUDENT.SNO,STUDENT.SNAME,COURSE.CNAME,COURSE.CCREDIT 2 FROM SC,STUDENT,COURSE 3 WHERE SC.CNO =COURSE.CNO AND SC.SNO = STUDENT.SNO;
/********************************************
查询与刘晨在同一个系学习的学生
*********************************************/
1 SELECT SX.* 2 FROM STUDENT SX 3 WHERE SX.SDEPT IN ( 4 SELECT SY.SDEPT FROM STUDENT SY WHERE SY.SNAME='刘晨' 5 );
/************
或者如下:
1 SELECT SX.* 2 FROM STUDENT SX, STUDENT SY 3 WHERE SX.SDEPT = SY.SDEPT AND SY.SNAME = '刘晨';
或者:
1 SELECT * 2 FROM STUDENT SX 3 WHERE EXISTS ( 4 SELECT * FROM STUDENT SY WHERE SY.SDEPT = SX.SDEPT AND SY.SNAME='刘晨' 5 );
**************/
/********************************************
查询选修了课程名为"信息系统"的学生学号和姓名 *********************************************/
1 SELECT SNO, SNAME 2 FROM STUDENT 3 WHERE SNO IN ( 4 SELECT SNO FROM SC 5 WHERE CNO IN ( 6 SELECT CNO FROM COURSE 7 WHERE CNAME = '信息系统' 8 ) 9 );
/********************************************
找出每个学生超过他选修课程平均成绩的课程号
*********************************************/
1 SELECT SX.SNO,SX.CNO 2 FROM SC SX 3 WHERE SX.GRADE > ( 4 SELECT AVG(GRADE) 5 FROM SC SY 6 WHERE SX.SNO = SY.SNO 7 );
/*****************************************************
查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄
*******************************************************/
1 SELECT SNAME, SAGE 2 FROM STUDENT 3 WHERE SAGE < ANY ( 4 SELECT SAGE 5 FROM STUDENT 6 WHERE SDEPT='CS' 7 ) 8 AND SDEPT<>'CS';
/*****************************************************
查询其他系中比计算机科学系所有学生年龄小的学生姓名和年龄
*******************************************************/
1 SELECT SNAME, SAGE 2 FROM STUDENT 3 WHERE SAGE < ALL ( 4 SELECT SAGE 5 FROM STUDENT 6 WHERE SDEPT='CS' 7 ) 8 AND SDEPT<>'CS';
/*****************************************************
查询所有选修了1号课程的学生姓名
*******************************************************/
1 SELECT SNAME 2 FROM STUDENT 3 WHERE EXISTS ( 4 SELECT * FROM SC 5 WHERE SC.SNO = STUDENT.SNO AND SC.CNO='1' 6 );
/******************************************
查询选修了全部课程的学生姓名
*******************************************/
1 SELECT SNAME 2 FROM STUDENT 3 WHERE NOT EXISTS ( 4 SELECT * 5 FROM COURSE 6 WHERE NOT EXISTS ( 7 SELECT * 8 FROM SC 9 WHERE STUDENT.SNO = SC.SNO AND COURSE.CNO = SC.CNO 10 ) 11 );
/*****************************************************
查询至少选修了学生200215122选修的全部课程的学生号码
*****************************************************/
1 SELECT DISTINCT SNO 2 FROM SC X 3 WHERE NOT EXISTS ( 4 SELECT * 5 FROM SC Y 6 WHERE SNO='200215122' AND NOT EXISTS ( 7 SELECT * 8 FROM SC Z 9 WHERE Z.SNO = X.SNO AND Y.CNO = Z.CNO 10 ) 11 );
/**********************************************************
从自身表中选择一条记录,修改某个字段再回插到自身表中
这里的INSERT INTO 可以用来插入子查询 *********************************************************/
1 INSERT INTO COURSE(CNO,CNAME,CPNO,CCREDIT) 2 SELECT '8',CNAME,CPNO,CCREDIT FROM COURSE WHERE CNO='2';