联合结果集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

MSSQLServer基础05(联合查询,连接查询)的更多相关文章

  1. Mysql联合,连接查询

    一. 联合查询    UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...

  2. MSSQLServer基础03(数据检索(查询))

    执行备注中的代码创建测试数据表. 简单的数据检索 :SELECT * FROM Student 只检索需要的列 :SELECT sName FROM Student .ame FROM Student ...

  3. MySQL多表查询 三表查询 连接查询的套路

    多表查询 * 当我们的一条记录 分散不同的表中时,就需要进行多表查询 例如 一对一 一对多 多对多 1.笛卡尔积查询 意思是将两个表中的所有数据 全部关联在一起   例如 a表 有2条 b表有3条   ...

  4. 《SQL CookBook 》笔记-第三章-多表查询-连接查询

    目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...

  5. sql查询 —— 连接查询

    -- 执行sql文件 test.sql -- 打开终端 -- cd sql文件所在路径 -- 进入mysql -- use 数据库 -- 执行 source test.sql; -- 自关联 -- 一 ...

  6. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  7. 【SQL】- 基础知识梳理(三) - SQL连接查询

    一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...

  8. Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页

    GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...

  9. MySQL分组查询与连接查询

    一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...

随机推荐

  1. C/C++输入输出总结

    *string类:  1.cin>>string时,遇到'\n'或者空格即停止,并且'\n'或空格仍留在输入里,即只读了一个单词或什么都没读,但string类自己处理好了空字符什么的.下一 ...

  2. d3 之值域映射

    <html> <head> <meta charset="utf-8"> <title>d3研究室</title> &l ...

  3. js定义参数默认值

    javascript可以用arguments定义参数组.   一.简单的定义参数默认值 function test1(a,b){ //如果有参数一,则返回参数一,如果没有返回默认值"这是参数 ...

  4. Python Generators vs Iterators

    http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators iterato ...

  5. 用JS写的简单轮播特效

    效果如下 功能分析 1.每隔1秒换一张图片 2.鼠标移入停止切换.鼠标离开继续切换 3.鼠标移入到数字上面的时候,显示和数字对应的图片,并且停止切换,被选中的数字,背景显示橙色 4.鼠标离开数字,从该 ...

  6. spark 1.3.0下的问题

    1.在spark SQL的一个test中 无论是registerAsTable还是registerTempTable 都会有问题,经过查找各种资料,采用如下的方式: val sqlCon=new or ...

  7. linux工作队列

    工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列.说白了就是系统延时调度的一个自定义函数. 工作队列是实现延迟的新机制,从 2.5 版本 Lin ...

  8. 【IOCP】 IOCP模型属于一种通讯模型- 较难

    http://baike.baidu.com/link?url=e9vXkKd2aHp8VDr1XTURdwQB4K85r28IYjeMwRIyuaXtsrCsXHY1eohiFgsDXRYRlj6x ...

  9. python学习笔记21(正则表达式)

    正则表达式模式: 模式 描述 ^ 匹配的开始的 $ 匹配行尾 . 匹配除换行符的任何单个字符.使用-m选项允许其匹配换行符也是如此. [...] 匹配括号内任何单个字符 [^...] 匹配非单个字符集 ...

  10. 友盟分享在appdelegate中的调用语句举例

    //友盟 [UMSocialData setAppKey:UmengAppkey]; [UMSocialConfig setSupportedInterfaceOrientations:UIInter ...