「MySQL」深入理解MySQL中常用的SQL函数

窗口函数参考文章

SQL窗口函数

1. COALESCE 函数

COALESCE 函数的作用是从一组值中返回第一个非空(NULL)的值。如果所有的值都是 NULL,那么 COALESCE 函数会返回 NULL。

举个例子,如果我们有一个表格包含了学生的姓名和昵称,但有些学生没有昵称,我们可以使用 COALESCE 函数来选择一个非空的名字作为显示的名称:

SELECT COALESCE(nickname, name) AS display_name
FROM students;

在这个例子中,如果 nickname 字段不为空,那么 display_name 将会使用昵称;如果 nickname 字段为空,那么 display_name 将会使用姓名。

2. USING 函数

在 SQL 中,可以使用 USING 关键字来指定连接操作的列。当使用 JOIN 操作连接两个表时,如果这两个表中的连接列具有相同的名称,可以使用 USING 关键字来简化连接条件的书写。
以下是使用 USING 关键字进行连接操作的示例:

SELECT *
FROM table1
JOIN table2 USING (common_column);

在上面的示例中,table1table2 是要连接的两个表,它们都具有一个名为 common_column 的列。使用 USING 关键字,可以省略连接条件的重复列名,系统会自动匹配这两个表中具有相同名称的列进行连接,不能指定多个列。

3. LEAD 函数

LEAD() 是一种窗口函数,用于获取当前行之后的行的值。它可以帮助你在查询中访问结果集中下一个行的数据,而无需实际改变结果集的顺序。

以下是 LEAD() 函数的基本语法:

LEAD(expression, offset, default) OVER (PARTITION BY partition_column ORDER BY order_column)
  • expression: 要获取的值的列或表达式。
  • offset: 指定要获取的后续行的偏移量(默认为 1,表示下一行)。
  • default: 可选参数,指定当没有后续行时要返回的默认值(如果不提供,则默认为 NULL)。
  • PARTITION BY partition_column: 可选子句,用于对结果集进行分区。
  • ORDER BY order_column: 指定确定行之间顺序的列。

通过使用 LEAD() 函数,你可以轻松地访问结果集中当前行之后的行的数据,从而执行各种分析和计算操作。在之前的示例中,我展示了如何在查询中使用 LEAD() 函数来获取用户的下一个刷题日期。

4. interval 函数

在SQL中,INTERVAL 5 MINUTE表示一个时间间隔,具体意思是“5分钟”。这个用法通常用于在SQL语句中对时间进行加减操作,比如计算时间差、增加时间等。

例如,在MySQL中,你可以使用INTERVAL关键字来对时间进行加减操作。下面是一个示例:

SELECT NOW() AS current_time,
       NOW() + INTERVAL 5 MINUTE AS after_5_minutes;

这个查询会返回当前时间以及加上5分钟后的时间。INTERVAL 5 MINUTE表示增加5分钟。

5. INSTR 函数

INSTR 函数是 SQL 中用来查找字符串中子串的函数。它的语法如下:

INSTR(string, substring)

其中,string 是要查找的字符串,substring 是要查找的子串。函数返回 substringstring 中第一次出现的位置,如果 substring 不在 string 中,则返回 0。

以下是一个示例:

SELECT INSTR('hello world', 'world');

这个查询会返回 7,因为子串 'world' 在字符串 'hello world' 中第一次出现的位置是 7。

在你的例子中,INSTR(comment,'是')+INSTR(comment,'试')+INSTR(comment,'报名') > 0 的含义是,如果 comment 字符串中包含子串 '是''试''报名' 中的任意一个,那么该表达式的值就为真(即大于0)。

6. substring_index 函数

SUBSTRING_INDEX 函数用于在字符串中查找并返回某个分隔符之前或之后的子串。该函数的语法如下:

SUBSTRING_INDEX(str, delim, count)
  • str 是要进行处理的字符串。
  • delim 是用作分隔符的字符或子串。
  • count 指定了要返回的子串在分隔符出现的次数。如果 count 为正数,函数将从左侧开始查找;如果 count 为负数,函数将从右侧开始查找。

例如,如果有字符串 'apple,banana,cherry',想要获取逗号后的第一个内容 'banana',可以使用以下 SQL 查询:

SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1) AS result;

这个查询将返回 'banana',因为它是逗号后的第一个内容。

7. LENGTH 函数和 CHAR_LENGTH 函数

在 SQL 中,LENGTH 函数和 CHAR_LENGTH 函数用于获取字符串的长度,但它们之间有一些区别。

  1. LENGTH 函数:

    • LENGTH 函数返回字符串中的字符数或字节数,取决于数据库的字符集编码。
    • 对于英文字符或单字节字符集,LENGTH 函数返回字符串中的字符数。
    • 对于多字节字符集(如 UTF-8),LENGTH 函数返回字符串中的字节数,而不是字符数。
  2. CHAR_LENGTH 函数:

    • CHAR_LENGTH 函数返回字符串中的字符数,不受字符集编码的影响。
    • 无论是单字节字符集还是多字节字符集,CHAR_LENGTH 函数都会返回字符串中的字符数。

例如,假设有一个包含中文字符的字符串 '你好,世界!',如果使用 LENGTHCHAR_LENGTH 函数来获取其长度,结果可能如下:

SELECT LENGTH('你好,世界!') AS length_result, 
       CHAR_LENGTH('你好,世界!') AS char_length_result;

在这个例子中,length_result 的值取决于数据库的字符集编码,而 char_length_result 的值将始终是 6,因为字符串中有 6 个字符。