mysql中的set操作初探

什么是集合操作

一般来说,加入操作是表之间的横向操作,因为此操作生成的虚拟表包含两个表中的列。我总结这里一般把这些业务垂直操作集合操作。MySQL数据库支持两集合运算:工会和工会都不同。

与参加运算,集合操作也在两个输入和生成虚拟表操作。在加入操作,输入表通常被称为左输入正确的输入。集合运算的两输入必须有相同的列数,如果数据类型不同,MySQL数据库将自动转换数据。同时,结果列的名称是由左输入确定。

事先的准备工作

准备测试表表和表:


创建表的表
援助(int不空auto_increment,
标题varchar(20),
标签varchar(10),
主键(辅助)
InnoDB引擎=默认的字符集utf8;

创建表的表
投标(INT NOT NULL auto_increment,
标题varchar(20),
标签varchar(10),
主键(投标)
InnoDB引擎=默认的字符集utf8;




插入以下测试数据:


插入表1(援助、标题、标签)的值(1,'article1 ','mysql);
插入表1(援助、标题、标签)的值(2,'article2 ','php);
插入表1(援助、标题、标签)的值(3,'article3 ','cpp);

插入表(投标、标题、标签)的值(1,'article1 ','mysql);
插入表(投标、标题、标签)的值(2,'article2 ','cpp);
插入表(投标、标题、标签)的值(3,'article3、c);




结合不同的
联合显式结合两个输入,使用不同的方式过滤重复项,通常可以省略不同的关键字并直接使用联合。

联合的语法如下:


选择列,从表1…
联合{ }
选择列,从表2…





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

现在我运行下面的SQL语句:


(select * from表1)联盟(select * from表);




将得到以下结果:


+ + + + ----- ---------- -------
标题标签| | | |援助
+ + + + ----- ---------- -------
1条| | | MySQL |
2条| | | PHP |
| 3 |第三条| CPP |
2条| | | CPP |
| 3 |第三条| C |
+ + + + ----- ---------- -------




我们发现在Table1表和表表的重复数据项是:


1条| | | MySQL |




只有一次,这就是联盟的效果。

当前对联合数据库MySQL数据库的实现如下:

创建一个临时表,即一个虚拟表;
在临时表的列中添加唯一索引;
将输入数据插入临时表中;
返回虚拟表。


由于添加了唯一索引,集合中的重复数据项可以被过滤掉。这里重复的是,所选字段是完全相同的,并且它们是重复的。



联盟的所有


联合意味着不能排除重复的数据项,例如我运行以下SQL语句:


(select * from表1所有(联盟)选择*从表2);




您将得到以下结果:


+ + + + ----- ---------- -------
标题标签| | | |援助
+ + + + ----- ---------- -------
1条| | | MySQL |
2条| | | PHP |
| 3 |第三条| CPP |
1条| | | MySQL |
2条| | | CPP |
| 3 |第三条| C |
+ + + + ----- ---------- -------




发现重复的数据不会被过滤掉。

当使用联合显式时,插入对临时表的唯一索引显然会影响插入速度。如果在两组并集操作中没有重复选项,那么最有效的方法就是使用联合所有。