我们之前讲到了联接操作【对于联接操作的学习烦请移步:http://www.cnblogs.com/seker/p/6523592.html】,联接操作可以看做是表之间的水平操作,通过联接操作得到的记录包含两表的列。

集合操作可以看做是表之间的垂直操作,通过集合操作得到的记录中的列名仅由第一个select决定。

MySQL支持两种集合操作;union all和union distinct,union distinct可以简写为union。进行集合操作的两表必须拥有两同的列数(列名不同没有影响),例如表A有5列,那表B也必须有5列,列数不同是不允许进行集合操作的。另外若列的数据类型不一样,没有关系,MySQL会隐式帮我们做类型转换。

“进行集合操作的两表必须拥有两同的列数”,来看一个实例,select * from t_commodity c union select * from t_commodity_type ct;(这里我们为了方便演示使用了*,在实际开发中不建议这样做)

MySQL会提示如下错误,这是因为两表的列数不同。

在进行集合操作时,建议最好给参与集合操作的各select添加括号,不然可能会遭遇一些问题,例如在select中使用了order by和limit,来看一个实例,select * from t_user_collect uc order by uc.id_temp desc limit 1,3 union select * from t_user_order uo order by uo.id desc limit 1,3;(这里我们为了方便演示使用了*,在实际开发中不建议这样做)

如下是MySQL给出的提示,意思是“union和order by的使用不正确”。

现在我们给各个select加上括号,(select * from t_user_collect uc order by uc.id_temp desc limit 1,3) union (select * from t_user_order uo order by uo.id desc limit 1,3);(这里我们为了方便演示使用了*,在实际开发中不建议这样做)

我们可以看到能够正常得到数据,

这里需要进行一下补充说明,select * from t_user_collect uc order by uc.id_temp desc limit 1,3; 单独执行有3条数据,

select * from t_user_order uo order by uo.id desc limit 1,3; 单独执行也有3条数据,

为什么实际查询出来的仅有5条数据呢?因为前面我们有说到union是union distinct的简写,因此其中一条重复的数据被distinct给过滤掉了。

另外我们从得到的列名可以看出其都来自第一个select的表t_user_collect,这也就解释了我们前面说到的“通过集合操作得到的记录中的列名仅由第一个select决定”。

union all和union distinct

我们来说一下union distinct的实现方式:

①创建一张临时表,这张临时表就是一张虚拟表;

②为这张临时表的列添加唯一索引;

③将进行集合操作的数据插入到临时表;

④返回临时表;

从上述过程中我们可以看到,在创建了临时表后就为其添加了唯一索引,因此在将数据插入到临时表中时,若插入的数据会导致唯一索引重复,则这一条数据是不允许被插入到临时表中的,这也就完成了去重操作。

当然由于向临时表中添加了唯一索引,因此会影响向临时表中插入数据的速度,所以如果你确定进行集合操作的两个表中没有重复数据,则建议使用union all,它会得到两表中所有的数据,不会有去重这一行为。

转载于:https://www.cnblogs.com/seker/p/6539610.html

