跳转至

函数和操作符

Flow Control

IF(expr1, expr2, expr3):如果 expr1 为真(expr1 <> 0 and expr1 IS NOT NULL),则返回 expr2,否则返回 expr3

SELECT IF(1, 1, 0); -- 1

IFNULL(expr1, expr2):如果 expr1NULL,则返回 expr2,否则返回 expr1

JSON

检索 JSON

JSON_CONTAINS 检查 target 是否包含 candidate,如果是,返回 1,否则返回 0。如果有参数为 NULL,则返回 NULL

JSON_CONTAINS(target, candidate [, path])

SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '1', '$.a'); -- 1
SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '1', '$.b'); -- 0
SELECT JSON_CONTAINS('{"a": 1, "c": {"d": 4}}', '{"d": 4}', '$.c'); -- 1

JSON_EXTRACT 提取 targetpath 对应的部分。如果有参数为 NULL,或者 path 不存在,则返回 NULL

JSON_EXTRACT(target, path [, path ...])

SELECT JSON_EXTRACT('{"a": 1, "b": 2}', '$.a'); -- 1
SELECT JSON_EXTRACT('{"a": 1, "b": 2}', '$.b'); -- 2
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]'); -- [10, 20]

column->path 等价于 JSON_EXTRACT(column, path)

SELECT c, JSON_EXTRACT(c, '$.a') FROM example;
SELECT c, c->'$.a' FROM example;

column->>path 等价于 JSON_UNQUOTE(column->path),等价于 JSON_UNQUOTE(JSON_EXTRACT(column, path))

Aggregate

Window

Window 函数和聚合函数的区别在于,前者对每一个数据行都生成一个计算结果,而后者每个分组只有一个结果。

Window 函数使用 OVER 关键字对数据行分组,只用于 SELECT 列和 ORDER BY 列,在 WHEREGROUP BYHAVING 之后,在 ORDER BYLIMITSELECT DISTINCT 之前执行。

over_clause:
    {OVER (window_spec) | OVER window_name}

window_spec:
    [window_name] [partition_clause] [order_clause] [frame_clause]

partition_clause:
    PARTITION BY expr [, expr] ...

order_clause:
    ORDER BY expr [ASC|DESC] [, expr [ASC|DESC]] ...

如果 OVER() 不带参数,则使用默认的窗口,即整个数据集。

  • window_name:窗口名称,用于引用窗口;
  • partition_clausePARTITION BY 语句,作为分组条件,默认为整个数据集;
  • order_clauseORDER BY 语句,作为分组的排序条件,升序时 NULL 在前,倒序时 NULL 在后;

MySQL 支持以下 Window 函数:

名称 描述
RANK() 当前行在分组内的排名,从 1 开始,包含间隔
DENSE_RANK() 当前行在分组内的排名,从 1 开始,不包含间隔
ROW_NUMBER() 当前行在分组内的行号,从 1 开始

RANK()/DENSE_RANK()/ROW_NUMBER()

id score
1 20
2 30
3 20
4 10
# 排名,rank() 带间隔,dense_rank() 连续
SELECT id,
       score,
       row_number() over w AS 'row_number',
       rank()       over w AS 'rank',
       dense_rank() over w AS 'dense_rank'
FROM game window w AS ( ORDER BY score DESC );
id score row_number rank dense_rank
2 30 1 1 1
1 20 2 2 2
3 20 3 2 2
4 10 4 4 3

参考