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 05 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
Jul 07 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
详解SQL报错盲注
Jul 23 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
Linux常见面试题
2013/03/18 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
物业总经理岗位职责
2014/02/28 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
博士导师推荐信
2015/03/25 职场文书
庆七一主持词
2015/06/29 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python