初步介绍MySQL中的集合操作

   啥是集合操作?

  通常来说,将联接操作看作是表之间的水平操作,因为该操作生成的虚拟表包含两个表中的列。而我这里总结的集合操作,一般将这些操作看作是垂直操作。MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL。

  与联接操作一样,集合操作也是对两个输入进行操作,并生成一个虚拟表。在联接操作中,一般把输入表称为左输入和右输入。集合操作的两个输入必须拥有相同的列数,若数据类型不同,MySQL数据库自动将进行隐式转换。同时,结果列的名称由左输入决定。

  前期准备

  准备测试表table1和table2:

  create table table1

  (aid int not null auto_increment,

  title varchar(20),

  tag varchar(10),

  primary key(aid))

  engine=innodb default charset=utf8;

  create table table2

  (bid int not null auto_increment,

  title varchar(20),

  tag varchar(10),

  primary key(bid))

  engine=innodb default charset=utf8;

  插入以下测试数据:

  insert into table1(aid, title, tag) values(1, 'article1', 'MySQL');

  insert into table1(aid, title, tag) values(2, 'article2', 'PHP');

  insert into table1(aid, title, tag) values(3, 'article3', 'CPP');

  insert into table2(bid, title, tag) values(1, 'article1', 'MySQL');

  insert into table2(bid, title, tag) values(2, 'article2', 'CPP');

  insert into table2(bid, title, tag) values(3, 'article3', 'C');

  UNION DISTINCT

  UNION DISTINCT组合两个输入,并应用DISTINCT过滤重复项,一般可以直接省略DISTINCT关键字,直接使用UNION。

  UNION的语法如下:

  SELECT column,... FROM table1

  UNION [ALL]

  SELECT column,... FROM table2

  ...

  在多个SELECT语句中,对应的列应该具有相同的字段属性,且第一个SELECT语句中被使用的字段名称也被用于结果的字段名称。

  现在我运行以下sql语句:

  (select * from table1) union (select * from table2);

  将会得到以下结果:

  +-----+----------+-------+

  | aid | title | tag |

  +-----+----------+-------+

  | 1 | article1 | MySQL |

  | 2 | article2 | PHP |

  | 3 | article3 | CPP |

  | 2 | article2 | CPP |

  | 3 | article3 | C |

  +-----+----------+-------+

  我们发现,表table1和表table2中的重复数据项:

  | 1 | article1 | MySQL |

  只出现了一次,这就是UNION的作用效果。

  MySQL数据库目前对UNION DISTINCT的实现方式如下:

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

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

  将输入的数据插入临时表;

  返回虚拟表。

  因为添加了唯一索引,所以可以过滤掉集合中重复的数据项。这里重复的意思是SELECT所选的字段完全相同时,才会算作是重复的。

  UNION ALL

  UNION ALL的意思是不会排除掉重复的数据项,比如我运行以下的sql语句:

  (select * from table1) union all (select * from table2);

  你将会得到以下结果:

  +-----+----------+-------+

  | aid | title | tag |

  +-----+----------+-------+

  | 1 | article1 | MySQL |

  | 2 | article2 | PHP |

  | 3 | article3 | CPP |

  | 1 | article1 | MySQL |

  | 2 | article2 | CPP |

  | 3 | article3 | C |

  +-----+----------+-------+

  发现重复的数据并不会被筛选掉。

  在使用UNION DISTINCT的时候,由于向临时表中添加了唯一索引,插入的速度显然会因此而受到影响。如果确认进行UNION操作的两个集合中没有重复的选项,最有效的办法应该是使用UNION ALL。

时间: 2025-01-19 01:29:42

初步介绍MySQL中的集合操作的相关文章

初步介绍MySQL中的集合操作_Mysql

啥是集合操作? 通常来说,将联接操作看作是表之间的水平操作,因为该操作生成的虚拟表包含两个表中的列.而我这里总结的集合操作,一般将这些操作看作是垂直操作.MySQL数据库支持两种集合操作:UNION DISTINCT和UNION ALL. 与联接操作一样,集合操作也是对两个输入进行操作,并生成一个虚拟表.在联接操作中,一般把输入表称为左输入和右输入.集合操作的两个输入必须拥有相同的列数,若数据类型不同,MySQL数据库自动将进行隐式转换.同时,结果列的名称由左输入决定.前期准备 准备测试表tab

