2021-4-5课程——SQL Server查询【3】

本篇内容继续上篇的查询【2】,表仍然是那三张表。本篇主要总结分组查询(续)、连接查询。依旧采用先展示SQL语句,再展示测试效果的方式。

Posted in SQL Server onApril 05, 2021
 
一、GROUP BY子句(续)

where子句与having短语的区别在于作用对象不同,where子句作用域基本表或视图,从中选择满足条件的元组。having短语作用于组,从中选择满足条件的组。

例1:查询平均成绩大于等于86分的学生学号和平均成绩

错误的查询语句:
select Sno,avg(Grade)
from SC
where avg(Grade)>=86
group by Sno;

报错内容为如以下所示,原因就在于where子句中是不能用聚集函数作为条件表达式的

2021-4-5课程——SQL Server查询【3】

正确的查询语句:
select Sno,avg(Grade)
from SC
group by Sno
having avg(Grade)>=86;

2021-4-5课程——SQL Server查询【3】

二、连接查询

连接查询是关系数据库中最主要的查询,包括等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询和复合条件连接查询等。

1.等值与非等值连接查询

连接查询的where子句中用来连接两个表的条件称为连接条件连接谓词。其中,当连接于算符为=号时,称为等值连接。使用其他运算符称为非等值连接。连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。

例1:查询每个学生及其选修课程的情况
两个表之间的联系是通过公共属性Sno实现的

select Student.*,SC.*
from Student,SC
where Student.Sno=SC.Sno;

上述中,对属性名都加了表名前缀,避免引起混淆,如果属性名是唯一的,则可以省略。且查询时对Student和SC都加了*号,如果只写一个,可以发现效果是一样的,因为结果的查询是基于SC表的,因为SC表中Sno要么为空要么来自于Student表中存在的Sno

2021-4-5课程——SQL Server查询【3】
补充数据库管理系统执行该连接操作的一种可能过程,以便更好的理解数据库的内部工作和原理,更加方便记忆:首先在表Student中找到第一个元组,然后从头开始扫描SC表,逐一查询与Student第一个元组的Sno相等的SC元组,找到后就将Student中的第一个元组与该元组拼接起来,形成结果表中一个元组。SC表全部查找完后,再找Student中第二个元组,然后再从头开始扫描,逐一查询满足条件的,反复重复该过程,直到处理完毕为止。这是嵌套循环连接算法的思想。
上述的算法在查找时运行效率较低,这里再介绍一种更加高效的算法,叫做排序合并法(SORT MERGE),简述一下它的原理:首先按连接属性对表进行排序,然后从表1中第一个元组开始,在表2中查找与之连接属性相等的元组,直到不符合为止,此时就停止查找。然后从表1的第二个元组开始,在表2中接着上次的查找继续进行,直到不符合为止。该算法和嵌套循环相比,对表2的遍历查找次数少了很多,第二个只需要一次,而第一个每有一个表1元组,就要遍历一次表2.

例2:对例1用自然连接完成

自然连接:在等值连接中把目标列中重复的属性列去掉。
select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student,SC
where Student.Sno=SC.Sno;

2021-4-5课程——SQL Server查询【3】
与非自然连接的对比如下:

2021-4-5课程——SQL Server查询【3】
例3:查询选修2号课程且成绩在86分以上的所有学生的学号和姓名

select Student.Sno,Sname
from Student,SC
where Student.Sno=SC.Sno
and
SC.Cno='2'
and SC.Grade>=90;

2021-4-5课程——SQL Server查询【3】

2.自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。

例1:查询每一门课的间接先修课(即先修课的先修课)
由于是对同一个表进行操作,且查找连接条件,这就要求要对表起别名,防止混淆。对Course表起两个别名,一个是Course1,一个是Course2。两张表中的数据一样,其实都是Course表

select Course1.Cno,Course2.Cpno
from Course Course1,Course Course2
where Course1.Cpno=Course2.Cno;

2021-4-5课程——SQL Server查询【3】

3.外连接

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,不满足的就直接舍弃掉了,这样做可能会舍弃掉一些我们关心的数据,而外连接就可以解决这个问题。外连接一般会选择某个表作为主体,这样输出时,该表中的数据就都会输出(包括连接查询时结果为空的那一行)。

例1:改写查询每个学生及其选修课程的情况
想要查看每个学生的情况,这时以Student表为主表就会比较合适,因此可以使用左连接

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student
left outer join SC
on(Student.Sno=SC.Sno);

可以通过下图查看不同

2021-4-5课程——SQL Server查询【3】
此外,可以使用USING来去掉结果中的重复值,但在SQL Server中是不允许的,在mysql中可以。

变式:使用右外连接

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student
right outer join SC
on(Student.Sno=SC.Sno);

2021-4-5课程——SQL Server查询【3】
二者对比如下:上边为左外连接,下边为右外连接

2021-4-5课程——SQL Server查询【3】

4.多表连接

连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,此时称为多表连接。一般涉及到哪几个表中的数据,就要写几个表,同时要给出连接的条件。

例:查询每个学生的学号、姓名、选修的课程名及成绩
注意,连接条件不要少,否则对应不上

select Student.Sno,Sname,Cname,Grade
from Student,SC,Course
where Student.Sno=SC.Sno
and
SC.Cno=Course.Cno;

2021-4-5课程——SQL Server查询【3】
虽然是多表操作,涉及多张表,但本质上它还是先进行两个表的连接操作,再将其与第三张表进行连接(前两张表查询的结果表与第三张表,这实际上上也是两张表的连接查询操作,以此类推即可)

三、课程感悟

本次实验课内容较为简单,老师讲的也很明白,有的也亲自示范了一遍,所以自己再做起来,并结合着课本上的例子,就会容易很多。虽然查询出意料之中的结果不难,但要记忆的内容仍然很多,如基本格式,还有一些细节,where子句中不能使用聚集函数等,仍然需要加强练习和记忆,希望自己可以学的更好,效率更高!

人们常觉得准备的阶段是在浪费时间,只有当真正机会来临,而自己没有能力把握的时候,才能觉悟自己平时没有准备才是浪费了时间。——法国:罗曼·罗兰
SQL Server 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021-4-3课程——SQL Server查询【2】
SQL Server数据定义——模式与基本表操作
SQL Server基本使用和简单的CRUD操作
SQL Server 数据库实验课第五周——常用查询条件
Sql-Server数据库单表查询 4.3实验课
【HBU】数据库第四周 单表查询
You might like
php 无限分类的树类代码
2009/12/03 PHP
浅析php数据类型转换
2014/01/09 PHP
php+highchats生成动态统计图
2014/05/21 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
vue.js实现简单购物车功能
2020/05/30 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
python如何制作英文字典
2019/06/25 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
学习经验交流会主持词
2014/04/01 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python