SQL Server中查询语句sql等SQL Server2008

时间:2022-08-18 00:26:21

本次试验在sql2008环境下操作。具体内容见实验结果

--实验二查询

--()用SQL语句表示下列操作,在学生库中实现数据查询

--1.①求数学系学生的学号和姓名

SELECT SNO,SNAME FROM Student WHERE SDEPNO=

(SELECT SDEPNO FROM Department WHERE DNAME='数学系');

结果截图:

--2.②求选修了课程的学生学号

SELECT DISTINCT SNO FROM SC;

--3.求选修001号课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列

--在这里001课程号等价于c1课程

SELECT SNO,grade FROM SC WHERE CNO='c1' ORDER BY gradeDESC,SNO asc;

 

--4.④求选修课程001且成绩在80~90分之间的学生学号和成绩,并将成绩乘以系数0.8输出

--在这里001课程号等价于c1课程

SELECT SNO,grade,grade*0.8 FROM SC WHERE CNO='c1' ANDgrade>=80 AND grade<=90;

--⑤求数学系或计算机系姓张的学生的信息。

SELECT * FROM Student WHERE SNAME LIKE '张%' AND SDEPNO IN

(SELECT SDEPNO FROM Department WHERE DNAME='计算机工程系' OR DNAME='数学系' );

--⑥查看选修了课程、但没有成绩学生的学号、姓名、课程号和所在是系部。

SELECT Student.SNO,SNAME,SC.CNO,SDEPNO FROM Student,SC

 WHERE(Student.SNO= SC.SNO AND grade IS NULL);

--⑦查询学生的学号、姓名、课程名和成绩

SELECT DISTINCTStudent.SNO,SNAME,SC.CNO,SC.grade FROM Student,SC

 WHERE (Student.SNO= SC.SNO);

--⑧分别实现学生和系的交叉连接、内连接、外连接

----1.学生和系的交叉连接

SELECT * FROMStudent CROSS JOIN Department;

----2.学生和系的内连接

SELECT * FROMStudent INNER JOIN Department ON Student.SDEPNO=Department.SDEPNO;

----3.学生和系的外连接(左外连接)

SELECT * FROMStudent LEFT OUTER JOIN Department ON Student.SDEPNO=Department.SDEPNO;

----3.学生和系的外连接(右外连接)

SELECT * FROMStudent RIGHT OUTER JOIN Department ON Student.SDEPNO=Department.SDEPNO;

--(2)在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作

--(1)求选修了高等数学的学生学号和姓名

 SELECT SNO,SNAME FROM Student WHERE SNO IN

 (SELECT SNO FROM SC WHERE CNO IN

 (SELECT CNO FROM Course WHERE CNAME='高等数学'));

--(2)求001课程的成绩高于张力的学生学号和成绩

----在这里001课程号等价于c1课程

SELECTStudent.SNO,grade FROM Student,SC WHERE Student.SNO=SC.SNO AND CNO='c1' ANDgrade>

(SELECT grade FROMSC WHERE SNO IN

(SELECT SNO FROMStudent WHERE SNAME='张力'));

在此特意修改该学号13205411的选修课c4àc1以便满足查询条件

结果:

--(3)求其他系中年龄小于计算机系年龄最大者的学生

--方法一:

 

SELECT * FROMStudent WHERE SDEPNO NOT IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系')

AND  AGE <ANY

