欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

ArangoDB SQL/AQL-比较

最编程 2024-07-15 12:54:44
...


AGGREGATION

在SQL和AQL中都有一系列函数和子句用于组或进一步细化结果集以获取所需的信息。例如,计算文档,查找最小值或最大值,等等。

分组统计


SQL:

1

2

3

SELECT   gender  ,     COUNT  (  *  )     AS     number   FROM   users

    WHERE   active     =     1

    GROUP   BY   gender  ;

AQL:

1

2

3

4

5

6

7

8

FOR     user   IN     users

    FILTER   user  .  active     ==     1

    COLLECT   gender     =     user  .  gender

      WITH     COUNT     INTO     number

    RETURN     {  

      gender  :     gender  ,  

      number  :     number  

    }










分组


SQL:

1

2

3

4

5

6

7

SELECT   YEAR  (  dateRegister  )     AS     year  ,  

         MONTH  (  dateRegister  )     AS     month  ,  

         COUNT  (  *  )     AS     number

    FROM   users

    WHERE   active     =     1

    GROUP   BY   year  ,     month

    HAVING   number     >     20  ;

AQL:

1

2

3

4

5

6

7

8

9

10

11

12

FOR     user   IN     users

    FILTER   user  .  active     ==     1

    COLLECT

      year     =     DATE_YEAR  (  user  .  dateRegistered  )  ,  

      month     =     DATE_MONTH  (  user  .  dateRegistered  )  

      WITH     COUNT     INTO     number

      FILTER     number     >     20

      RETURN     {  

        year  :     year  ,  

        month  :     month  ,  

        number  :     number  

      }













最大/最小计算


SQL:

1

2

3

4

SELECT   MIN  (  dateRegistered  )     AS     minDate  ,  

    MAX  (  dateRegistered  )     AS     maxDate

    FROM   users

      WHERE   active     =     1  ;

AQL:

1

2

3

4

5

6

FOR     user   IN     users

    FILTER   user  .  active     ==     1

    COLLECT   AGGREGATE

      minDate     =     MIN  (  user  .  dateRegistered  )  ,

      maxDate     =     MAX  (  user  .  dateRegistered  )

    RETURN     {     minDate  ,     maxDate     }









分组汇集


SQL: *

1

2

3

4

SELECT   gender  ,     GROUP_CONCAT  (  id  )     AS     userIds

    FROM   users

      WHERE   active     =     1

      GROUP   BY   gender  ;

AQL:

1

2

3

4

5

6

7

8

FOR     user   IN     users

    FILTER   user  .  active     ==     1

    COLLECT   gender     =     user  .  gender

      INTO     usersByGender

    RETURN     {  

      gender  :     gender  ,  

      userIds  :     usersByGender  [  *  ]  .  user  .  _key

    }











JOINS

与关系数据库中的连接类似,ArangoDB也有自己的连接实现

内连接(inner join)


SQL:

1

2

3

SELECT     *     FROM   users

    INNER   JOIN   friends

    ON     (  friends  .  user     =     users  .  id  )  ;

AQL:
可以通过嵌套FOR循环和使用filter语句:在AQL中轻松地表达内部连接。

1

2

3

4

FOR     user   IN     users

    FOR     friend   IN     friends

      FILTER   friend  .  user     ==     user  .  _key

      RETURN     MERGE  (  user  ,     friend  )

注:
在AQL中,首选方法是从各个子属性的不同集合中返回文档部分,以避免属性名称冲突,例如: 

1

2

3

4

FOR     user   IN     users

    FOR     friend   IN     friends

      FILTER   friend  .  user     ==     user  .  _key

      RETURN     {     user  :     user  ,     friend  :     friend     }

还可以将匹配文档返回到水平列表中:

1

2

3

4

5

6

7

8

9

FOR     user     IN     users  

    RETURN     {  

      user  :     user  ,  

      friends  :     (

        FOR     friend   IN     friends

          FILTER   friend  .  user     ==     user  .  _key

          RETURN     friend

      )

    }


















外连接(outer join)


SQL:

1

2

3

SELECT     *     FROM   users

    LEFT   JOIN   friends

      ON     (  friends  .  user     =     users  .  id  )  ;

AQL:
在AQL中没有直接支持外部连接,但是可以使用子查询实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

FOR     user   IN     users

    LET   friends     =     (

      FOR     friend   IN     friends

        FILTER   friend  .  user     ==     user  .  _key

        RETURN     friend

    )

    FOR     friendToJoin   IN     (

      LENGTH  (  friends  )     >     0     ?     friends     :

        [     {     /* no match exists */     }     ]

      )

      RETURN     {  

        user  :     user  ,

        friend  :     friend

      }


推荐阅读