
集合 *** 作时,两边的输入必须拥有相同的列数,如果数据类型不同的话,mysql会自动进行隐式转化 ;同时,结果列的名称由第一个查询的列的名称决定。下面看一下例子:
sql语句为:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL结果是:
如果是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL
如果两次查询的列个数不一致,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL
在多个列查询时,只要有一个列的数据不一致时,都是无法去重的;也就是去重是每个列的数据完全一致,比如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL
这几个例子可以看出UNION (DISTINCT) 与 UNION ALL的用法了吧,下面讲一下UNION (DISTINCT)的实现方式:
一:创建一张虚拟表;
二:对这张虚拟表的列添加唯一索引,即UNIQUE INDEX
三:将结果插入虚拟表
四:返回虚拟表
如何判断是否创建一个虚拟表,我们可以通过一下语句判断:
SHOW STATUS LIKE 'Created_tmp_tables'
SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL
SHOW STATUS LIKE 'Created_tmp_tables' 结果是:
可见结果3比结果1多1,在 *** 作第二个 UNION语句时创建了一个虚拟表;如果UNION创建了索引,插入会相对变慢
集合(SET)mysql>create table jihe(f1 set('f','m'))
Query OK, 0 rows affected (0.11 sec)
mysql>desc jihe
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| f1| set('f','m') | YES | | NULL| |
+-------+--------------+------+-----+---------+-------+
可以插入值 "f" "m"
mysql>insert into jihe values("f")
Query OK, 1 row affected (0.56 sec)
mysql>insert into jihe values("m")
Query OK, 1 row affected (0.19 sec)
可以按照序号输入 注意序号为 1 2 4 8 16 32 ....
mysql>insert into jihe values("1")
Query OK, 1 row affected (0.11 sec)
mysql>insert into jihe values("2")
Query OK, 1 row affected (0.11 sec)
所以如果是3那插入的值为 第一个和第二个
mysql>insert into jihe values("3")
Query OK, 1 row affected (0.17 sec)
+-------+
| f1|
+-------+
| f |
| m |
| f |
| m |
| f,m |
+-------+
其他字母不能插入
mysql>insert into jihe values("q")
ERROR 1265 (01000): Data truncated for column 'f1' at row 1
插入空
mysql>insert into jihe values("0")
Query OK, 1 row affected (0.11 sec)
超出序号之和不能插入
mysql>insert into jihe values("4")
ERROR 1265 (01000): Data truncated for column 'f1' at row 1
SQL1中查询出全部记录,并且根据id和created_at拼接为新的字段k,在SQL2中过滤出符合条件的记录,并且根据id和created_at拼接为新的字段;最后在SQL3中,根据字段k去查询过滤出符合条件的记录。
结果如下(共有31条记录,其中有几个需要过滤):
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)