学习本节所用表:

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运算符的更多相关文章

  1. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  2. 引用:初探Sql Server 执行计划及Sql查询优化

    原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...

  3. 【转】SQL Server 运行状况监控SQL语句

    SQL Server 运行状况监控SQL语句   Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (D ...

  4. 监控SQL Server正在执行的SQL语句和死锁情况

    原文:监控SQL Server正在执行的SQL语句和死锁情况 SELECT [Individual Query] = SUBSTRING(qt.TEXT, er.statement_start_off ...

  5. 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 ...

  6. SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager

    SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...

  7. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  8. [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)

    [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...

  9. 使用CASE表达式替代SQL Server中的动态SQL

    原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...

  10. SQL Server 复制 - 发布订阅(SQL Server 数据同步)

    原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...

随机推荐

  1. sublime text3安装、注册及常用插件

    由于换电脑,重装系统等问题,总要重装sublime.每次都要查来查去,不如自己记下来,以后再装也方便. 一.下载 官网下载安装包(http://www.sublimetext.com/) :然后直接点 ...

  2. windbg指定SOS版本,执行扩展命令报错

    调试dump文件,加载相匹配版本的sos/clr时,绝大多数都是可以正常使用的. 然而凡事都有例外,今天在做类似工作时,遇到了错误: CLRDLL: Consider using ".cor ...

  3. shiro真正项目中的实战应用核心代码!!!

    欢迎转载!!!请注明出处!!! 说道shiro的学习之路真是相当坎坷,网上好多人发的帖子全是简单的demo样例,核心代码根本没有,在学习过程中遇到过N多坑. 经过自己的努力,终于整出来了,等你整明白之 ...

  4. Node+mongodb线上部署到阿里云

    Node+mongodb线上部署到阿里云 部署使用的主要工具是pm2+nginx,使用码云的私有仓库,自动部署到服务器,私有仓库和服务器要事先设置好免密码登录.使用DNSPOD进行域名解析.事先准备好 ...

  5. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

  6. HDU 3377 Plan

    Problem Description One day, Resty comes to an incredible world to seek Eve -- The origin of life. L ...

  7. HDU 2546 饭卡(01背包裸题)

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  8. BZOJ 3097: Hash Killer I【构造题,思维题】

    3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 963  Solved: 36 ...

  9. centos7+cdh5.10.0搭建

    一.选择环境: 1.说明 本次部署使用台机器,3台用于搭建CDH集群,1台为内部源.内部源机器是可以连接公网的,可以提前部署好内部源,本次部署涉及到的服务器的hosts配置如下: 192.168.10 ...

  10. 通俗理解TCP握手次数是三次

    理解之后,应该说是至少三次就可以保证可靠传输了. 看到网上一篇帖子http://www.cnblogs.com/TechZi/archive/2011/10/18/2216751.html是这么说的, ...