子查询

    子查询可以与SELECT,INSERT,UPDATE和DELETE语句一起使用。

    以下是子查询必须遵守的几个规则:

    • 子查询必须用括号括起来。
    • 子查询在SELECT子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
    • ORDER BY不能用在子查询中,虽然主查询可以使用ORDER BY。可以在子查询中使用GROUP BY,功能与ORDER BY相同。
    • 子查询返回多于一行,只能与多值运算符一起使用,如IN运算符。
    • BETWEEN运算符不能与子查询一起使用,但是,BETWEEN可在子查询内部使用。

    SELECT语句在子查询返回的数据中进行查询。基本语法如下:

    示例:

    创建表customer,数据内容如下。

    1. c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    2. ---------------+---------------+--------------+-------------+--------
    3. 3869 | hello | Grace | | 1000
    4. 3869 | | Grace | |
    5. 3869 | hello | | |
    6. 6985 | maps | Joes | | 2200
    7. 9976 | world | James | | 5000
    8. 4421 | Admin | Local | | 3000
    9. (6 rows)
    1. openGauss=# SELECT * FROM customer_t1 WHERE c_customer_sk IN (SELECT c_customer_sk FROM customer_t1 WHERE amount > 2500) ;
    2. ---------------+---------------+--------------+-------------+--------
    3. 9976 | world | James | | 5000
    4. 4421 | Admin | Local | | 3000
    5. (2 rows)

    子查询也可以与INSERT语句一起使用。INSERT语句使用子查询返回的数据插入到另一个表中。基本语法如下:

    1. INSERT INTO table_name [ (column1 [, column2 ]) ]
    2. SELECT [ *|column1 [, column2 ] ]
    3. [ WHERE VALUE OPERATOR ]

    示例:

    创建表customer_bak,表结构与customer_t1一致。

    将表customer_t1中的数据插入customer_bak。

    1. openGauss=# INSERT INTO customer_bak SELECT * FROM customer_t1 WHERE c_customer_sk IN (SELECT c_customer_sk FROM customer_t1) ;
    2. INSERT 0 6

    插入数据后的customer_bak的表如下:

    1. openGauss=# SELECT * FROM customer_bak;
    2. c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    3. ---------------+---------------+--------------+-------------+--------
    4. 3869 | hello | Grace | | 1000
    5. 3869 | | Grace | |
    6. 3869 | hello | | |
    7. 6985 | maps | Joes | | 2200
    8. 9976 | world | James | | 5000
    9. 4421 | Admin | Local | | 3000
    10. (6 rows)
    1. SET column_name = new_value
    2. [ WHERE OPERATOR [ VALUE ]
    3. (SELECT COLUMN_NAME
    4. [ WHERE ])

    示例:

    把表customer_t1中所有c_customer_sk大于4000的客户的amount更新为原来的0.50倍:

    更新影响2行,更新后表customer_t1数据如下:

    1. openGauss=# SELECT * FROM customer_t1;
    2. c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
    3. ---------------+---------------+--------------+-------------+--------
    4. 3869 | hello | Grace | | 1000
    5. 3869 | | Grace | |
    6. 3869 | hello | | |
    7. 4421 | Admin | Local | | 3000
    8. 6985 | maps | Joes | | 1100
    9. 9976 | world | James | | 2500
    10. (6 rows)

    基本语法如下:

    1. DELETE FROM TABLE_NAME
    2. [ WHERE OPERATOR [ VALUE ]
    3. (SELECT COLUMN_NAME
    4. FROM TABLE_NAME
    5. [ WHERE ])

    示例:

    删除影响2行,删除后的表customer_t1数据如下: