MySQL常用函数及语法

【Hive】group by 分组聚合后使用窗口函数 1. group by 分组聚合后使用排序窗口函数 1.1 两种思路 与 简单例子 1.2 新思路的解释 2. group by 分组聚合后使用聚合窗口函数 3. group by 分组聚合后使用分析窗口函数 阅读详情

一、非常用聚合函数

名称描述
GROUP_CONCAT()返回一个连接的字符串
JSON_ARRAYAGG()将结果集作为json数组返回
JSON_OBJECTAGG()将结果集作为json对象返回

注意:聚合函数会忽略null值,以avg函数为例:

test1是成绩表,其中有两行的成绩为null

select * from test1;

在这里插入图片描述
使用avg获取成绩的平均值,结果为(80+80+80+80)/4 = 80,说明null值被忽略了

select avg(score) from test1;

在这里插入图片描述

1、GROUP BY WITH ROLLUP

  • GROUP BY子句允许跟一个WITH ROLLUP修饰符,这会输出更高级别汇总操作的额外行。 因此,可以通过单个查询回答多个分析级别的问题。例如, ROLLUP可用于为 OLAP(在线分析处理)操作提供支持
SELECT A,B,C FROM table GROUP BY A,B,C;

等同于

SELECT A,B,C FROM table GROUP BY A,B,C
UNION
SELECT A,B,NULL FROM table GROUP BY A,B
UNION
SELECT A,NULL,NULL FROM table GROUP BY A
UNION
SELECT NULL,NULL,NULL FROM table;
  • 示例
SELECT
	c_id,
	s_id,
	sum( s_score ) 
FROM
	score 
GROUP BY
	c_id,
	s_id WITH ROLLUP;

在这里插入图片描述

  • 所以说,按照多个条件分组后,每个子分组都会进行一次超级汇总

2、GROUP_CONCAT()

  • 此函数返回一个字符串,其由分组内的非空结果值拼接而成。如果没有非空值,则返回NULL。完整的语法如下:
-- DISTINCT、ORDER BY、SEPARATOR子句可以省略
GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])
  • 示例
SELECT student_name,
         GROUP_CONCAT(DISTINCT test_score
                      ORDER BY test_score DESC SEPARATOR ' ')
       FROM student
       GROUP BY student_name;

要消除重复值,请使用 DISTINCT 子句。要对结果中的值进行排序,请使用 ORDER BY 子句。组中值之间的默认分隔符是逗号 ( ,)。要显式指定分隔符,请使用SEPARATOR后跟应插入组值之间的字符串文字值。要完全消除分隔符,请指定 SEPARATOR ''

二、窗口函数

1、在GROUP BY中使用开窗函数

有student(学生信息)表,score(学生成绩)表,现需要查询学生平均成绩及其名次

SELECT
	s_id,
	s_name,
	round( avg( s_score ), 2 ) AS avg_score,
	row_number ( ) over ( ORDER BY avg( s_score ) DESC ) AS '名次' 
FROM
	score s
	LEFT JOIN student USING ( s_id ) 
GROUP BY
	s_id;

在这里插入图片描述

  • 分析:窗口函数与group by一起使用并不冲突。窗口函数是基于整个group by后的查询结果(而不是基于每组组内的查询结果)
  • 也就是说,group by先执行,开窗函数后执行,开窗函数将group by后的结果当做一个分组,窗口数就是group by后的分组数

2、语法

要使用窗口函数,需要在窗口函数之后,调用OVER子句,OVER子句两种形式:

-- over子句
over_clause:
    {OVER (window_spec) | OVER window_name}
-- over子句括号中的内容    
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子句中定义,还是由查询中其他地方定义的命名窗口的引用提供:

  • 在第一种情况下,窗口规范直接出现在OVER子句中的括号之间。

  • 在第二种情况下,是由查询中其他地方的子句window_name 定义的窗口规范的名称

3、常用窗口函数

