union 作用:把2次或多次查询结果合并起来(可以是一张表,也可以是两张或多张表) 要求两次查询的列数一致。 推荐查询的每一列,相对应的列类型也一样。 来自于多张表, 多次sql语句取出的列名可以不一致,此时以第一个sql的列名为准。 1,union all 2,有order by时,要把order by放到最后,对union后的新表起作用。 ------------------------------------------ union把多张表合并起来,新表的内容就是两张表中所有的内容。 如果两张表对应列名的值相同,就会被覆盖,那么在合并后的新表中,只显示一次。 这时如果想要不被覆盖,就要用到union all 下面就是例子: create table ta(id char(1),num int); insert into ta values ("a",5), ("b",10), ("c",15), ("d",20); create table tb(id char(1),num int); insert into tb values ("b",10), ("c",10), ("d",15), ("e",20); 建好两张表后,两张表中id为“b”的值都是10,使用sql语句: select * from ta union select * from tb; 查询出来的结果 id num a 5 b 10 c 15 d 20 c 10 d 15 e 20 从上面这张表可以看出"b"在新表中只出现了一次,想要不被覆盖都显示出来,可以使用union all: select * from ta union all select * from tb; 查询出来的结果 id num a 5 b 10 c 15 d 20 b 10 c 10 d 15 e 20 进而算出两张表中相同id的总和: select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id; 如果不用union all,那么将会有数据丢失。 -------------------- 有order by时,要把order by放到最后,对union后的新表起作用。 对新表中按num降序排列: (select * from ta) union all (select * from tb) order by num desc; 有order by 和limit 配合使用时, (select * from ta order by num desc limit 2) union all (select * from tb order by num desc limit 2);
时间: 2024-10-05 06:58:03