MSSQLServer基础05(联合查询,连接查询)
联合结果集union(集合运算符)
集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果)
联合(union)与连接(join)不一样
简单的结果集联合(老师、学生):
select tName,tSex from teacher union
select sName,sSex from student
基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。
select tName,tSex,-1 from teacher union
select sName,sSex,sClassId from student
联合:将多个结果集合并成一个结果集。union(去除重复,相当于默认应用了distinct)、union all(保留所有结果,不去除重复)
Union all
select tName,tSex from teacher union
select sName,sSex from student
UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条
select tName,tSex from teacher union all
select sName,sSex from student
Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用UNION ALL
案例1
要求在一个表格中查询出学生的英语最高成绩、最低成绩、平均成绩
查询结果为3行:
select 'english最高成绩',max(english) from score
union all
select 'english最低成绩',min(english) from score
union all
select 'english平均',avg(english) from score
查询结果为1行:
Select max(english),min(english),avg(english) from score;
*一次插入多条数据
--把现有表的数据插入到新表(表不能存在),为表建备份。
--select * into newStudent from student(newStudent表在select查询的同时自动建立。)
--把现有表的数据复制到一个已存在的表
通过这种方式复制,只能复制表中的数据,以及列的名字和数据类型。对于约束,不会复制过来。
Select * into newTbl from oldTbl where 1<>1,这样做可以只复制表结构,但效率并不高。建议:select top 0 * into newTbl from oldTbl
=========如果表已经存在了===============
--insert into backupStudent select * from students(backupStudent表必须提前建好)
连接查询
当结果中的数据分布于多个表中时,需要将多个表连接到一起进行查询,这种查询就是连接查询
关键字:join … on …
主要分为两种:内连接,外连接
内连接:普通内连接,自连接
外连接:左外连接,右外连接,完全外连接
提示:尽量不要把条件放到on中,而要放到where中,因为on与where执行的时间是不一样
------------------------------------------查询这个学生的时候能不能把这个学生所在的班级的名字也显示出来
select * from student
inner join TblClass on student.TClassId=TblClass.TClassId
------------------------------------------内联
select student.TSId,TSName,TSGender,TClassName,student.TClassId,TblScore.TSEnglish from student
inner join TblClass on student.TClassId=TblClass.TClassId
inner join TblScore on student.TSId=TblScore.TSId
---------------------------------------------------------查询年龄超过20岁的学生的姓名、年龄及所在班级
select TSName,TSAge from student
inner join TblClass on student.TClassId=TblClass.TClassId
where TSAge>20
----------------------------------------------------------所有的(参加和没参加的 都查询了)
select * from student
left join TblScore on student.TSId=TblScore.TSId
--------------------------------------------------------查询出参加了考试的,以TblScore为基准
select * from student
right join TblScore on student.TSId=TblScore.TSId
------------------------------------------------------------没参加考试
select * from student
left join TblScore on student.TSId=TblScore.TSId
where TblScore.TSId is null
select
姓名=TSName,
年龄=TSAge,
英语成绩=
case
when TSEnglish is null then '缺考' else CONVERT(nvarchar(10),TSEnglish)
end
,
数学成绩=
case
when TSMath is null then '缺考' else CONVERT(nvarchar(10),TSMath)
end
,
是否及格=
case
when TSEnglish>60 and TSMath>60 then '及格' else '不及格'
end
from student
left join TblScore on student.TSId=TblScore.TSId
子查询
在一个sql语句中嵌入了一个查询语句
分为:相关子查询,独立子查询
运算符:= in exists
作业:分页查询
提示:使用函数row_number
子查询实例
-------------------------------------1.查询出班级中所有24岁的男生(子查询)
select * from (select * from student where TSGender=1) as stu where TSAge>24
-------------------------------------2.查询出高一三班和高二二班的所有学生(子查询)
select * from TblClass
select * from student
select * from student where TClassId in
(select tclassid from TblClass where TClassName='黑马一期' or TClassName='黑马二期')
-------------------------------------3.查询出的总人数,男同学多少人,数学平均成绩(子查询)
select
总人数=(select count(*) from student),
男同学的人数=(select COUNT(*) from student where TSGender=1),
数学的平均成绩=(select AVG(TSMath) from TblScore)
分页查询实例
-----------------------------------------------9条到16条的数据
select top 8 * from student where tsid not in
(select top 8 tsid from student )
-----------------------------------------------每页7条数据 ,查第三页的数据
select top 7 * from student where tsid not in
(select top (2*7) tsid from student)
------------------------------------------------编号
select 编号=ROW_NUMBER()over(order by tsid),* from student
-----------------------------------------------over按照哪一列进行排序 然后row_number()编号
select tsmath,名次=ROW_NUMBER()over(order by tsmath desc) from TblScore
-----------------------------------------------每页三条 查第五页的
select * from
(select 编号=ROW_NUMBER() over(order by tsname desc),* from student)as newStu
where newStu.编号 between (5-1)*3+1 and 3*5
-----------------------------------------------每页9条数据 查询13页的
select 编号=ROW_NUMBER ()over(order by id),*from MyOrders
where 编号 between 12*9+1 and 9*13
select * from
(select 编号=ROW_NUMBER() over(order by id),* from MyOrders) as Orders
where 编号 between (13-1)*9+1 and 13*9
select tsmath,名次=ROW_NUMBER()over(order by tsmath desc) from TblScore
------------------------------------------------rank() 数据相同的名次一样
select tsmath,名次=rank()over(order by tsmath desc) from TblScore