名称说明
CUME_DIST()累计分配值
DENSE_RANK()当前行在其分区内的排名,没有间隙
FIRST_VALUE()窗口框架第一行的参数值
LAG()来自分区内滞后当前行的行的参数值
LAST_VALUE()窗口框架最后一行的参数值
LEAD()分区内行前导当前行的参数值
NTH_VALUE()来自第 N 行窗口框架的参数值
NTILE()其分区内当前行的桶数
PERCENT_RANK()百分比排名值
RANK()当前行在其分区内的排名,有间隙
ROW_NUMBER()其分区内的当前行数

(1) CUME_DIST()

返回一个值在一组值中的累积分布;即分区值小于或等于当前行值的百分比。这表示在窗口分区的窗口排序中在当前行之前或与当前行对等的行数除以窗口分区中的总行数。返回值范围从 0 到 1。

此函数应用于ORDER BY将分区行排序为所需的顺序。如果没有ORDER BY,所有行都是对等的并且具有值 N/ N= 1,其中N是分区大小。

以下查询显示,将numbers表中的所有数据分为一组,对每组中的每行数据使用CUME_DIST()窗口函数:

mysql> SELECT
         val,
         ROW_NUMBER()   OVER w AS 'row_number',
         CUME_DIST()    OVER w AS 'cume_dist',
         PERCENT_RANK() OVER w AS 'percent_rank'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+--------------------+--------------+
| val  | row_number | cume_dist          | percent_rank |
+------+------------+--------------------+--------------+
|    1 |          1 | 0.2222222222222222 |            0 |
|    1 |          2 | 0.2222222222222222 |            0 |
|    2 |          3 | 0.3333333333333333 |         0.25 |
|    3 |          4 | 0.6666666666666666 |        0.375 |
|    3 |          5 | 0.6666666666666666 |        0.375 |
|    3 |          6 | 0.6666666666666666 |        0.375 |
|    4 |          7 | 0.8888888888888888 |         0.75 |
|    4 |          8 | 0.8888888888888888 |         0.75 |
|    5 |          9 |                  1 |            1 |
+------+------------+--------------------+--------------+

(2) DENSE_RANK()

返回当前行在其分区中的排名,没有间隙。

此函数应用于ORDER BY将分区行排序为所需的顺序。没有ORDER BY,所有行都是对等的。

mysql> SELECT
         val,
         ROW_NUMBER() OVER w AS 'row_number',
         RANK()       OVER w AS 'rank',
         DENSE_RANK() OVER w AS 'dense_rank'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+------+------------+
| val  | row_number | rank | dense_rank |
+------+------------+------+------------+
|    1 |          1 |    1 |          1 |
|    1 |          2 |    1 |          1 |
|    2 |          3 |    3 |          2 |
|    3 |          4 |    4 |          3 |
|    3 |          5 |    4 |          3 |
|    3 |          6 |    4 |          3 |
|    4 |          7 |    7 |          4 |
|    4 |          8 |    7 |          4 |
|    5 |          9 |    9 |          5 |
+------+------------+------+------------+

(3) FIRST_VALUE(expr) [null_treatment]

返回当前分组中第一行的expr值

FIRST_VALUE返回第一行的值,LAST_VALUE返回最后一行的值,NTH_VALUE返回第N行的值

mysql> SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+

(4) LAG(expr [, N[, default]]) [null_treatment]

返回当前分组内滞后当前行N行的expr值,如果没有这样的行,则返回default的值。如果N或default缺失,默认值分别为 1 和NULL

LAG()(和类似的 LEAD()函数)通常用于计算行之间的差异。以下查询显示了一组按时间排序的观察结果,以及相邻行的LAG()和 LEAD()值,以及当前行和相邻行之间的差异:

mysql> SELECT
         t, val,
         LAG(val)        OVER w AS 'lag',
         LEAD(val)       OVER w AS 'lead',
         val - LAG(val)  OVER w AS 'lag diff',
         val - LEAD(val) OVER w AS 'lead diff'
       FROM series
       WINDOW w AS (ORDER BY t);
