VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

高级SQL关键字

除了支持标准SQL关键字外,Vastbase E100还支持常见地高级SQL关键字:

  • WITH关键字

    WITH查询是Vastbase E100支持的高级SQL特性之一,使用WITH查询在复杂查询中定义一个辅助语句,可以简化SQL并且减少嵌套,因为可以预先定义辅助语句,之后在主查询中多次调用。这一特性常用于复杂查询或递归查询应用场景。

    WITH
    regional_sales AS (
    SELECT region, SUM(amount) AS total_sales
    FROM Orders
    GROUP BY Region
    ),
    top_regions AS (
    SELECT region
    FROM regional_sales
    WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
    )
    SELECT
    region, 
    product, 
    SUM(quantity) AS product_units, 
    SUM(amount) AS product_sales
    FROM
    orders
    WHERE
    region IN (SELECT region FROM top_regions)
    GROUP BY
    region, 
    product;
    
  • RETURNING关键字

    Vastbase E100的RETURNING特性可以返回DML修改的数据,具体为三个场景:INSERT语句后接RETURNING属性返回插入的数据;UPDATE语句后接RETURNING属性返回更新后的新值;DELETE语句后接RETURNING属性返回删除的数据。这个特性的优点在于不需要额外的SQL获取这些值,能够方便应用开发。

  • UPSERT关键字

    Vastbase E100的UPSERT特性是指INSERT…ON CONFLICT UPDATE,用来解决在数据插入过程中数据冲突的情况,比如违反用户自定义约束,在日志数据应用场景中,通常会在事务中批量插入日志数据,如果其中有一条数据违反表上的约束,则整个插入事务将会回滚,而Vastbase E100的UPSERT特性能解决这一问题。

    INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ] [ ON CONFLICT [ conflict_target ] conflict_action ]
    
    where conflict_target can be one of: 
    ( { index_column_name | ( index_expression ) } [ COLLATE collation ] ON CONSTRAINT constraint_name
    
    and conflict_action is one of: 
    DO NOTHING
    DO UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = [ ROW ] ( { expression | DE ( column_name [, ...] ) = ( sub-SELECT )} [, ...][ WHERE condition ]
    
  • CASE关键字

    CASE表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句:

    CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
    END
    

    CASE子句可以用于任何表达式可以出现的地方。每一个condition是一个返回boolean结果的表达式。如果结果为真,那么CASE表达式的结果就是符合条件的result,并且剩下的CASE表达式不会被处理。如果条件的结果不为真,那么以相同方式搜寻任何随后的WHEN子句。如果没有WHEN condition为真,那么CASE表达式的值就是在ELSE子句里的result。如果省略了ELSE子句而且没有条件为真,结果为空。

    例子:

    SELECT * FROM test;
    
    a
    ---
    1
    2
    3
    
    
    SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;
    
    a | case
    ---+-------
    1 | one
    2 | two
    3 | other