mysql中的union用法

mysql中的union用法,第1张

UNION在mysql中被称为集合 *** 作, *** 作类型分为两种:UNION DISTINCT 和  UNION ALL;注意:UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。

集合 *** 作时,两边的输入必须拥有相同的列数,如果数据类型不同的话,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条记录,其中有几个需要过滤):


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7101150.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存