+----------+------+------+------+----------+-----------+
| t        | val  | lag  | lead | lag diff | lead diff |
+----------+------+------+------+----------+-----------+
| 12:00:00 |  100 | NULL |  125 |     NULL |       -25 |
| 13:00:00 |  125 |  100 |  132 |       25 |        -7 |
| 14:00:00 |  132 |  125 |  145 |        7 |       -13 |
| 15:00:00 |  145 |  132 |  140 |       13 |         5 |
| 16:00:00 |  140 |  145 |  150 |       -5 |       -10 |
| 17:00:00 |  150 |  140 |  200 |       10 |       -50 |
| 18:00:00 |  200 |  150 | NULL |       50 |      NULL |
+----------+------+------+------+----------+-----------+

(5) LAST_VALUE(expr) [null_treatment]

返回当前分组中最后一行的expr值

mysql> SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+

(6) LEAD(expr [, N[, default]]) [null_treatment]

返回当前分组内领先于当前行的N行的expr值。如果没有这样的行,则返回值为 default。如果 N或 default缺失,默认值分别为 1 和NULL。

mysql> SELECT
         t, val,
         LAG(val)        OVER w AS 'lag',
         LEAD(val)       OVER w AS 'lead',
         val - LAG(val)  OVER w AS 'lag diff',
         val - LEAD(val) OVER w AS 'lead diff'
       FROM series
       WINDOW w AS (ORDER BY t);
+----------+------+------+------+----------+-----------+
| t        | val  | lag  | lead | lag diff | lead diff |
+----------+------+------+------+----------+-----------+
| 12:00:00 |  100 | NULL |  125 |     NULL |       -25 |
| 13:00:00 |  125 |  100 |  132 |       25 |        -7 |
| 14:00:00 |  132 |  125 |  145 |        7 |       -13 |
| 15:00:00 |  145 |  132 |  140 |       13 |         5 |
| 16:00:00 |  140 |  145 |  150 |       -5 |       -10 |
| 17:00:00 |  150 |  140 |  200 |       10 |       -50 |
| 18:00:00 |  200 |  150 | NULL |       50 |      NULL |
+----------+------+------+------+----------+-----------+

(7) NTH_VALUE(expr, N) [from_first_last] [null_treatment]

mysql> SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+

返回当前分组中第N行的expr值。如果没有这样的行,则返回值为 NULL。

(8) NTILE(N)

**将分区划分为N组(桶),为分区中的每一行分配其桶号,并返回其分区内当前行的桶号**。例如,如果 N为 4, NTILE()则将行分成四个桶。如果N为 100, NTILE()则将行分成 100 个桶。

对于列中的一组值,以下查询显示了 val将行分成两组或四组所产生的百分位值。作为参考,查询还使用以下方式显示行号 ROW_NUMBER():

mysql> SELECT
         val,
         ROW_NUMBER() OVER w AS 'row_number',
         NTILE(2)     OVER w AS 'ntile2',
         NTILE(4)     OVER w AS 'ntile4'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+--------+--------+
| val  | row_number | ntile2 | ntile4 |
+------+------------+--------+--------+
|    1 |          1 |      1 |      1 |
|    1 |          2 |      1 |      1 |
|    2 |          3 |      1 |      1 |
|    3 |          4 |      1 |      2 |
|    3 |          5 |      1 |      2 |
|    3 |          6 |      2 |      3 |
|    4 |          7 |      2 |      3 |
|    4 |          8 |      2 |      4 |
|    5 |          9 |      2 |      4 |
+------+------------+--------+--------+

(9) PERCENT_RANK()

返回分区值小于当前行中的值的百分比,不包括最大值。返回值范围从 0 到 1,表示行相对排名,计算结果如下公式,其中rank是行排名, rows是分区行数:

(rank - 1) / (rows - 1)

此函数应用于ORDER BY将分区行排序为所需的顺序。没有ORDER BY,所有行都是对等的。

mysql> SELECT
         val,
         ROW_NUMBER()   OVER w AS 'row_number',
         CUME_DIST()    OVER w AS 'cume_dist',
         PERCENT_RANK() OVER w AS 'percent_rank'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+--------------------+--------------+
