Sql Server的艺术(五) SQL UNION与UNION JOIN运算符
学习本节所用表:
CREATE TABLE TEACHER
(
ID INT IDENTITY (,) PRIMARY KEY , --主键,自增长
TNO INT NOT NULL, --教工号
TNAME CHAR() NOT NULL, --教师姓名
CNO INT NOT NULL, --课程号
SAL INT, --工资
DNAME CHAR() NOT NULL, --所在系
TSEX CHAR() NOT NULL, --性别
AGE INT NOT NULL --年龄
)
INSERT INTO dbo.TEACHER VALUES( ,'王军',,,'数学','男',)
INSERT INTO dbo.TEACHER VALUES( ,'李彤',,,'生物','女',)
INSERT INTO dbo.TEACHER VALUES( ,'王永军',,,'计算机','女',)
INSERT INTO dbo.TEACHER VALUES( ,'刘晓婧',,,'计算机','女',)
INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'电子工程','男',)
INSERT INTO dbo.TEACHER VALUES( ,'李伟',,,'机械工程','女',)
INSERT INTO dbo.TEACHER VALUES( ,'刘辉',,,'生物','女',)
INSERT INTO dbo.TEACHER VALUES( ,'刘伟',,,'计算机','男',)
INSERT INTO dbo.TEACHER VALUES( ,'刘静',,,'经济管理','男',)
INSERT INTO dbo.TEACHER VALUES( ,'刘奕锴',,,'计算机','女',)
INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'经济管理','男',) CREATE TABLE COURSE
(
ID INT IDENTITY (,) PRIMARY KEY , --主键,自增长
CNO INT NOT NULL, --课程号
CNAME CHAR() NOT NULL, --课程名称
CTIME INT NOT NULL, --学时
SCOUNT INT NOT NULL, --容纳人数
CTEST SMALLDATETIME NOT NULL, --考试时间
)
INSERT INTO dbo.COURSE VALUES( ,'应用数学基础',,,'2006-7-10')
INSERT INTO dbo.COURSE VALUES( ,'生物工程概论',,,'2006-7-8')
INSERT INTO dbo.COURSE VALUES( ,'计算机软件基础',,,'2006-7-8')
INSERT INTO dbo.COURSE VALUES( ,'计算机硬件基础',,,'2006-6-28')
INSERT INTO dbo.COURSE VALUES( ,'模拟电路设计',,,'2006-7-10')
INSERT INTO dbo.COURSE VALUES( ,'机械设计实践',,,'2006-7-14')
INSERT INTO dbo.COURSE VALUES( ,'生物化学',,,'2006-7-2')
INSERT INTO dbo.COURSE VALUES( ,'数据库设计',,,'2006-7-1')
INSERT INTO dbo.COURSE VALUES( ,'设计理论',,,'2006-6-30')
INSERT INTO dbo.COURSE VALUES( ,'计算机入门',,,'2006-6-29')
INSERT INTO dbo.COURSE VALUES( ,'数字电路设计基础',,,'2006-6-20')
CREATE TABLE STUDENT
(
ID INT IDENTITY(,) PRIMARY KEY NOT NULL,
SNO CHAR() NOT NULL, --学号
SNAME CHAR() NOT NULL, --姓名
DNAME CHAR() NOT NULL, --系
SSEX CHAR() NOT NULL, --性别
CNO INT , --课程号
MARK DECIMAL(,), --成绩
TYPE CHAR() --课程类型
)
INSERT INTO dbo.STUDENT VALUES('','刘建国','管理工程','男',,82.5,'必修')
INSERT INTO dbo.STUDENT VALUES('','刘建国','管理工程','男',,,'选修')
INSERT INTO dbo.STUDENT VALUES('','刘建国','管理工程','男',,78.5,'选修')
INSERT INTO dbo.STUDENT VALUES('','李春','环境工程','女',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','李春','环境工程','女',,,'选修')
INSERT INTO dbo.STUDENT VALUES('','王天','生物','男',,48.5,'必修')
INSERT INTO dbo.STUDENT VALUES('','王天','生物','男',,,'选修')
INSERT INTO dbo.STUDENT VALUES('','李华','计算机','女',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','李华','计算机','女',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','李华','计算机','女',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','李华','计算机','女',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','李华','计算机','女',,,'选修')
INSERT INTO dbo.STUDENT VALUES('','孙庆','电子工程','男',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','孙庆','电子工程','男',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','孙庆','电子工程','男',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','孙庆','电子工程','男',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','高伟','机械工程','男',,,'必修')
INSERT INTO dbo.STUDENT VALUES('','高伟','机械工程','男',,88.5,'必修')
INSERT INTO dbo.STUDENT VALUES('','高伟','机械工程','男',,,'选修')
INSERT INTO dbo.STUDENT VALUES('','高伟','机械工程','男',,,'选修') 数据表
表数据
1、关系的集合运算
集合的3个最普通的运算是并、交和差。对于任意集合R和S(当然,这里的R和S可以是表R和表S),这些运算定义如下。
R并S,R或S或两者中元素的集合。一个元素在并集中只出现一次,即使它在R和S中都存在。
R交S,R和S中都存在的元素的集合。
R差S,在R中而不在S中的元素的集合。注意R差S不同于S差R,后者是在S中而不在R中的元素的集合。
关于交、并、差运算的示意图如图所示。
标准SQL中,可以使用UNION运算符实现集合并的运算,但是没有直接提供集合交和集合差操作,可用其他方法来实现。
2、UNION运算符
使用UNION运算符执行集合并运算
--首先选出CNO=1的学生,作为一个集合,然后在选出SNO=10的学生,作为一个集合,最后对两个集合用UNION,即运算,得到最终结果
SELECT SNO,SNAME,DNAME FROM dbo.STUDENT WHERE CNO= UNION SELECT SNO,SNAME,DNAME FROM dbo.STUDENT WHERE CNO= --选择1或10的学生部分信息
--注意:如果用UNION,SELECT后的子句不写字段,则结果会出现跟下面语句一样(就是没有消除重复行)
--下面两条语句得到的结果是一样的,同样也可以用OR来实现
SELECT * FROM dbo.STUDENT WHERE CNO= UNION SELECT * FROM dbo.STUDENT WHERE CNO=
SELECT * FROM dbo.STUDENT WHERE CNO= OR CNO=
--注意:UNION运算符执行集合并运算,自动从结果表中消除重复的行
--使用UNION运算符操作后,要保留重复元组的话,必须在UNION运算符后使用ALL关键字指明(UNION改为UNION ALL)
--参与运算的两个集合必须选择同样数量的列,并且相应的列必须具有相同的类型
对不同表不同字段采用UNION运算符,并用ORDER BY子句排序
SELECT SNAME,CNO,DNAME FROM dbo.STUDENT WHERE CNO= OR CNO= UNION SELECT TNAME,CNO,DNAME FROM dbo.TEACHER WHERE CNO= OR CNO= ORDER BY CNO DESC
由此可见,UNION运算符只要求列的类型匹配即可,而对应的列的列名可以使不同的。
两条SELECT语句的字段都不一样,SQL Server将使用UNION运算中第一条SELECT语句中的列名作为结果表中的列名。
UNION运算符组合起来的SELECT语句中,不能有ORDER BY子句,但是可以放在最后一条SELECT语句后面。
对多表进行UNION运算
SELECT CNO AS 学号 FROM dbo.STUDENT WHERE SSEX='男' UNION SELECT CNO AS 学号 FROM dbo.TEACHER WHERE TSEX='女' UNION SELECT CNO AS 学号 FROM dbo.COURSE WHERE CTIME>20 --所有女同学选修的或者男教师开设的或者学时多于20的课程号
连接表进行聚合运算
--演示的是内连接,外连接 左右连接,原理一样
SELECT t.CNO,COUNT(s.CNO) AS aa FROM dbo.TEACHER AS t INNER JOIN dbo.STUDENT AS s ON t.CNO=s.CNO GROUP BY t.CNO --学生表中修过这门课程的学生的数目
多表连接综合运用
SELECT t.TNAME,t.DNAME,c.CNAME,s.SNAME,s.MARK FROM dbo.TEACHER AS t LEFT OUTER JOIN dbo.COURSE AS c ON c.CNO = t.CNO INNER JOIN dbo.STUDENT AS s ON s.CNO = c.CNO ORDER BY t.TNAME SELECT s.SNO,s.SNAME,c.CNAME,s.MARK FROM dbo.STUDENT AS s INNER JOIN dbo.COURSE AS c ON c.CNO = s.CNO WHERE c.CNAME='计算机入门'
UNION
SELECT s.SNO,s.SNAME,c.CNAME,s.MARK FROM dbo.STUDENT AS s INNER JOIN dbo.COURSE AS c ON c.CNO = s.CNO WHERE c.CNAME='生物工程概论' ORDER BY s.SNO
- 连接多个表时,我们可以认为他们被连成了一个表。尽管没有创建一个物理表,SQL引擎创建了很多虚拟表,当连接表时,可以在每个表中选择任何一列。
- 关于连接表的数量问题。连接表的数量取决于具体的数据库管理系统,有的规定为最多25个,有的则没有限制。使用时,我们需要查看具体的数据库运行环境。但要注意的是,连接的表越多,响应的时间就越长。
- 进行多表连接时,我们要特别注意不要忘记查询条件,特别是连接多个表且记录数目较多时。因为如果不指明连接条件,系统将对多表进行笛卡尔连接,会产生庞大的数据。
- 根据不同的应用的需求,我们要注意连接方式的选择。
Sql Server的艺术(五) SQL UNION与UNION JOIN运算符的更多相关文章
- SQL Server中常用的SQL语句(转):
SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...
- 引用:初探Sql Server 执行计划及Sql查询优化
原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...
- 【转】SQL Server 运行状况监控SQL语句
SQL Server 运行状况监控SQL语句 Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (D ...
- 监控SQL Server正在执行的SQL语句和死锁情况
原文:监控SQL Server正在执行的SQL语句和死锁情况 SELECT [Individual Query] = SUBSTRING(qt.TEXT, er.statement_start_off ...
- Microsoft SQL Server Version List(SQL Server 版本)
原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Servic ...
- SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager
SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...
- 如何转换SQL Server 2008数据库到SQL Server 2005
背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...
- [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)
[转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...
- 使用CASE表达式替代SQL Server中的动态SQL
原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...
- SQL Server 复制 - 发布订阅(SQL Server 数据同步)
原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...
随机推荐
- Progressive Web Applications
Progressive Web Applications take advantage of new technologies to bring the best of mobile sites an ...
- CSS3让文本自动换行——word-break属性
1.依靠浏览器让文本自动换行 浏览器本身都自带着让文本自动换行的功能. 2.指定自动换行的处理方法 在CSS3中,可以使用word-break属性来自己决定自动换行的处理方法. div{ word-b ...
- linux(三)之linux常用命令二
今天就是星期五了,又可以休息两天了.有点小激动,开心.不过还是要加油,因为还有很多东西等着我去学习呢! 七.chmod 作用:修改文件的权限 7.1.命令格式:chmod mode filename ...
- bzoj:1299: [LLH邀请赛]巧克力棒
原题:http://www.lydsy.com/JudgeOnline/problem.php?id=1299 众多dalao的题解已经很详细了:http://blog.csdn.net/wzq_qw ...
- UVALive3882-And Then There Was One-约瑟夫问题-递推
And Then There Was One Time limit: 3.000 seconds Let's play a stone removing game. Initially, n ston ...
- haslib 模块
一.模块简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串( ...
- input框type=file设置cursor:pointer的问题
为了让美化上传文件框,设置了cursor:pointer;,然而不起作用,然后百度找到了解决方法,设置font-size:0,这样就可以了.
- github网站介绍、并使用git命令管理github(详细描述)
本章学习: 1)熟悉github网站 2)通过git命令远程管理github, 3)git命令使用ssh key密钥无需输入账号密码 1.首先我们来熟悉github网站 1.1 注册github 登录 ...
- linux安装navicat全程记录
国庆期间自己在试着用linux(ubuntu),献上navicat安装方法,以及很多教程里没有写的一些小东西 step1: 去navicat官网下载安装包,网址:http://www.navicat. ...
- 使用vue框架运行npm run dev 时报错解决
使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...