简单介绍MySQL中的事务机制

  从一个问题开始 最近银行这个事情闹的比较厉害啊,很多储户的钱放在银行,就不翼而飞了,而银行还不管不问,说是用户的责任,打官司,用户还能输了,这就是"社会主义".咱还是少发牢骚,多种树,莫谈国事. 说到银行存钱,就不得不说一下从银行取钱这件事情,从ATM机取钱这件简单的事情,实际上主要分为以下几个步骤: 登陆ATM机,输入密码; 连接数据库,验证密码; 验证成功,获得用户信息,比如存款余额等; 用户输入需要取款的金额,按下确认键; 从后台数据库中减掉用户账户上的对应金额; ATM吐出

简单介绍MySQL中的事务机制_Mysql

从一个问题开始 最近银行这个事情闹的比较厉害啊,很多储户的钱放在银行,就不翼而飞了,而银行还不管不问,说是用户的责任,打官司,用户还能输了,这就是"社会主义".咱还是少发牢骚,多种树,莫谈国事. 说到银行存钱,就不得不说一下从银行取钱这件事情,从ATM机取钱这件简单的事情,实际上主要分为以下几个步骤:     登陆ATM机,输入密码:     连接数据库,验证密码:     验证成功,获得用户信息,比如存款余额等:     用户输入需要取款的金额,按下确认键:     从后台数据库中减

MySQL中多表操作和批处理详细介绍

  多表操作 在一个数据库中,可能存在多个表,这些表都是相互关联的.我们继续使用前面的例子.前面建立的表中包含了员工的一些基本信息,如姓名.性别.出生日期.出生地.我们再创建一个表,该表用于描述员工所发表的文章,内容包括作者姓名.文章标题.发表日期. 1.查看第一个表mytable的内容: mysql> select * from mytable; +----------+------+------------+-----------+ | name | sex | birth | birtha

简单介绍MySQL中索引的使用方法_Mysql

数据库索引是一个数据结构,提高操作的速度,在一个表中可以使用一个或多个列,提供两个快速随机查找和高效的顺序访问记录的基础创建索引. 在创建索引时,它应该被认为是将SQL查询的那些列上创建一个或多个索引的列. 实际上,指数也保持主键或索引字段和指针的实际表中每条记录的表型. 用户无法看到索引,它们只是用来加快查询速度,将用于数据库搜索引擎找到的记录速度非常快. INSERT和UPDATE语句表上的索引需要更多的时间,成为快速对这些表的SELECT语句.究其原因是,当进行插入或更新,数据库以及需要惰

初步介绍Python中的pydoc模块和distutils模块_python

pydoc Ka-Ping Yee 曾创建了一个相当著名的模块,名叫 pydoc (比较而言: pydoc 可以做到 perldoc 所能做的任何事,并且做得更好.更漂亮:-).对于 Python 2.1 来说, pydoc (以及它支持的 inspect )是标准库的一部分.而对于使用 Python 1.5.2.1.6 或者 2.0 版本的用户来说,下载并安装 pydoc 也很简单 ― 请立即下载(请参阅 参考资料). 作为提供给阅读这篇 Python 文章的任何初学者的背景资料,Python

MySQL中truncate误操作后的数据恢复案例_Mysql

实际线上的场景比较复杂,当时涉及了truncate, delete 两个操作,经确认丢数据差不多7万多行,等停下来时,差不多又有共计1万多行数据写入. 这里为了简单说明,只拿弄一个简单的业务场景举例. 测试环境: Percona-Server-5.6.16 日志格式: mixed 没起用gtid 表结构如下: CREATE TABLE `tb_wubx` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL

简单介绍MySQL中GROUP BY子句的使用_Mysql

 可以使用GROUP BY组值一列,并且如果愿意的话,可以将该列进行计算.使用COUNT,SUM,AVG等功能的分组列. 要了解GROUP BY子句考虑的EMPLOYEE_TBL的的表具有以下记录: mysql> SELECT * FROM employee_tbl; +------+------+------------+--------------------+ | id | name | work_date | daily_typing_pages | +------+------+---

mysql中模糊查询的四种用法介绍_Mysql

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有