| val  | row_number | cume_dist          | percent_rank |
+------+------------+--------------------+--------------+
|    1 |          1 | 0.2222222222222222 |            0 |
|    1 |          2 | 0.2222222222222222 |            0 |
|    2 |          3 | 0.3333333333333333 |         0.25 |
|    3 |          4 | 0.6666666666666666 |        0.375 |
|    3 |          5 | 0.6666666666666666 |        0.375 |
|    3 |          6 | 0.6666666666666666 |        0.375 |
|    4 |          7 | 0.8888888888888888 |         0.75 |
|    4 |          8 | 0.8888888888888888 |         0.75 |
|    5 |          9 |                  1 |            1 |
+------+------------+--------------------+--------------+

(10) RANK()

返回当前行在其分区中的排名,有间隔。结果是不连续的排名数字。

此函数应用于ORDER BY将分区行排序为所需的顺序。没有ORDER BY,所有行都是对等的。

mysql> SELECT
         val,
         ROW_NUMBER() OVER w AS 'row_number',
         RANK()       OVER w AS 'rank',
         DENSE_RANK() OVER w AS 'dense_rank'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+------+------------+
| val  | row_number | rank | dense_rank |
+------+------------+------+------------+
|    1 |          1 |    1 |          1 |
|    1 |          2 |    1 |          1 |
|    2 |          3 |    3 |          2 |
|    3 |          4 |    4 |          3 |
|    3 |          5 |    4 |          3 |
|    3 |          6 |    4 |          3 |
|    4 |          7 |    7 |          4 |
|    4 |          8 |    7 |          4 |
|    5 |          9 |    9 |          5 |
+------+------------+------+------------+

(11) ROW_NUMBER() over_clause

返回其分区中当前行的编号。行数范围从 1 到分区行数。

ORDER BY影响行编号的顺序。没有ORDER BY,行编号是不确定的。

mysql> SELECT
         val,
         ROW_NUMBER()   OVER w AS 'row_number',
         CUME_DIST()    OVER w AS 'cume_dist',
         PERCENT_RANK() OVER w AS 'percent_rank'
       FROM numbers
       WINDOW w AS (ORDER BY val);
+------+------------+--------------------+--------------+
| val  | row_number | cume_dist          | percent_rank |
+------+------------+--------------------+--------------+
|    1 |          1 | 0.2222222222222222 |            0 |
|    1 |          2 | 0.2222222222222222 |            0 |
|    2 |          3 | 0.3333333333333333 |         0.25 |
|    3 |          4 | 0.6666666666666666 |        0.375 |
|    3 |          5 | 0.6666666666666666 |        0.375 |
|    3 |          6 | 0.6666666666666666 |        0.375 |
|    4 |          7 | 0.8888888888888888 |         0.75 |
|    4 |          8 | 0.8888888888888888 |         0.75 |
|    5 |          9 |                  1 |            1 |
+------+------------+--------------------+--------------+

4、窗口函数框架

  • 与窗口函数一起使用窗口可以包含一个框架子句。框架是当前分组的子集,框架子句说明了如何定义分组的子集

(1) 框架子句语法

-- 框架子句
frame_clause:
    frame_units frame_extent
-- frame_units指定了当前行和框架行关系的种类
frame_units:
    {ROWS | RANGE}
  • ROWS:框架是由起始行和终止行的位置定义
  • RANGE:框架是由起始行、终止行的值区间定义

frame_extent指定了框架的起始行和终止行。可以只指定起始行(此时,默认结束行为当前行);或者使用BETWEEN指定起始行和终止行

-- frame_extent指定了框架行的起点和终点
frame_extent:
    {frame_start | frame_between}
-- frame_between指定了框架行的范围
frame_between:
    BETWEEN frame_start AND frame_end
-- 框架起始行、框架终止行
frame_start, frame_end: {
    CURRENT ROW
  | UNBOUNDED PRECEDING
  | UNBOUNDED FOLLOWING
  | expr PRECEDING
  | expr FOLLOWING
}

