SQL server 2012之数据查询(2)—连接查询

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

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

等值连接:连接运算符为等号;
非等值连接:使用其他运算符;
连接查询的where子句中用来连接两个表的条件称之为连接条件或者连接谓词,其一般格式为:

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

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

例1、 查询每个学生及学生及其选修课程的情况:

select student.*,sc.*
from student,sc
where student.sno = sc.sno   //这里studnet和sc表中都有sno列

若在等值连接中把目标列中重复的属性去掉则为自然连接
例2、 如上例1.1

select student.sno,sname,ssex,sage,sdept,cno,grade
from student,sc
where student.sno = sc.sno 

例3、 查询选修课程号为2号的学生姓名

select sname from student,sc
where student.sno = sc.sno and sc.cno = '2'

1.1使用表的别名

该查询在表中出现同名字段学号Sno和课程号Cno,为了区分字段,加上了表名,整个查询命令显得十分冗长。为了简洁起见,用户可以采用为表指定别名的方法 。

例3、 查询学号为’200215121’的学生的姓名、院系、课程号及成绩;

select a.sname,a.sdept,b.cno,b.grade
from student a,sc b
where a.sno = '200215121' and a.sno = b.sno 

2. 自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接;
由于所有属性名都是同名属性,因此必须使用别名前缀。需要给表起别名以示区别。
在这里插入图片描述

select first.cno,second.cpno
from course first,course second
where first.cpno = second.cno

3. 使用JOIN关键字实现表的连接

在SELECT语句的FROM子句中,通过指定不同类型的JOIN关键字可以实现不同的表的连接方式,而在ON关键字后指定连接条件。
基本连接语法如下:

select column_list from join_table
join_type join_table
on (join_condition)

说明:
join_table:指出参与连接操作的表名;
join_type为连接类型,可分为3种:内部连接、外部连接和交叉连接

3.1内连接

内部连接是使用比较运算符比较要连接列中的值的连接。

例4、 从student和sc表中查询每个学生的各门选修课成绩信息,要求返回的结果中包含学生的学号、姓名、性别、选修课程序号及成绩。

select a.sno,sname,ssex,cno,grade
from student a inner join sc b
on a.sno = b.sno

3.2 外连接

在通常的连接操作中,只有满足连接条件的行才能作为结果输出,但有些情况下,也需要输出其他相关选项,这就用到了外连接。
外连接可分为:左连接(left)、右连接(right)、全连接(full)三种:

  • 左外连接(left outer join):结果表中除了包括满足连接条件的行外,还包括左表的所有行,没有值补为null;
select <目标列表达式>[,<目标列表达式>]......
from <表名1>left [outer] join <表名2>
on <连接条件>
  • 右外连接 (right outer join):结果表中除了包括满足连接条件的行外,还包括右表的所有行,没有值补为null;
select <目标列表达式> [,<目标列表达式>]......
from <表名1> right [outer] join <表名2>
on <连接条件>
  • 完全外连接 (full outer join):结果表中除了包括满足连接条件的行外,还包括两个表的所有行,没有值补为null;
select <目标列表达式>[,<目标列表达式>]......
from <表名1> full [outer] join <表名2>
on <连接条件>

例5、 查询所有学生基本情况及他们选修课程的成绩(包括没有选修任何课的学生)

select student.*,grade
from student left outer join sc
on (student.sno = sc.sno)

4. 多表连接

多表连接:就是将两个以上的表进行连接。
例6、 查询每个学生的学号、姓名、选修的 课程名及成绩

select student.sno,sname,cname,grade
from student,sc,course
where student.sno = sc.sno and sc.cno = course.cno

猜你喜欢

转载自blog.csdn.net/ITrumenshaonian/article/details/89504081