SQL Server--数据查询(续)

  enmmm,上次主要写啦一些单表查询的内容,这次主要是多个表的查询(连接查询)。

  前面的查询都是针对一个表进行的。若一个查询同时涉及两个以上的表,则称之为连接查询。链接查询是关系数据库中最主要的查询,包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询等。

  在此,再附上查询的格式语句,方便查看和复习。

查询的一般格式为:

  SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
  FROM <表名或视图名>[,<表名或视图名>...]|(<SELECT 语句>)[AS]<别名>
  [WHERE<条件表达式>]
  [GROUP BY <列名1>[HAVING<条件表达式>]]
  [ORDER BY <列名2>[ASC|DESC]];

  首先把上次的剩下的一点GROUP BY写一下。

【例 3.48】查询成绩大于等于90分的学生学号和平均成绩。

下面是错误的:

select Sno,avg(Grade)
from SC
where avg(Grade)>=90
group by Sno;

在这里插入图片描述
应该为:

select Sno,avg(Grade)
from SC
group by Sno
having avg(Grade)>=80;

在这里插入图片描述

一、连接查询

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

  连接查询的 WHERE 子句中用来连接两个表的条件称为连接条件连接谓词,其一般格式为

  [<表名1>.] <列名1><比较运算符> [<表名2>.] <列名2>

  其中比较运算符主要有=,>,<,>=,<=,!=(或<>)等。

  当连接运算符为 = 时,称为等值连接。使用其他运算符称为费等值连接。其他运算符称为非等值连接。

  连接谓词中的列名称为连接字段。连接条件中的各连接字段必须是可比的,但名字不必相同。

【例 3.49】查询每个学生及其选修课程的情况。

   学生信息存储在Student表中,学生选课情况存放在SC表中,所以本査询实际上涉及Student与SC两个表。这两个表之间的联系是通过公共属性Sno实现的。

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

在这里插入图片描述
这里试一下*,和上面的是一样的,嗯嗯嗯。

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

在这里插入图片描述
这里如果把上面的那个where中的选择语句去掉,则会变成笛卡尔积

  select Student.*,SC.*
  from Student,SC;

在这里插入图片描述
enmmm,数据有点多,没弄全,知道这个意思就ok啦。

【例 3.50】 对【例3.49】用自然连接完成。

  select Student.Sno,Sname,Ssex,Sage,Sdep,Cno,Grade
  from Student,SC
  where Student.Sno=SC.Sno;

在这里插入图片描述
  当属性列在查询的所有表里面是唯一的就可以省略表名前缀,否则必须加上表名前缀。

  本例中,由于 Sname, Ssex, Sage, Sdept,Cno 和 Grade 属性列在 Student 表与 SC 表中是唯一的,因此引用时可以去掉表名前缀;而Sno在两个表都出现了,因此引用时须加上表名前綴。

  一条SQL语句可以同时完成选择和连接查询,这时 WHERE 子句是由连接谓词和选择谓词组成的复合条件。

【例 3.51】 査询选修2号课程且成绩在90分(包含90分)以上的所有学生的学号和姓名。

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

在这里插入图片描述
  该査询的一种优化(高效)的执行过程是,先从SC中挑选出Cno=2并且Grade>=90的元组形成一个中间关系,再和Student中满足连接条件的元组进行连接得到最终的结果关系。

2.自身连接

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

【例 3.52】査询每一门课的间接先修课(即先修课的先修课)

  在Course表中只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号査找它的先修课程。这就要将Course表与其自身连接

  为此,要为Course表取两个别名,一个是 first ,另一个是second。

  select first.Cno,second.Cpno
  from Course first,Course second
  where first.Cpno=second.Cno;

在这里插入图片描述
而标准SQL查询出来的结果是应该没有NULL的,如下图:
在这里插入图片描述
3.外连接

  在连接操作中,满足条件的元组才可以作为结果进行输出,不满足条件的就会被舍弃。有时我们想让元组在连接时不被舍弃,并且输出为NULL值。我们就要用到外连接

【例 3.53】左外连接

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

在这里插入图片描述
右外连接

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

在这里插入图片描述

  select Student.Sno,Sname,Ssex,Sage,Sdep,Cno,Grade
  from Student left outer join SC using (Sno);

在这里插入图片描述
应该是SQL Server不支持这个。。

4.多表连接

  连接操作除啦可以是两表连接、一个表其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接

【例 3.54】查询每个学生的学号、姓名、选修的课程名及成绩。

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

在这里插入图片描述
  关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。

二、感悟

  这次实验课题目比较少,老师上课也给演讲啦,实验重在实践,有些东西确实得上手才能发现问题,有些格式语句和规则得多加记忆。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁会没有丶遗憾呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值