mysql中的union用法以及子查詢綜合應用


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM