第七章 操作查询
连接
1、基本连接
多个数据表间进行操作,需要进行多表连接。
要符合范式要求。
基本原则:
Select A.姓名
From 学生信息 A, 班级信息 B
'名称后面空格+字母,定义表名
Where A.所属班级= B.班级编号
2、内连接 inner join
类似等值连接,消除与另一个表中不匹配的行,只显示匹配的行。
语法:
On 关键字后面跟着需要限定的条件,还可以加入where子句进行二次条件限定,可以使用order by子句进排序。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A inner join 辅导员信息 B
ON A.辅导员=B.辅导员编号
Where B.性别='女'
3、外连接
外连接有主表和从表,以主表的每行数据去匹配从表中的数据行,如果符合连接条件,则直接返回查询结果中,如果不匹配,保存主表中的数据行,并返回到查询结果中,从表中的行为空值,返回数据行。
left outer join :两个表进行左外连接,主表是左表,从表是右表,保存左表所有数据行,右表与之匹配的保存,不匹配的为空值。
right outer join:与左外连接不同的是以右表为主表,左表为从表。其余功能相同。
左右外连接之间可以进行转换:通过修改查询主从表的顺序。
on子句:从表不符合条件的,显示空值,同样显示到新表中。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A inner join 辅导员信息 B
ON A.辅导员=B.辅导员编号 AND A.班级人数>20
where子句:先对上面的语句进行执行,执行结束之后在对执行结果执行where子句进行筛选,筛选结果以where子句为最后结果。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A inner join 辅导员信息 B
ON A.辅导员=B.辅导员编号
WHERE A.班级人数>20
4、全连接 full outer join
与外连接比较:连接方式都有主表和从表。左右外连接是可以互换的。
可以获取两个表中的所有数据,相当于左右外连接的综合。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A full join 辅导员信息 B
ON A.辅导员=B.辅导员编号
需要注意:如果将连接的两个表的顺序颠倒,结果集中的先后顺序也会跟着颠倒。
5、交叉连接 cross join
作用:
不带where子句,返回连接的两个表中所有数据行的笛卡尔积,返回到结果集中的数据行数等于第一个表中符合查询条件的数据行数乘第二个表中符合查询条件的数据行数。
两个数据集中的数据全部罗列在新的数据集中。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A cross join 辅导员信息 B
如果主从表顺序不同,结果相同,但是显示的结果顺序不同。
加入where子句的限定之后就和基本连接的结果相同。
6、自连接
其同一个数据表中的查询为自连接。
需要虚拟另外一个表名,用AB来区分。自连接的数据表名称需要修改,改成别名。
Select A.班级名,A.班级人数,B.班级名
From 班级信息 A, 班级信息 B
where A.班级人数=B.班级人数 AND A.班级编号<>B.班级编号 AND A.班级名='艺术系2班'
查询
1、联合查询
联合查询:将多个查询的结果合并到一个结果集中。使用union和all关键字。
union和all是将多个查询结果进行合计的一个关键字。
all是保存重复结果。
使用union就不保存重复结果。
union:连接的两个结果集必须在目标列表中有相同数目的表达式,且数据内容尽量保持一致。
2、子查询
一个查询语句,包含在其他的where子句中的查询子句为子查询。
where子句中再使用select语句进行查询。
使用子查询可以根据自己的需要进行再一次的筛选。
SELECT A.成绩编号,A.分数,B.姓名
FROM 成绩信息 A,学生信息 B
WHERE A.学生编号=B.学号 AND A.课程编号='2' AND A.考试编号='0801'
AND A.分数<(
SELECT AVG(分数) FROM 成绩信息 A,学生信息 B
WHERE A.学生编号=B.学号 AND A.课程编号='2' AND A.考试编号='0801'
SELECT A.成绩编号,A.分数,B.姓名
FROM 成绩信息 A,学生信息 B
WHERE A.学生编号=B.学号 AND A.课程编号='2' ADN A.考试编号='0801'
AND B.学号 IN(
SELECT 学号 FROM 班级信息 A,学生信息 B
WHERE A.学生编号=B.所属班级 AND A.班级编号='20051025'
嵌套子查询:在子查询中再添加子查询,形成嵌套。
select A.成绩编号,A.分数,B.姓名
from 成绩信息 A,学生信息 B
where A.学生编号=B.学号 AND A.课程编号='2' AND A.考试编号='0801'
AND B.学号 IN(
select 学号 from 班级信息 A,学生信息 B
where A.学生编号=B.所属班级 AND A.辅导员=(
select 辅导员编号 from 辅导员信息 where 姓名='王艳'
)
)
3、XML查询
存放xml格式的数据,以字符串的格式进行存储。
for xml子句:
通过for xml子句可以将从数据库系统的表中检索出来的数据自动表示成xml格式。需要指定显示模式,包括raw模式,auto模式,explicit 模式和path模式。
保存为raw的模式。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A, 辅导员信息 B
where A.辅导员=B.辅导员编号
FOR XML RAW
使用auto模式,查询结果为层次结构。
Select A.班级名,A.班级人数,B.姓名,B.联系方式
From 班级信息 A, 辅导员信息 B
where A.辅导员=B.辅导员编号
FOR XML AUTO
4、exists关键字查询
使用关键字进行判断,查询是否有记录,返回true和false。
在where语句中使用exists关键字,查询是否存在记录。
select a.* from 成绩信息 a
where exists (select * from 考试安排 b where b.考试编号=a.考试编号 and b.考试编号='0801'
使用if语句,进行精确查询,判断是否有记录。
5、交查询 intersect
联合查询,将两个查询结果组合到一起,类似加号的结果。
交查询:两个结果集中的交集,数据进行整合。
Select a.成绩编号, a.分数, b.姓名
from 成绩信息 a, 学生信息 b
where a.学生编号=b.学号 and a.课程编号=2 and a.考试编号='0801'
使用交查询前面不允许使用order by 语句,直接使用intersect关键字是不可以的,后面需要加入一个select子查询。
Select a.成绩编号, a.分数, b.姓名
from 成绩信息 a, 学生信息 b
where a.学生编号=b.学号 and a.课程编号=2 and a.考试编号='0801'
Intersect
Select a.成绩编号, a.分数, A.姓名 from
(
Select top 10 a.成绩编号, a.分数, b.姓名
from 成绩信息 a, 学生信息 b
where a.学生编号=b.学号 and a.考试编号='0801' order by a.分数 DESC
) A
6、差查询 except
对两个结果集进行差查询。
两个查询的列必须是固定的相同的,联华、交也一样。
使用except关键字,消除第一二个查询结果集中的重复记录,保留第一个结果集中的记录。
Select a.成绩编号, a.分数, b.姓名
from 成绩信息 a, 学生信息 b
where a.学生编号=b.学号 and a.课程编号=2 and a.考试编号='0801'
except
Select a.成绩编号, a.分数, A.姓名 from
(
Select top 10 a.成绩编号, a.分数, b.姓名
from 成绩信息 a, 学生信息 b
where a.学生编号=b.学号 and a.考试编号='0801' order by a.分数 DESC
) A
第一个查询结果返回4条记录:
第二个查询结果返回10条记录:
差连接查询之后结果返回3条记录,消除相同的记录。