使用视图可视化工具进行子查询的结果辨析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高教论坛
视图是一张虚拟表,
是存储在数据库中的查询的SQL语句,与此相关的数据并没有再存一份于数据库中。
通过视图看到的数据仍然存放在基表中。
视图看上去非常像数据库中的物理表,对它的操作同物理表一样。
视图简化用户对数据的理解,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
视图也简化了数据操作,从很大程度上提高了查询速度。
查询是数据库应用最主要的操作,使用视图可视化工具提高查询效率是经常使用的方法,因为使用视图可视化工具经过拖、拉、点、放的操作就能够完成查询,并自动生成查询语句和查询结果。
1准备数据库表的用例
本文使用SQLServer2008在学生成绩数据库studentscore中创建三张表:学生表t_student,课程表t_course,成绩表t_score,代码如下:
USEstudentscoreGO
CREATETABLEt_student(
snochar(10)primarykey,snamenchar(10)NULL,
ssexchar(2)DEFAULT'男'NULL,sbirthdaysmalldatetimeUNIQUENULL)GO
CREATETABLEt_course(
cnochar(10)primarykey,cnamenchar(30)NULL)GO
CREATETABLEt_score(
snochar(10)REFERENCESt_student(sno)NOTNULL,cnochar(10)REFERENCESt_course(cno)NOTNULL,
scoretinyintNULL)
创建完成后在三张表中输入符合要求的数据,数据内容在此省略。
2进行IN子查询
子查询在一个查询语句中嵌套另一个查询,也就是在一个查询语句中可以使用另一个查询的结果。
子查询常用的关键字是IN、EXISTS、ALL、ANY等。
本例进行IN子查询,查询没有选修“数据库”课程的的学生的学号、姓名、性别。
代码如下:
USEstudentscore
SELECTsno,sname,ssexFROMt_studentWHEREsnoNOTIN(SELECTsnoFROMt_scoreWHEREcnoIN(SELECTcnoFROMt_courseWHEREcname='数据库'))
上述查询嵌套2层,先在课程表t_course中查询“数据库”课程的课程编号,然后再成绩表t_score中查询选修了“数据库”课程的学生的学号,最后通过在学生表t_student中排除了选修“数据库”课程的学号之后就是要查询的结果。
3使用视图可视化工具生成查询语句
使用视图可视化工具提高查询效率是经常使用的方法。
手工的编
写SQL语句容易出错,同时增加调试SQL语句的复杂性。
在此使用SQLServer2008数据库管理系统的视图可视化工具来生成SQL语句,方便并且不容易出错。
打开SQLServerManagementStudio,在学生成绩数据库stu-dentscore中创建视图。
添加学生表t_student,课程表t_course和成绩表t_score。
按照数据库表用例的准备,成绩表t_score和学生表t_student通过学号sno建立主外键关系,也和课程表t_course通过课程编号cno建立主外键关系。
这两个主外键关系在视图可视化工具中可以显示出来。
在视图可视化工具的代码区域,上述两个主外键关系自动转换为内连接INNERJOIN。
按照前面的查询要求,查询没有选修“数据库”课程的的学生的学号、姓名、性别。
所以,在视图可视化工具的表区域,勾选学生表t_stu-dent的列:学号sno,姓名sname和性别ssex,同时勾选课程表t_course的课程名称列cname。
接着,在视图可视化工具的列区域去掉课程名称列cname的输出,仅在这一列的筛选器上输入筛选条件:<>N'数据库'。
完成上述操作之后就可以得到查询语句,执行视图,可以得到查询结果。
查询语句代码如下:
SELECTdbo.t_student.sno,dbo.t_student.sname,dbo.t_student.ssexFROMdbo.t_courseINNERJOINdbo.t_scoreONdbo.t_course.cno=dbo.t_score.cnoINNERJOINdbo.t_studentONdbo.t_score.sno=dbo.t_student.snoWHERE(dbo.t_course.cname<>N'数据库')
4两种查询结果的辨析两种查询语句完全不同,查询结果可能相同,也可能不同,哪一个是正确的呢。
使用IN进行嵌套子查询逻辑上是层层推进的,最终在学生表t_student中排除了选修“数据库”课程的学号之后得到要查询的结果。
使用视图可视化工具得到的查询,逻辑上是选修的课程不是“数据库”课程的学生的学号、姓名和性别。
如果某个学生既选修了“数据库”课程,也选修了“程序设计”课程,那么也可以查询出这个同学的学号、姓名和性别。
因为他选修的“程序设计”课程符合<>N'数据库'的筛选条件。
使用IN进行嵌套子查询也可以查询出学生表t_student中没有选修任何课程的学生的学号、姓名和性别,这是符合查询要求的。
但是,在使用视图可视化工具得到的查询中,就不能查询出这个结果。
原因是视图可视化工具中的三张表内连接在一起,而没有选修任何课程的学生记录是不能直接内连接到成绩表t_score上的,当然也就不能间接的和课程表t_course产生关系。
使用视图可视化工具得到的查询只在三张表内连接的基础上进行筛选。
其实当把嵌套子查询的代码复制到视图可视化工具的代码区域,执行视图之后,在表区域只能看到一个表———学生表t_student,说明嵌套查询的执行顺序是由里至外的。
结束语
视图可视化工具给使用者带来了直观、便利和灵活性的体验,用来提高查询效率是经常使用的方法,但是,对于嵌套的子查询,使用视图可视化工具却得到错误的结果,应该引起数据库使用人员的注意。
参考文献
[1]梁爽.SQL Server 2008数据库应用技术(项目教学版)[M].北京:清华大学出版社,2013.
[2]张洪举等.锋利的SQL (第二版)[M].北京:人民邮电出版社,2015.[3]田彬等.SQL 宝典[M].北京:电子工业出版社,2013.
使用视图可视化工具进行子查询的结果辨析
李武韬
(常州信息职业技术学院经贸管理学院,江苏常州213164)
摘要:使用视图可视化工具进行查询是方便和直观的,但是视图可视化工具不能完成所有的查询。
通过举例来说明:在使用视图可
视化进行子查询时,结果不是所期望的,并对两者的不同结果进行辨析。
关键词:SQL ;视图;子查询96··。