更新时间:2025-09-12 GMT+08:00
分享

复合查询

包含复合运算符的查询,即复合查询。所有的复合查询都具有相同的优先级,参加集合操作的各查询结果的列数、表达式的数量都必须一致,类型必须兼容。

UNION

常见的集合运算有:

  • UNION:两个查询结果集的并集,对结果进行去重。
  • UNION ALL:两个查询的并集,只将两个查询的结果合并。

UNION示例

-- 建表并插入数据
m_db=# CREATE TABLE test1(c11 INT, c12 VARCHAR(20));
m_db=# INSERT INTO test1 VALUES (1,'a'),(2,'b'),(4,'d');

m_db=# CREATE TABLE test2(c21 INT, c22 VARCHAR(20)); 
m_db=# INSERT INTO test2 VALUES (1,'a'),(3,'c');
  • UNION
    m_db=# SELECT * FROM test1 UNION SELECT * FROM test2;
     c11 | c12 
    -----+-----
       4 | d
       3 | c
       1 | a
       2 | b
    (4 rows)
  • UNION ALL
    m_db=# SELECT * FROM test1 UNION ALL SELECT * FROM test2;
     c11 | c12 
    -----+-----
       1 | a
       2 | b
       4 | d
       1 | a
       3 | c
    (5 rows)

EXCEPT

常见的交集运算有:

  • EXCEPT:在第一个查询结果中去除两个查询结果的交集,并对结果进行去重。
  • EXCEPT ALL:在第一个查询结果中去除两个查询结果的交集,不进行去重。
  • EXCEPT DISTINCT:在第一个查询结果中去除两个查询结果的交集,并对结果进行去重。

EXCEPT示例

-- 建表并插入数据
m_db=# CREATE TABLE a(m int,n int);
m_db=# INSERT INTO a(m,n) VALUES(1,2);
m_db=# INSERT INTO a(m,n) VALUES(2,3);
m_db=# INSERT INTO a(m,n) VALUES(3,4);

m_db=# CREATE TABLE b(m int,n int);
m_db=# INSERT INTO b(m,n) VALUES(1,2);
m_db=# INSERT INTO b(m,n) VALUES(1,3);
m_db=# INSERT INTO b(m,n) VALUES(3,4);

m_db=# CREATE TABLE c(m int,n int);
m_db=# INSERT INTO c(m,n) VALUES(1,3);
m_db=# INSERT INTO c(m,n) VALUES(1,3);
m_db=# INSERT INTO c(m,n) VALUES(3,4);
  • EXCEPT
    m_db=# SELECT * FROM a EXCEPT SELECT * FROM b;
     m | n
    ---+---
     2 | 3
    (1 row)
    
    m_db=# SELECT * FROM a EXCEPT SELECT * FROM c;
     m | n
    ---+---
     2 | 3
     1 | 2
    (2 rows)
    
    m_db=# SELECT * FROM b EXCEPT SELECT * FROM a;
     m | n
    ---+---
     1 | 3
    (1 row)
    -- 对查询结果进行去重。
    m_db=# SELECT * FROM c EXCEPT SELECT * FROM a;
     m | n
    ---+---
     1 | 3
    (1 row)
  • EXCEPT ALL
    m_db=# SELECT * FROM a EXCEPT ALL SELECT * FROM b;
     m | n
    ---+---
     2 | 3
    (1 row)
    
    m_db=# SELECT * FROM a EXCEPT ALL SELECT * FROM c;
     m | n
    ---+---
     2 | 3
     1 | 2
    (2 rows)
    
    m_db=# SELECT * FROM b EXCEPT ALL SELECT * FROM a;
     m | n
    ---+---
     1 | 3
    (1 row)
    
    m_db=# SELECT * FROM c EXCEPT ALL SELECT * FROM a;
     m | n
    ---+---
     1 | 3
     1 | 3
    (2 rows)
  • EXCEPT DISTINCT
    m_db=# SELECT * FROM a EXCEPT DISTINCT SELECT * FROM b;
     m | n
    ---+---
     2 | 3
    (1 row)
    
    m_db=# SELECT * FROM a EXCEPT DISTINCT SELECT * FROM c;
     m | n
    ---+---
     2 | 3
     1 | 2
    (2 rows)
    
    m_db=# SELECT * FROM b EXCEPT DISTINCT SELECT * FROM a;
     m | n
    ---+---
     1 | 3
    (1 row)
    -- 对查询结果进行去重。
    m_db=# SELECT * FROM c EXCEPT DISTINCT SELECT * FROM a;
     m | n
    ---+---
     1 | 3
    (1 row)
    
    m_db=# DROP TABLE a,b,c;

相关文档