内键连接:inner join
外键连接:1:左外建连接:表一 left outer join表二 :左链接就是左边
表(表一)的记录都显示,右边的表(表二)做匹配有的就显示值没有的就显
示null
2:右外键连接:表一 right outer join 表二:右连接就是右边表(表二)
的记录都显示,左边表(表一)做匹配有的显示值没有的显示null
注:都是一列的形式显示
查询没有参加考试的:
就是查询score表中不包含在tstudent.sid中的classid :例如说score表里
studentid有(1234)student表中sid有(123456)56就没有成绩就是没参
加考试
没有参加考试的
1:用子查询:
select
fname,fage,
from student
where sid not in(select studentid from score)
2:
select *
from
(select
fname,fage
score.*
from student left join score on student.sid=score.studentid)//子查询合并成一个大表作为数据源(没有匹配的sid值都为null,这样就变为一个表查询了)
where sid is null
外连接都分两部部查询1:找到匹配数据2:填充不匹配的数据null
交叉连接:scross join
自连接:inner join(同一个表的查询)
查没有报考的就是合并表中不存在的scoreid,(但student中sid存在)
例题:
--把没参加考试的设为缺考
select
fname,
fage,
scoreid,
fenglish=
case
when fenglish IS null then '缺考'
else convert(nvarchar(10),fenglish)
end
,
math=
case
when math IS null then '缺考'
else convert(nvarchar(10),math)
end,
是否报考=
case
when scoreid is null then '未报考'
else '已报考'
end,
是否合格=
case
when fenglish>=60 and math>=60 then '合格'
else '不合格'
end
from tstudent
left join score on tstudent.sid=score.studentid
表中数据很多时:用临时表把AB中满足条件的记录取出来放在临时表中,在临时表中进行查询
一:1:临时表放在内存中,查询速度快;
2:临时表中数据量小
3:临时表就用来查询,防止并发(即同时操作例如改和查询)
建立:局部临时表:create table #临时表名
全局临时表:create table ##临时表名
二:表变量:
declare @varTable table(col1 int,col2 varchar(30)) //声明表
变量
declare 变量名 table(字段及类型)
插值:与相表里插值一样
三:视图:存放语句保密性高
建立:create view 视图名 as 查询语句
视图一旦建立内容就不变;
修改视图
alter修改视图(当在修改视图语句中改变select语句,1:执行alter语句2:改数据库内容3:执行as后语句4:执行查询视图语句;只用执行下select语句,再查巡视图时就会发生变化)
--临时表
create table #linshi
(
fname varchar(20),
fage varchar(10)
)
insert into #linshi
select fname, fage from tstudent
select * from #linshi
--表变量
declare @varTbl table(col1 int,col2 varchar(10))
insert into @varTbl
select 10,20union
select 23,35
select *from @varTbl
--以上语句必须同时执行
--视图
--创建视图
create view shitu
as
select fname from tstudent
--注:一个视图中只能有一个查询语句
--查询视图
select * from shitu
--改视图
alter view shitu
as
select * from tstudent
select * from shitu
update tstudent set fname='大张飞' where fname='张飞'