联合结果集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. javascript笔记——闭包

    花了三天时间,终于弄清楚闭包的各种写法和注意的事项,以及以前写,经常出错的地方,特此做一个总结,虽然不够专业,但是对于那些初学者来说,绝对对闭包的理解事半功倍. 案例一: function aa(){ ...

  2. VisualLeakDetector

    只需要#include "vld.h"就OK -------------------------------------- 找内存泄露挺方便的,比VS自带的详细.

  3. Call C# code from C++

    Reference: https://support.microsoft.com/en-us/kb/828736 Calling C# .NET methods from unmanaged C/C+ ...

  4. div嵌套引起的margin-top不起作用(转)

    嵌套div中margin-top转移问题的解决办法在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-botto ...

  5. border-radius导致overflow:hidden失效问题。

    如果一个父元素设置了overflow:hidden属于的同时还设置了border-radius属性,那么如果想隐藏超出的子元素,四个圆角处会出现超出圆角依然显示的bug: 一种方法是运用-webkit ...

  6. JQuery的过滤选择器

    1.eg(num):查找索引num位置的元素,索引从0开始. 2.lt(num):查找索引小于num位置的元素,索引从0开始. 3.gt(num):查找索引大于num位置的元素,索引从0开始. 示例: ...

  7. JavaScript笔记(二)——常用数组、字符串方法的应用

    1.将字符串中的字符翻转,比如'hello',翻转成'olleh'. var arr=[]; function reverseString(str) { arr=str.split("&qu ...

  8. Catalyst揭秘 Day1 Catalyst本地解析

    Catalyst揭秘 Day1 Catalyst本地解析 今天开始讲下Catalyst,这是我们必须精通的内容之一: 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是D ...

  9. 浅析 public static void main(String[] args)

    最初接触Java程序的时候,老师就教导我们要从下面这句开始学起,据说是约定俗成的,所以直到今天,还是只知道java程序应该这么写,具体为什么这么写,鄙人惭愧. public class ClassNa ...

  10. WPF系列

    一.ListView绑定数据源XML //前端代码 1 <Window x:Class="ListView读取XML数据.MainWindow" xmlns="ht ...