使用BETWEEN语法,frame_start不得晚于frame_end

frame_start和frame_end值具有以下含义:

  • CURRENT ROW:对于ROWS,框架行是当前行;对于RANGE框架行是和当前行的值相等的行
  • UNBOUNDED PRECEDING:对于ROWS,框架行是分组第一行到当前行;对于RANGE,框架行是数值介于分组第一行、当前行的行
  • UNBOUNDED FOLLOWING:对于ROWS,框架行是分组最后一行到当前行;对于RANGE,框架行是数值介于分组最后一行、当前行的行
  • expr PRECEDING:对于ROWS,框架行是当前行之前的expr行到当前行;对于RANGE,框架行是数值介于当前行之前的expr行到当前行的行
  • expr FOLLOWING:对于ROWS,框架行是当前行之后的expr行到当前行;对于RANGE,框架行是数值介于当前行之后的expr行到当前行的行

以下查询演示 FIRST_VALUE(), LAST_VALUE()和NTH_VALUE()。
分别获取分组内第一行到当前行的第一个值、最后一个值、第二个值、第四个值

(2) 框架子句用法

mysql> SELECT
         time, subject, val,
         FIRST_VALUE(val)  OVER w AS 'first',
         LAST_VALUE(val)   OVER w AS 'last',
         NTH_VALUE(val, 2) OVER w AS 'second',
         NTH_VALUE(val, 4) OVER w AS 'fourth'
       FROM observations
       WINDOW w AS (PARTITION BY subject ORDER BY time
                    ROWS UNBOUNDED PRECEDING);
+----------+---------+------+-------+------+--------+--------+
| time     | subject | val  | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113   |   10 |    10 |   10 |   NULL |   NULL |
| 07:15:00 | st113   |    9 |    10 |    9 |      9 |   NULL |
| 07:30:00 | st113   |   25 |    10 |   25 |      9 |   NULL |
| 07:45:00 | st113   |   20 |    10 |   20 |      9 |     20 |
| 07:00:00 | xh458   |    0 |     0 |    0 |   NULL |   NULL |
| 07:15:00 | xh458   |   10 |     0 |   10 |     10 |   NULL |
| 07:30:00 | xh458   |    5 |     0 |    5 |     10 |   NULL |
| 07:45:00 | xh458   |   30 |     0 |   30 |     10 |     30 |
| 08:00:00 | xh458   |   25 |     0 |   25 |     10 |     30 |
+----------+---------+------+-------+------+--------+--------+

以下查询演示了SUM()和AVG()获取框架行内的总分和平均分

