第七章 多表连接 |
多表连接:用户在进行基本连接操作时,可以遵循以下基本原则
1.select 子句中,每个目标列(我们所需要的列)都要加上基表名称,因为有的基表中的属性名称是一样的
2.from子句中应该包括所使用的的所有的基表
3.where子句中应该定义一个同等连接
select A.姓名,A.性别,B.班级名,B.班级人数
from 学生信息1 A,班级信息 B
where A.所属班级=B.班级编号
内连接
select A.班级名,A.班级人数,B.姓名
from 班级信息 A inner join 辅导员信息 B
on A.辅导员=B.辅导员编号
where B.性别='女'
外连接与内连接的区别
内连接消除与另一个表的任何行不匹配的行,而外连接会返回from子句中提到的至少一个表或视图中的所有行,只要这些行符合任何搜索条件。
因为,在外连接中参与连接的表有主从之分,以主表中的每行数据去匹配从表中的数据行,如果符合连接条件,则直接返回到查询结果中;如果主表中的行没有在从表中找到匹配的行,主表的行仍然保留,并返回到查询结果中,相应的表中的行被填上空值后也返回到查询结果中。
左连接
select a.班级名,a.班级人数,b.姓名,b.联系电话
from 班级信息 A left join 辅导员信息 B
on a.辅导员=b.姓名
select a.班级名,a.班级人数,b.姓名,b.联系电话
from 班级信息 A left join 辅导员信息 B
on a.辅导员=b.姓名 and 班级人数>30
select a.班级名,a.班级人数,b.姓名,b.联系电话
from 班级信息 A left join 辅导员信息 B
on a.辅导员=b.姓名
where 班级人数>30
右连接:与左连接相同,左连接以左边的表为主表,右连接以右边的表为主表
select a.班级名,a.班级人数,b.姓名
from 班级信息 right outer join 辅导员信息 B
on a.辅导员=b.姓名
全连接 左连接或者右连接只能根据主表,显示主表的所有信息,但是 如果想显示两个表中全部信息的话,就需要用到全连接 full join。
select a.班级名,a.班级人数,b.姓名
from 班级信息 full join 辅导员信息 B
on a.辅导员=b.姓名
交叉连接/笛卡尔积
交叉连接不带where子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行等于第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行数。
select a.班级名,a.班级人数,b.姓名
from 班级信息 A cross join 辅导员信息 B
where a.辅导员=b.姓名
自连接:在同一表中进行连接,例如,在班级表中,查询班级人数相同的班级名称
select a.班级名,a.班级人数,b.班级名
from 班级信息 A,班级信息 B
where a.班级人数=b.班级人数 and a.班级编号<>b.班级编号
联合查询:将多个查询结果合并到一个,使用union联合查询时,连接的两个结果集必须在其目标表中有相同数目的表达式,有相同的列数,列的数据类型最好一致,数据内容尽量保持一致。
子查询:我的理解是select 里面又嵌套了一个select语句
例如:我们查询成绩低于平均分的学生的信息
select A.成绩编号,A.分数,B.姓名
from 成绩信息 A, 学生信息1 B
where a.学生编号=b.学号
and a.分数<=(
select avg(分数) from 成绩信息 A,学生信息1 B
where a.学生编号=b.学号
)
xml查询
创建一个表,指定列名和数据类型
create table student
( s_id int,
s_data xml
)
insert into student values(
1,<学生信息><姓名>刘倩</姓名><性别>女</性别><班级>计算机与科学技术一班</班级><职位>班长</职位></学生信息>
)
For xml子句
通过for xml子句并指定模式可以将从数据库系统的表中检索出来的数据自动表示成xml格式。Sql server在之前的版本的基础上增强了for xml子句的功能,添加了多种显示模式,如raw模式,auto模式,explicit模式和path模式等
交叉查询:使用intersect,将两个查询结果取交集
差查询
差查询:使用except关键字 求出两个查询语句的结果集的差的情况,第一个结果集中去掉两个结果集中公共的部分,两个查询语句的列需要是一样的。