sql的集合操作
原文转自:http://blog.csdn.net/qsyzb/article/details/12560917
SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作。
集合操作主要包括并操作UNION、交操作INTERSECT、差操作EXCEPT。
注意,参加集合操作的各查询结果的列数必须相同;对应的数据类型也必须相同。
本示例中的数据表有student,sc,course三个,数据表的具体内容请看:Mysql数据库中的EXISTS和NOT EXISTS
UNION示例:
例子1.1
题目:查询计算机科学系的学生及年龄不大于19岁的学生。
SQL语句:
- SELECT * FROM Student WHERE Sdept='CS' UNION
- SELECT * FROM Student WHERE Sage<=19
查询结果:
本查询实际上是求计算机系的所有学生与年龄不大于19岁的学生的并集。
与它等效的SQL语句是:
- SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19
注意:虽然这个两个SQL语句是等效的,但是本质上是不一样的,第一个SQL语句是分别进行两次SELECT然后将结果取并集;第二个SQL语句是直接进行了一次SELECT语句查询。
INTERSECT示例:
MySql语句并不支持INTERSECT,所以只能使用其替代语句
例子2.1
题目:查询计算机科学系中年龄不大于19岁的学生。
对应的SQL语句应该是:
- SELECT * FROM Student
- WHERE Sdept='CS'
- INTERSECT
- SELECT * FROM Student
- WHERE Sage<=19;
替代的SQL语句:
- SELECT *
- FROM student
- WHERE Sdept = 'CS'
- AND Sage <=19
查询结果:
例子2.2
题目:查询即选修了课程1又选修了课程2的学生。(就是查询选修课程1的学生集合与选修课程2的学生集合的交集)
对应的SQL语句应该是:
- SELECT Sno FROM SC
- WHERE Cno='1'
- INTERSECT
- SELECT Sno FROM SC
- WHERE Cno='2';
替代的SQL语句为:
(使用IN)
- SELECT Sno
- FROM SC
- WHERE Cno = '1'
- AND Sno
- IN (
- SELECT Sno
- FROM SC
- WHERE Cno = '2'
- )
或者为:
(使用EXISTS)
- SELECT Sno
- FROM SC SCX
- WHERE Cno = '1'
- AND EXISTS (
- SELECT Sno
- FROM SC SCY
- WHERE Cno = '2'
- AND SCX.Sno = SCY.Sno
- )
查询结果为:
或者为:
(使用JOIN ON)
- SELECT *
- FROM SC SCX
- JOIN SC SCY ON ( SCX.Cno = '1'
- AND SCY.Cno = '2'
- AND SCX.Sno = SCY.Sno )
EXCEPT操作:
很不幸,MySql也不支持EXCEPT操作,只能使用替代的语句。
例子3.1
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
对应的SQL语句为:
- SELECT * FROM Student WHERE Sdept='CS'
- EXCEPT
- SELECT * FROM Student WHERE Sage<=19;
也就是查询计算机科学系中年龄大于19岁的学生。
替换语句为:
(直接使用WHERE,不得不说这么做很简单,但是意思上不是很好理解)
- SELECT *
- FROM Student
- WHERE Sdept = 'CS'
- AND Sage >19
查询结果为:
或者替换语句为:
(使用NOT IN)
- SELECT *
- FROM Student
- WHERE Sdept = 'CS'
- AND Sno NOT
- IN (
- SELECT Sno
- FROM Student
- WHERE Sage <=19
- )
查询结果为:
或者使用替换语句为:
(使用NOT EXISTS)
- SELECT *
- FROM Student SX
- WHERE Sdept = 'CS'
- AND NOT
- EXISTS (
- SELECT *
- FROM Student SY
- WHERE SY.Sage <=19
- AND SX.Sno = SY.Sno
- )
查询结果为:
对集合操作结果的排序
ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序。
任何情况下,ORDER BY子句只能出现在最后;对集合操作结果排序时,ORDER BY子句中用数字指定排序属性。
下面是一种错误的写法:
- SELECT * FROM Student
- WHERE Sdept='CS'
- ORDER BY Sno
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY Sno;
正确的应该是:
- SELECT * FROM Student
- WHERE Sdept='CS'
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY 2;
输出结果:
如果写成:
- SELECT * FROM Student
- WHERE Sdept='CS'
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY 1;
输出结果为:
sql的集合操作的更多相关文章
- 用python(2.7)自定义实现SQL的集合操作
有的时候需要在不同的数据库实例之间做集合操作,这就无法直接使用SQL语句的join,left join了.相同类型的数据库之间虽然也有类似于DBLINK和FEDERATED之类的东西,但一来这些东西不 ...
- Oracle视图,序列及同义词、集合操作
一.视图(重点) 视同的功能:一个视图其实就是封装了一个复杂的查询语句.1.创建视图的语法:CREATE VIEW 视图名称 AS 子查询 范例:创建一个包含了20部门的视图CREATE VIEW e ...
- MySQL集合操作类型
SQL语言包含3个集合操作符(union.intersect.expect)以执行各种集合操作. 此外,每个集合操作符可以有两种修饰符:一个表是包含重复项,另一个表是去除重复项(但不一定时所有的重复项 ...
- 彻底理解Oracle中的集合操作与复合查询
--Oracle中的复合查询 复合查询:包含集合运算(操作)的查询 常见的集合操作有: union: 两个查询的并集(无重复行.按第一个查询的第一列升序排序) union all:两个查询的并集(有重 ...
- Oarcle之集合操作
计算字段(列):不在于表中,通过x.÷操作和列进行计算得到的列: 获取员工的年薪 select (ename || '的年薪为:' || sal*12) info from emp; *info 为表 ...
- orcale 之 集合操作
集合操作就是将两个或者多个 sql 查询的结果合并成复合查询.常见的集合操作有UNION(并运算).UNION ALL.INTERSECT(交运算)和MINUS(差运算). UNION UNION 运 ...
- Oracle 学习笔记 14 -- 集合操作和高级子查询
Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的 ...
- MongoDB(三):数据库操作、集合操作
1. 数据库操作 看完前面的文章,大家应该把环境搭建好了,下面我们就开始学习MongoDB的一些基本操作了. 首先我们要了解的一些要点: MongoDB将数据存储为一个文档,数据结构由键值对(key= ...
- SQL进阶系列之7用SQL进行集合运算
写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...
随机推荐
- Android进阶之大话设计模式
一般来说,常用的设计模式有以下八种:单例.工厂.观察者.代理.命令.适配器.合成.访问者 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使 ...
- 关于开源的RTP——jrtplib的使用
session.BeginDataAccess(); if (session.GotoFirstSource()){ do{ RTPPacket *packet; while ((packet = s ...
- iOS 音频拼接
工作中或许会遇到这样的需求,将两段不同的音频合成一个音频(暂且称之为音频拼接),实现起来相对来说不是很难,再介绍如何拼接之前,先了解下AVFoundation下的几个基本知识点. 基本知识 AVAss ...
- android119 侧滑菜单
MainActivity.java package com.heima52.slidemenu; import com.heima52.slidemenu.view.SlideMenu; import ...
- [Effective C++ --006]若不能使用编译器自动生成的函数,就该明确拒绝
■本文内容■□第一节 <引言> 在条款五的讲解中,我们已经知道编译器是聪明的家伙,它会帮助你生成类的构造函数.析构函数.一个copy构造函数和一个赋值运算符.有时真的要感谢编译器所做的这一 ...
- LINUX系统备份
LINUX系统备份 =========================================================== 作者: gswwgph(http://gswwgph.itp ...
- Model
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace iFlytekDemo ...
- IIS 之 启用日志记录
如何为网站启用日志记录或 在 Microsoft Internet Information Services (IIS) 6.0 中,在 IIS 5.0 中,并在 IIS 4.0 中的FTP 站点.可 ...
- How to solve GM MDI cannot complete the installation
Dear Joy, I have a problem using GM MDI diagnostic tool. When I installed it on my laptop, the tool ...
- 多线程NSOperation
NSOperation(经常使用): 1.为什么会有NSOperation?弥补gcd的一些问题:1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消bloc ...