11-07笔记

--笛卡尔集
--1内连接(两个表中相匹配的那些记录)
--2 外连接
--2.1左外连接(把2左表中 left join 关键字左边的表)中的全部记录都显示

出来,对于右表中能找到匹配的记录,显示对应匹配税局,对右表中找不到的

匹配记录显示为null
--2.2 右外连接 left[outer] join,right [outer] join.
--左外连接和右外连接都是分两步查询出结果的,第一步:找到匹配数据,第

二部:填充不匹配的数据为null.(注意,是有先后顺序的。)
 
  ----cross join交叉连接
 
select
* from student,scort

--自连接--------
select
* from student
inner join(select sName,sAge,sId from student
where sAge>10
)as TS1
on student.sId=TS1.sId
---report  ------


--左外连接
select
*
from
(
select
sid,
sname,
sAge,
score.*
from student
left outer join score
on score.studentid=student.sid
) as Tbl
where scoreId is null
--右外连接
select
sid,
sname,
sAge,
score.*
from student
right outer join score
on score.studentid=student.sid


---联系1:查询所有英语成绩及格的学生的姓名、年龄及成绩
select
sName,
sAge,
english
from student
inner join score on score.studentId=student.sId
where english>=60


--练习2:查询所有参加考试的(englishfen分数不为null)学生姓名、年龄及

成绩
select
sName,
sAge,
english,
math
from student
inner join score on score.studentId=student.sId
where english is not null

--练习3:查询所有学生(参加考试和未参加考试)的学生姓名、年龄、成绩,

如果报考了,没有参加考试显示缺考,如果成绩小于60分则显示不及格,如果

没有报考,则显示没报考(添加两列,一列是是否报考 ,一列是是否及格)

select
sName,
sAge,
case
  when english is null then '缺考'
else convert(varchar(50),english)
  end as english
,
math=case
  when math is null then '缺考'
else convert(varchar(50),math)
  end,
是否报考=case
  when scoreId is null then'未报考'
  else '已报考'
  end,
是否及格=
  case
when english<60 or math<60 or english is null or math is null then '

不及格'
else '及格'
end
from student
left outer join score on
score.studentId=student.sId

单张表A数据量过百万,关联表B数据过千万,如何优化
思路:
   使用‘临时表’先把A,B中满足条件的记录取出来放到相应的临时表中,再

在临时表中进行查询

 1 临时表放在内存中,查询速度快。
 2 临时表中数据量小
 3 临时表就用来查询,防止并发

 

 

 

 


--单张表A数据量过百万,关联表B数据过千万,如何优化
---局部临时表---
create table #MyStudents
(
sName nvarchar(50),
sAge int
)

insert into #MyStudents
select FName,FAge from MyStudents

select * from #MyStudents

delete from #MyStudents
where sName in ('李宁','李昂','李琛')
----全局部临时表  与临时表的区别就是表名前有两个#号
create table ##MyStudents
(
sName nvarchar(50),
sAge int
)

insert into ##MyStudents
select FName,FAge from MyStudents

select * from ##MyStudents

delete from ##MyStudents
where sName in ('李宁','李昂','李琛')
------表变量

declare @varTbl table(col1 int,col2 varchar(30))
insert into @varTbl values (100,'A')
insert into @varTbl values (101,'B')
select *  from @varTbl

---我们可以把很长很长的查询语句放在一个视图中,这样我们在要得到长长的查询语句的结果时候,就可以,不在执行这段语句,而是查询一下相应的视图即可。
---视图类似于一个表,这个表和临时表不同,他不会在会话结束后释放掉,每次都能用
---视图中不存放数据,视图中只存放查询

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值