(SELECTMAX(Student.AGE) FROM Student WHERE SDEPNO IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系'));

 

--方法二:

SELECT * FROMStudent WHERE SDEPNO<>

(SELECT SDEPNO FROMDepartment WHERE DNAME='计算机工程系')

AND AGE <ANY

(SELECT AGE FROMStudent WHERE SDEPNO IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系'));

--(4)求其他系中比计算机系学生年龄都小的学生

 

SELECT * FROM Student WHERE SDEPNO<>

(SELECT SDEPNO FROM Department WHERE DNAME='计算机工程系')

AND AGE <ALL

(SELECT AGE FROM Student WHERE SDEPNO IN

(SELECT SDEPNO FROM Department WHERE DNAME='计算机工程系'));

--(5)求选修了001课程的学生姓名

----在这里001课程号等价于c1课程

 

SELECT SNAME FROMSC,Student WHERE sc.SNO=Student.SNO AND CNO IN

(SELECT CNO FROMSC WHERE CNO='c1');

--(6)求没有选修001课程的学生姓名

----在这里001课程号等价于c1课程

 

SELECT SNAME FROMSC,Student WHERE sc.SNO=Student.SNO AND CNO NOT IN

(SELECT CNO FROMSC WHERE CNO='c1');

--(7)查询选修了全部课程的学生的姓名

 

SELECT SNAME FROMStudent WHERE NOT EXISTS(

            SELECT * FROM Course WHERE NOTEXISTS(

            SELECT * FROM SC WHERECourse.CNO=SC.CNO AND SC.SNO=Student.SNO));


--实验二查询

--()用SQL语句表示下列操作,在学生库中实现数据查询

--1.①求数学系学生的学号和姓名

SELECT SNO,SNAME FROM Student WHERE SDEPNO=

(SELECT SDEPNO FROM Department WHERE DNAME='数学系');

结果截图:

SQL Server中查询语句sql等SQL Server2008

SQL Server中查询语句sql等SQL Server2008

SQL Server中查询语句sql等SQL Server2008


--⑦查询学生的学号、姓名、课程名和成绩

SELECT DISTINCTStudent.SNO,SNAME,SC.CNO,SC.grade FROM Student,SC

 WHERE (Student.SNO= SC.SNO);

SQL Server中查询语句sql等SQL Server2008

----3.学生和系的外连接(右外连接)

SELECT * FROMStudent RIGHT OUTER JOIN Department ON Student.SDEPNO=Department.SDEPNO;

--(2)在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作

--(1)求选修了高等数学的学生学号和姓名

 SELECT SNO,SNAME FROM Student WHERE SNO IN

 (SELECT SNO FROM SC WHERE CNO IN

 (SELECT CNO FROM Course WHERE CNAME='高等数学'));

--(2)求001课程的成绩高于张力的学生学号和成绩

----在这里001课程号等价于c1课程

SELECTStudent.SNO,grade FROM Student,SC WHERE Student.SNO=SC.SNO AND CNO='c1' ANDgrade>

(SELECT grade FROMSC WHERE SNO IN

(SELECT SNO FROMStudent WHERE SNAME='张力'));

在此特意修改该学号13205411的选修课c4àc1以便满足查询条件

结果:

--(3)求其他系中年龄小于计算机系年龄最大者的学生

--方法一:

 

SELECT * FROMStudent WHERE SDEPNO NOT IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系')

AND  AGE <ANY

(SELECTMAX(Student.AGE) FROM Student WHERE SDEPNO IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系'));

 

--方法二:

SELECT * FROMStudent WHERE SDEPNO<>

(SELECT SDEPNO FROMDepartment WHERE DNAME='计算机工程系')

AND AGE <ANY

(SELECT AGE FROMStudent WHERE SDEPNO IN

(SELECT SDEPNOFROM Department WHERE DNAME='计算机工程系'));

--(4)求其他系中比计算机系学生年龄都小的学生

 

SELECT * FROM Student WHERE SDEPNO<>

(SELECT SDEPNO FROM Department WHERE DNAME='计算机工程系')

AND AGE <ALL

(SELECT AGE FROM Student WHERE SDEPNO IN

(SELECT SDEPNO FROM Department WHERE DNAME='计算机工程系'));

--(5)求选修了001课程的学生姓名

----在这里001课程号等价于c1课程

 

SELECT SNAME FROMSC,Student WHERE sc.SNO=Student.SNO AND CNO IN

(SELECT CNO FROMSC WHERE CNO='c1');

--(6)求没有选修001课程的学生姓名

----在这里001课程号等价于c1课程

 

SELECT SNAME FROMSC,Student WHERE sc.SNO=Student.SNO AND CNO NOT IN

(SELECT CNO FROMSC WHERE CNO='c1');

--(7)查询选修了全部课程的学生的姓名

 

SELECT SNAME FROMStudent WHERE NOT EXISTS(

            SELECT * FROM Course WHERE NOTEXISTS(

            SELECT * FROM SC WHERECourse.CNO=SC.CNO AND SC.SNO=Student.SNO));

 

五、出现的问题及解决的方法

a)       Sql语句的不熟悉,解决方案:多熟悉sql语句,多实践

b)       SQLServer企业管理器和查询分析器工具的使用还是比较生疏,解决方案:多实践

c)       查询语句的语法结构不熟悉,需要特别掌握

d)      数据之间的逻辑关系需要把握正确

e)       当所需条件的返回值不唯一时,对应的查询条件需要注意,用in 、exists等去解决

f)        对于多条件及嵌套查询语句需要特别掌握

g)      对于否定之否定表肯定语句需要多加练习,如该语句

(7)查询选修了全部课程的学生的姓名

SELECT SNAME FROMStudent WHERE NOT EXISTS(

            SELECT * FROM Course WHERE NOTEXISTS(

            SELECT * FROM SC WHERECourse.CNO=SC.CNO AND SC.SNO=Student.SNO));

h)     理应多掌握数据库常用的语句语法

i)        对于连接有如下总结:

1)       连接查询方式有: 

内连接、外连接(左连接、右连接、全连接)、交叉连接 

2)       内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种: 

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 

2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。 

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

3)       外连接 

返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行

4)       交叉连接 

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行

5)       左连接和右连接的区别: 

左连接以左表为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配,则显示为NULL;右连接刚好相反。 全连接就是先以左表进行左外连接,然后以右表进行右外连接。 说明:所谓的基本,就是以某张表的限制条件查询条件为准! 

j)        对于IN、比较符、ANY或ALL和EXISTS操作符的作用有如下总结:

1.) 可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是与 ANY 等效的

2.) 通过修改的比较运算符引入的子查询返回零个值或多个值的列表,并且可以包括 GROUP BY 或 HAVING 子句。这些子查询可以用 EXISTS 重新表述。

3.) 以 > 比较运算符为例,>ALL表示大于每一个值。换句话说,它表示大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,即大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。

4.) 若要使带有 >ALL 的子查询中的行满足外部查询中指定的条件,引入子查询的列中的值必须大于子查询返回的值列表中的每个值。

5.) 同样,>ANY 表示要使某一行满足外部查询中指定的条件,引入子查询的列中的值必须至少大于子查询返回的值列表中的一个值。