集合 *** 作时,两边的输入必须拥有相同的列数,如果数据类型不同的话,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创建了索引,插入会相对变慢
1、选中需要测试的数据库,并查看测试数据库表;由于表t_people_info中的id是主键,求id的个数即是求数据库表的总记录数,代码如下:select count(id) from t_people_info
2、查看数据库表t_people_info中年龄中最小值,需要用到集合函数min(),代码如下:
select min(p_age) from t_people_info
3、查看数据库表t_people_info中年龄中最大值,需要用到集合函数max(),代码如下:
select max(p_age) from t_people_info
4、查看数据库表t_people_info中年龄中平均值,需要用到集合函数avg(),代码如下:
select avg(p_age) from t_people_info
5、若想统计t_people_info中的年龄的总和,用到集合函数sum(),
代码如下:
select sum(p_age) from t_people_info
6、统计数据库表中记录个数,除了使用count(主键)外,可以使用count(1)、count(*)和count(0),
代码如下:
select count(1) from t_people_info
select count(*) from t_people_info
select count(0) from t_people_info
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)