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;

sql server查看数据表的关联 sql server 关联查询_表名


应该为:

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

sql server查看数据表的关联 sql server 关联查询_表名_02

一、连接查询

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

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

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

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

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

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

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

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

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

sql server查看数据表的关联 sql server 关联查询_等值连接_03


这里试一下*,和上面的是一样的,嗯嗯嗯。

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

sql server查看数据表的关联 sql server 关联查询_等值连接_04


这里如果把上面的那个where中的选择语句去掉,则会变成笛卡尔积

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

sql server查看数据表的关联 sql server 关联查询_sql server查看数据表的关联_05


enmmm,数据有点多,没弄全,知道这个意思就ok啦。

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

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

sql server查看数据表的关联 sql server 关联查询_sql server查看数据表的关联_06


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

  本例中,由于 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;

sql server查看数据表的关联 sql server 关联查询_表名_07


  该査询的一种优化(高效)的执行过程是,先从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 server查看数据表的关联 sql server 关联查询_连接查询_08


而标准SQL查询出来的结果是应该没有NULL的,如下图:

sql server查看数据表的关联 sql server 关联查询_表名_09


3.外连接

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

【例 3.53】左外连接

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

sql server查看数据表的关联 sql server 关联查询_连接查询_10


右外连接

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

sql server查看数据表的关联 sql server 关联查询_等值连接_11

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

sql server查看数据表的关联 sql server 关联查询_sql server查看数据表的关联_12


应该是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;

sql server查看数据表的关联 sql server 关联查询_表名_13


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

二、感悟

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