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
MSSQLServer基础05(联合查询,连接查询)的更多相关文章
- Mysql联合,连接查询
一. 联合查询 UNION, INTERSECT, EXCEPT UNION运算符可以将两个或两个以上Select语句的查询结果集合合并成一个结果集合显示,即执行联合查询.UNION的语法格式为 ...
- MSSQLServer基础03(数据检索(查询))
执行备注中的代码创建测试数据表. 简单的数据检索 :SELECT * FROM Student 只检索需要的列 :SELECT sName FROM Student .ame FROM Student ...
- MySQL多表查询 三表查询 连接查询的套路
多表查询 * 当我们的一条记录 分散不同的表中时,就需要进行多表查询 例如 一对一 一对多 多对多 1.笛卡尔积查询 意思是将两个表中的所有数据 全部关联在一起 例如 a表 有2条 b表有3条 ...
- 《SQL CookBook 》笔记-第三章-多表查询-连接查询
目录 1 内连接(inner join) 1.1 隐式的内连接 1.2 显式的内连接 2 外连接(outer join) 2.1 左连接(left outer join) 2.2 右连接(right ...
- sql查询 —— 连接查询
-- 执行sql文件 test.sql -- 打开终端 -- cd sql文件所在路径 -- 进入mysql -- use 数据库 -- 执行 source test.sql; -- 自关联 -- 一 ...
- MySQL连接查询、联合查询、子查询
参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...
- 【SQL】- 基础知识梳理(三) - SQL连接查询
一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- MySQL分组查询与连接查询
一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...
随机推荐
- opencv 手写选择题阅卷 (一)表格设计与识别
(一)答题表格设计与识别 实际设计好的表格如下图 为了图像精确,表格和四角的标记都是由程序生成的,文字和数据是后期排版软件添加上去的. 图中四角的四个黑方块主要用来定位表格,然后就可以切割出每个单元格 ...
- vc 编译执行bat
转载:
- 第一章 搭建Qt开发环境
第一章 搭建Qt开发环境 1.到http://download.qt-project.org/archive/上下载Qt的源码包.我下载的是qt-everywhere-opensource-src-4 ...
- 【转】给Winform的button等控件添加快捷键
ref: http://blog.sina.com.cn/s/blog_4cb9953f0100cy4z.html 第一种:Alt + *(按钮快捷键) 在大家给button.label.menuSt ...
- 排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。
看完两个求最大值算法之后的一些感想. 如果想直接看算法的可以跳过.但是我觉得我这些想法还是比较有用的,至少对我将来的算法设计是这样的. 算法的功能越强大,必然意味着速度慢,因为根据丛林法则,那种慢又功 ...
- phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法
最近在phpcmsV9里用表单向导弄个的提交表单,但用了日期和时间类型时,用 <script language='javascript' src='{APP_PATH}index.php?m ...
- CorelDRAW 文件实用工具 CDRTools 2
随着 CorelDRAW 更新脚步越来越频繁,版本之间兼容性问题越来越突出,特别是跨版本之间打开会有很多问题,比如:文字跑位.透镜变向.位图出错.颜色改变,甚至会造成文件损坏.最好的办法就是哪一个版本 ...
- A3992学习记录
ATmega64+A3992驱动步进电机 //ATmega 64a 电机驱动板程序//编译环境 AVR Studio 4.17/AVR GCC//系统外部时钟16M//作者:虞恺 //日期:2012. ...
- Programming Collective Intelligence
最近正在拜读 O'reilly出版的Programming Collective Intelligence,准备研究研究搜索引擎了,童鞋们,到时候会考虑公布源码哦!
- 数据库 mysql 优化器原理
MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行. 你的最终目标是提交SELECT语句查找数据行,而不是排除数据行.优化器试图排除数据 ...