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 相关文章推荐
SQL Server中交叉联接的用法详解
Apr 22 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
sql中mod()函数取余数的用法
May 29 SQL Server
SQLServer中JSON文档型数据的查询问题解决
Jun 27 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server删除表中的重复数据
May 25 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中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
json定义及jquery操作json的方法
2016/09/29 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
自我评价范文点评
2013/12/04 职场文书
金融管理应届生求职信
2014/02/20 职场文书
会计岗位描述
2014/02/22 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
小学英语教学随笔
2015/08/14 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python