union查詢就是把2條或者多條sql語句的查詢結果,合併成一個結果集。 如:sql1: N行,sql2: M行,sql1 union sql2 > N+M行 1、能否從2張表查詢再union呢? 可以,union 合併的是"結果集",不區分在自於哪一張表. 2、取自於2張表,通過"別名"讓2個結果 ...
union查詢就是把2條或者多條sql語句的查詢結果,合併成一個結果集。
如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行
1、能否從2張表查詢再union呢?
可以,union 合併的是"結果集",不區分在自於哪一張表.
2、取自於2張表,通過"別名"讓2個結果集的列一致。那麼,如果取出的結果集,列名字不一樣,還能否union.
可以,而且取出的最終列名,以第1條sql為準
3、union滿足什麼條件就可以用了?
只要結果集中的列數一致就可以.(如都是2列或者N列)
4、union後結果集,可否再排序呢?
可以的。Sql1 union sql2 order by 欄位
註意: order by 是針對合併後的結果集排的序.
5、如果Union後的結果有重覆(即某2行,或N行,所有的列,值都一樣),怎麼辦?
這種情況是比較常見的,預設會去重.
6、如果不想去重怎麼辦?
union all
下麵通過實例來驗證union的常用特性以及應用:
CREATE TABLE num_a ( id VARCHAR( 3 ) NOT NULL, num INT(3 ) UNSIGNED NOT NULL )CHARSET utf8 ENGINE MYISAM; CREATE TABLE num_b ( id VARCHAR( 3 ) NOT NULL, num INT(3 ) UNSIGNED NOT NULL )CHARSET utf8 ENGINE MYISAM; INSERT INTO num_a VALUES ( 'a', 5 ); INSERT INTO num_a VALUES ( 'b', 10 ); INSERT INTO num_a VALUES ( 'c', 15 ); INSERT INTO num_a VALUES ( 'd', 10 ); INSERT INTO num_b VALUES ( 'b', 5 ); INSERT INTO num_b VALUES ( 'c', 15 ); INSERT INTO num_b VALUES ( 'd', 20 ); INSERT INTO num_b VALUES ( 'e', 99 );
1,union會去掉重覆的行
SELECT id,num FROM num_a UNION SELECT id, num FROM num_b
2、order by對union後的結果集排序
SELECT id,num FROM num_a UNION SELECT id, num FROM num_b ORDER BY num DESC
3、UNION ALL不會過濾重覆的行
SELECT id,num FROM num_a UNION ALL SELECT id, num FROM num_b
4、把num_a和num_b不同的索引結果保留, 相同的索引結果相加 然後輸出:
SELECT a.id, ( a.num + b.num ) AS num FROM num_a AS a INNER JOIN num_b AS b ON a.id = b.id UNION ALL SELECT * FROM num_a AS a WHERE NOT EXISTS( SELECT * FROM num_b AS b WHERE a.id = b.id ) UNION ALL SELECT * FROM num_b AS b WHERE NOT EXISTS( SELECT * FROM num_a AS a WHERE a.id = b.id ) ORDER BY id ASC
5、第二種方法用子查詢分組統計,也可以達到同樣的效果
SELECT id, SUM( num ) AS num FROM ( SELECT * FROM num_a a UNION ALL SELECT * FROM num_b b ) tmp GROUP BY id;