MySQL知识树 集合操作相关推荐

  1. mysql b 树删除操作,B-树的删除过程介绍

    在B-树中删除节点时,可能会发生向兄弟节点借元素,和孩子节点交换元素,甚至节点合并的过程. 我们以下面的树为基础,进行删除操作. 首先明确一下这个树的定义.它是一个5阶树.所以,每个节点内元素个数为2 ...

  2. mysql 伪表查询语句_MySql系列05:MySql中DQL查询操作

    1.表的准备 准备四张表: dept(部门表).emp(员工表).salgrade(薪资等级表).bonus(奖金表) create table DEPT( DEPTNO int(2) not nul ...

  3. mysql高级之子查询,多表查询,外连接,集合操作,内部函数与数据控制_月隐学python第24课

    目录 ⼀.⾼级 1.1 ⼦查询 1.2 多表查询 1.3 外连接 1.4 集合操作 1.5 内部函数 ⼆.数据控制 2.1 事务 2.2 授权管理 ⼀.⾼级 1.1 ⼦查询 ⼦查询嵌⼊到其他查询语句中 ...

  4. MySQL/sqlserver查询in操作 查询结果按in集合顺序显示

    2019独角兽企业重金招聘Python工程师标准>>> MySQL/sqlserver查询in操作 查询结果按in集合顺序显示 MySQL用下面的语句 select * from i ...

  5. mysql和foxbase_Mysql使用基础知识和MYSQL数据库的简单操作 -(转)

    Mysql使用基础知识 有很多朋友虽然安装好了mysql但却不知如何使用它.在这篇文章中我们就从连接MYSQL.修改密码.增加用户等方面来学习一些MYSQL的常用命令. 一.连接MYSQL.格式:my ...

  6. MySQL 8.0.31 集合操作INTERSECT和EXCEPT

    对于聚合的功能MySQL是都是默默的发展.在最新的8.0.31版本中提供对集合操作INTERSECT和EXCEPT.这样一来,集合操作功能基本圆满了.MySQL5.7.40版本是不支持这个集合的. I ...

  7. sas软件使用mysql吗_图解SAS软件统计分析(一):基本知识和界面操作

    图解SAS软件统计分析(一):基本知识和界面操作.本文介绍常用统计分析软件SAS,大多数研究者一听到SAS要编程,就想着会很难,但当你熟悉SAS软件的基本操作界面之后,基本上通过拷贝复制就能得到你想要 ...

  8. 最常问的MySQL面试题集合

    除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1:char.varcha ...

  9. 企业面试题|最常问的MySQL面试题集合(一)

    问题1:char.varchar的区别是什么? varchar是变长而char的长度是固定的.如果你的内容是固定大小的,你会得到更好的性能. 问题2: TRUNCATE和DELETE的区别是什么? D ...

最新文章

  1. HDU 2000 ASCII码排序
  2. Ubuntu系统安装Hadoop3.1.3并进行单机/伪分布式配置
  3. PHP__call __callStatic
  4. 跟我一起学.NetCore之依赖注入
  5. python apscheduler执行_python apscheduler 每两小时执行一次
  6. 使用七牛图片遇到的图片方向翻转问题
  7. (15)VHDL测试激励编写(复位)
  8. JDK,JRE和JVM之间的区别
  9. Spring @Bean @Scope @Qualifier
  10. 项目遇到的问题总结(四):单页面首屏加载慢解决方案
  11. CPU,内存, 硬盘,指令之间的关系
  12. 1.3 Shell脚本编程基础之条件测试
  13. c#生成token访问的接口_python测试开发django60.token登录(TokenAuthentication)
  14. 字典生成_数据字典文档自成工具,一键生成,效率倍增
  15. java交接文档_如何写好交接文档
  16. HTML+CSS实现静态小米商城首页(附完整代码)
  17. 扩展欧几里得算法的讲解
  18. 本台计算机控制网速,笔记本网速限制(笔记本电脑限制网速怎么设置)
  19. C语言程序中数字字符是什么,C语言中如何识别字符与数字
  20. python怎样批量修改文件大小_使用python对文件夹下的照片进行批量修改尺寸

热门文章

  1. azw3转换为pdf_干货:如何Java 将 Word 文档转换为 PDF
  2. python idle是什么_下载下来的IDLE是个什么鬼
  3. mysql编译安装原理_MySQL编译安装全过程
  4. 把配置的jenkins主路径删掉_Jenkins详细教程
  5. python print format_Python中的format格式化输出
  6. c语言成绩管理系统不用结构体,不用指针链表和结构体数组怎么编学生成绩管理系统啊...
  7. 正弦函数_题型和解析 | 三角函数(补充)
  8. 开发接口文档_产品经理必懂的接口文档撰写方式
  9. 菜刀php教程,Weevely(php菜刀)工具使用详解
  10. mysql 获取递增id_如何在MySQL中获取下一个自动递增ID?