mysql> SELECT
         time, subject, val,
         -- 分组内第一行到当前行的总分
         SUM(val) OVER (PARTITION BY subject ORDER BY time
                        ROWS UNBOUNDED PRECEDING)
           AS running_total,
         -- 分组内当前行的上一行到下一行的平均分
         AVG(val) OVER (PARTITION BY subject ORDER BY time
                        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
           AS running_average
       FROM observations;
+----------+---------+------+---------------+-----------------+
| time     | subject | val  | running_total | running_average |
+----------+---------+------+---------------+-----------------+
| 07:00:00 | st113   |   10 |            10 |          9.5000 |
| 07:15:00 | st113   |    9 |            19 |         14.6667 |
| 07:30:00 | st113   |   25 |            44 |         18.0000 |
| 07:45:00 | st113   |   20 |            64 |         22.5000 |
| 07:00:00 | xh458   |    0 |             0 |          5.0000 |
| 07:15:00 | xh458   |   10 |            10 |          5.0000 |
| 07:30:00 | xh458   |    5 |            15 |         15.0000 |
| 07:45:00 | xh458   |   30 |            45 |         20.0000 |
| 08:00:00 | xh458   |   25 |            70 |         27.5000 |
+----------+---------+------+---------------+-----------------+

(3) 默认框架子句

在没有显示指定框架子句的情况下,默认的框架取决于是否存在ORDER BY子句

  • 有ORDER BY子句:框架行为数值介于当前分组第一行到当前行的值
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
  • 没有ORDER BY子句:框架行为分组内所有行
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

(4) 可以使用框架子句的窗口函数

聚合函数可以使用框架子句

可以使用框架子句的窗口函数

  • FIRST_VALUE()
  • LAST_VALUE()
  • NTH_VALUE()

MySQL允许以下函数使用框架,但会忽略框架子句

  • CUME_DIST()
  • DENSE_RANK()
  • LAG()
  • LEAD()
  • NTILE()
  • PERCENT_RANK()
  • RANK()
  • ROW_NUMBER()

三、控制流函数

名称说明
CASE类似于Java中的switch-case
IF类似于三目运算符
IFNULL如果expr1为NULL,则返回expr2
NULIF如果expr1=expr2,则返回NULL

1、NULLIF

  • 语法
NULLIF(expr1,expr2)
  • 用法

如果expr1=expr2,则返回NULL,否则返回expr1

mysql> SELECT NULLIF(1,1);
        -> NULL
mysql> SELECT NULLIF(1,2);
        -> 1

四、字符串函数

1、substr、substring

substr和subtring用法一样,都是用来截取字符串:
第一个参数是要截取的字符串,第二个参数是开始截取的位置,第三个参数是截取的长度
第一个字符的下标从1开始

SUBSTR(str,pos), , , SUBSTR(str FROM pos)SUBSTR(str,pos,len)SUBSTR(str FROM pos FOR len)
mysql> SELECT SUBSTRING('Quadratically',5);
        -> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
        -> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
        -> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
        -> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
        -> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
        -> 'ki'

需要注意的是,当第二个参数为负数时,则总字符串右边开始截取

2、substring_index

SUBSTRING_INDEX(str,delim,count)

从【str】中获取分隔符【delim】出现次数在【count】之前的字符串
count为正数,从左边开始计数;count为负数,从右边开始计数

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'

五、其他用法

1、JOIN USING(COLUMN_NAME)

SELECT * FROM score LEFT JOIN course USING ( c_id );

在这里插入图片描述
使用join using(column_name)等同于join on a.c_id = b.c_id,但是前者会将c_id放在第一列,且对c_id去重

2、WITH AS

如果一整句查询中多个子查询都需要使用同一个子查询的结果,那么就可以用with as,将共用的子查询提取出来,加个别名。后面查询语句可以直接用,对于大量复杂的SQL语句起到了很好的优化作用。

  • 相当于一个临时表,要与select配合使用。
  • 可以有多个临时表,写一个with就可以,用逗号隔开
  • with子句要用括号括起来
WITH tmp1 AS ( SELECT * FROM student ),
tmp2 AS ( SELECT * FROM score )

SELECT
	* 
FROM
	tmp1
	JOIN tmp2 USING ( s_id );
基于STM32的多路火灾报警系统设计 本文设计了一款基于STM32的多路火灾报警系统,利用多个传感器组合(如烟雾传感器、温度传感器等)进行数据采集与处理,精确判断火灾情况,并及时发出报警信号,保障生命与财产安全。本系统设计了一款基于STM32的多路火灾报警系统,通过结合烟雾传感器和温度传感器,提升了火灾检测的准确性和可靠性。未来,系统可以进一步集成更多传感器,如气体传感器、湿度传感器等,进一步提升火灾报警系统的智能化水平。本系统采用STM32F103单片机作为核心处理单元,结合烟雾传感器、温度传感器和报警模块,实现多通道火灾报警功能。 阅读详情

相关推荐

不修改MMDetection源码使用自定义数据和模型

以目标检测为例,用非侵入式的模型和MMDetection数据的方法进行配置。也就是不改动MMDetection的任何源码或目录的条件下,使用自定义数据训练自定义模型。

Dlite的技术笔记 1341

三、MySQL基础语法(数据库函数详解看这一篇就够了!)

函数 是指一段可以直接被另一段程序调用的程序或代码。 MySQL是 MySQL 数据库提供的内部函数,这些内部函数可以帮助用户更加方便地处理表中的数据。函数就像预定的公式一样存放在数据库里,每个用户都可以调用已经存在的函数来完成某些功能。 同时MySQL数据库还支持用户自己建立函数,以适应实际的业务操作。正确使用函数会让读者在编写 SQL 语句时起到事半功倍的效果。

Z_CH8648的博客 1264

建议收藏:华为海思IC设计笔试题,含解析(附下载)

接触过的部门有麒麟芯片、CPU/GPU,总体面试感觉非常好,规范且认真,第一轮手撕代码状态机+复盘机考题+瞄准几个知识点深挖,时间1hour+;一二轮面试是连着的,所以很累。但是岗位就那么多,在面试的时候,很多同学因为准备不充分,与岗位失之交臂,无缘进入该公司。时序电路有记忆功能,不会产生锁存器,锁存器一般在组合逻辑中case写不全,else写不全,或者敏感列表写不全。

nuoweishizi的博客 3289

[MySql]常用函数全部汇总

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。例如,字符串连接函数可以很方便的将多个字符串连接在一起。在这一讲中将讲解的内容包括: 数学函数 字符串函数 日期和时间函数 条件判断函数 系统信息函数 加密函数 格式化函数 MySQL提供了众多功能强大、方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求。本文将MySQL.

中年油腻男人的转型之路 627

QT+QTimer+QThread实现线程内的定时任务并且和主线程进行交互

在制作qt软件时,我们经常会用到qtimer定时器以及将其在非主线程中进行使用,甚至有的时候还需要和主线程进行交互。我总结了两种用法,仅供参考。以上即为QTimer和QThread联合使用的学习记录。

u011826081的博客 5685

开关电源环路学习笔记(1)-为啥要知道传递函数?

做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V

weixin_42005993的博客 1万+

Mysql常见函数及其用法

这篇文章主要讲解mysql常见函数的用法和意义,包括字符串函数、数值函数、日期函数、流程函数。

m0_37742400的博客 766

Bash Shell 系统巡检脚本

部分安全相关检查需要root权限,建议通过sudo运行完整检查。

老韩的Linux云计算架构师进阶之路 96

MySQL sql语句总结

1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwi...

weixin_34109408的博客 1444

AI Agent智能体在Android开发中的应用

本文探讨了AIAgent(智能代理体)在Android开发中的应用,涵盖技术原理、实践案例与未来趋势。AIAgent通过机器学习、自然语言处理等技术实现代码生成、测试自动化及性能优化,显著提升开发效率。例如,强化学习模型可优化APP响应时间(公式:$\text{响应时间}=f(\text{负载},\text{资源})$),自动化测试覆盖率提升至95%。

郑伟强dev的专栏 124

OpenClaw人人养虾:接入即时通讯平台Zalo

通过 Zalo Official Account(OA,官方账号)API,可以将 OpenClaw 接入 Zalo,实现面向越南用户的自动化客服和互动。

王国平的博客 437

Mysql常用语法函数

日期条件

菜鸟先飞 296

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mysql语法及函数_MySQL常用语法命令及函数

#创建数据库# create database 数据库名;#查看数据库# show databases;#选择数据库# use 数据库名;#删除数据库# drop database 数据库名;#创建表# create table 表名(属性名1 数据类型 ,属性名2 数据类型。。。。);#查看表结构# desc 表名;#查看建表语言# show creat...

weixin_39880301的博客 139

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL常用函数、语法案例

通过多个 SQL 示例,展示了常用的聚合函数、字符串函数、日期函数、条件函数及 JSON 函数的用法。这些示例帮助读者理解如何在实际项目中灵活运用 MySQL 的功能,以便高效地管理和分析订单数据。

weixin_53132064的博客 423

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL的常用操作语法及常用函数

数据库 (DataBase,DB):就是数据的仓库,分为关系型数据库和非关系型数据库。 由于MySQL实际操作的是数据库中的表,所以得先创建数据库: 创建数据库:CREATE DATABASE [IF NOT EXISTS] 数据库名;展示数据库:SHOW DATABASES;使用数据库:USE 数据库名;删除数据库:DORP DATABASE [IF EXISTS] 数据库名; 对数据库操作分成以下四类: DDL(数据定义语言)定义和管理数据对象(CREATE、DROP、ALTER) 创建表(一

hef0810的博客 181

mysql常用语法函数

mysql常用操作

qq_28091033的博客 218

MSSQL转Mysql常用函数,语法等

MSSQL转Mysql常用 一、字段类型 MSSQL Mysql 备注 "nchar" "char()" 最大长度为255 "nvarchar" ...

weixin_30564785的博客 468

mysql—查询,常用函数,分组语法

一.插入删除 1.alter table student add age int;//增加一列年龄 alter table student modify sname varchar(30);//给学生的姓名增加长度 2.truncate table student;//跟delete一样的效果,但是用这个删除之后没有办法恢复 ,而delete删除之后是有机会恢复的 ...

woshijinfeixi的博客 546

mysql的substr函数常用语法

mysql的substr函数用法

程序大视界 916

mysql 数字函数_SQL 语法基础——MySQL常用数字函数详解

在前面若干章节中,我们介绍了SQL的基础与高阶语法,接下来,我们将分四个章节,介绍MySQL中常见的函数应用,大致分为如下几个章节:MySQL 字符串函数MySQL 数字函数MySQL 日期函数MySQL 高级函数本文将主要介绍MySQL 数字函数。演示数据我们通过创建 Student_Information表,并向该表中插入以下数据。建表SQL语句如下:插入SQL语句如下:表数据如下:ABS(x...

weixin_39915500的博客 147

Mysql常用语法命令以及函数

#创建数据库# create database 数据库名; #查看数据库# show databases; #选择数据库# use 数据库名; #删除数据库# drop database 数据库名; #创建表# create table 表名(属性名1 数据类型 ,属性名2 数据类型。。。。); #查看表结构# desc 表名; #查看建表语言# show...

li___kang的博客 365

MySQL常用语法命令及函数

#创建数据库#    create Database 数据库名; #查看数据库#     show databases; #选择数据库#      use 数据库名; #删除数据库#      drop database 数据库名; #创建表#  create table 表名(属性名1  数据类型 ,属性名2  数据类型。。。。); #查看表结构# desc 表名;

静远小和尚的博客 3545

MySQL:SQL语法和常用命令函数

MySQL基础1 语法1.1 MySQL的语法规范1.2 SQL的语言分类2 基础命令和常用函数2.1 MySQL的常用基础命令2.2 MySQL的常见函数 1 语法 1.1 MySQL的语法规范 (1)不区分大小写,建议关键字大写,表名,列名小写。 (2)每条命令最好用分号结尾。 (3)每条命令根据需要,可以进行缩进或者换行。 (4)注释说明: 单行注释: #注释文字 或者 --注释文字 多行注释: /* 注释文字 */ 1.2 SQL的语言分类 (1)DDL:(Data Define Languag

weixin_39321135的博客 337

【mysql】#语法#mysql的常用函数

常用函数 字符串 LENGTH(str) 返回字符串str所占的字节数,中文占3个 CHAR_LENGTH(str) 返回字符串str的字符数 BIT_LENGTH(str) 返回字符串str的比特长度 LEFT(str,x) 返回字符串str从左往右开始x个字符 RIGHT(str,x) 返回字符串str从右往左开始x个字符 ASCII(str) 返回字符串str的AS...

JoinIn, 227

《MySQL数据库》之"浅尝辄止"(四)SQL简介、语法格式和常用函数

一、SQL的简介 结构化查询语言(Structured Query Language),简称SQL。它是专门用来访问数据库的标准编程语言。它可以用于存储数据,查询数据,更新数据以及管理关系型数据库等操作。同时,数据库脚本文件的扩展名也是sql。 SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。同时,SQL语句可以嵌套,因此拥有极大的灵活性和强大的功能。但是,数据库厂商都对SQL标...

从明老师的博客 592
上一篇: MySQL行转列、列转行
下一篇: linux免密登录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值