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 |
+ + + + ----- ---------- -------
发现重复的数据不会被过滤掉。
当使用联合显式时,插入对临时表的唯一索引显然会影响插入速度。如果在两组并集操作中没有重复选项,那么最有效的方法就是使用联合所有。