美文网首页
SQL 语句中的函数

SQL 语句中的函数

作者: 山药鱼儿 | 来源:发表于2022-03-13 20:26 被阅读0次

    与很多编程语言一样,SQL 也支持函数,为数据的转换和处理提供了方法,比如前面我们用到的 RTRIM 函数去掉文本右侧可能存在的空白字符。

    注:对于不同的 DBMS 各个函数的名称和用法可能及其不同,只有很少的函数被所有主要的 DBMS 支持。本篇文章使用的演示 DBMS 为 SQLite,练习前请使用 SELECT 语句检测你的环境是否支持相关函数。

    今天,我们主要学习两类常用的函数:文本处理函数和日期、时间函数。

    文本处理函数

    前面我们提到的 RTRIM LTRIM TRIM 都是非常常见的文本处理函数。下面是小鱼总结的 SQL 常用文本处理函数。

    函数 说明
    LEFT() / RIGHT() 返回字符串左边 / 右边的字符。
    LENGTH() / DATALENGTH() / LEN() 返回字符串的长度。
    LOWER() / UPPER() 将字符串转换为小写 / 大写。
    LTRIM() / RTRIM() / TRIM() 去掉字符串左边 / 右边 / 两边的空格。
    SUBSTR() / SUBSTRING() 提取子字符串

    下面,小鱼先演示一下 UPPER 函数的使用。从供应商表中检索出供应商名称以及供应商名称的大写形式,并将大写的列命名为 vend_name_upcase

    SELECT
        vend_name,
        UPPER( vend_name ) AS vend_name_upcase 
    FROM
        Vendors 
    ORDER BY
        vend_name;
    

    检索结果:

    UPPER 函数将供应商的名称转换为了大写形式。

    下面,小鱼再来举个文本函数的例子。字符串截取函数 SUBSTR SUBSTRING ,使用 SELECT 语句来检测一下 SQLite 是否支持 SUBSTR 函数。

    SELECT
        SUBSTR( 'abcdef', 1, 2 ),
        SUBSTR( 'abcdef', 1, 3 ),
        SUBSTR( 'abcdef', 3 );
    

    上述 SQL 没有报错,并返回了如下的结果:

    第一个参数 abcdef 表示待截取的文本,第二个参数为从第几个字符开始截取,最后一个参数为截取多少位。最后一个参数省略时将截取之后的所有长度。

    然后,我们使用 SUBSTR 函数从 cust_contact 中取取前 2 个字符,从 cust_city 中提取 3 个字符,将他们转换为大写形式,并拼接在一起,以 user_login 别名返回。

    客户信息表如下:

    编写 SQL 检索出客户 ID 、客户名称以及登录名 user_login

    SELECT
        cust_id,
        cust_name,
        UPPER(
        SUBSTR( cust_contact, 1, 2 ) || SUBSTR( cust_city, 1, 3 )) AS user_login 
    FROM
        Customers;
    

    检索结果:

    日期、时间处理函数

    日期、时间类型作为特殊的类型存储在表中,每种 DBMS 都以各自的特殊形式进行存储,以便进行快速、有效的排序或过滤,并且占用更少的空间存储。

    我们需要借助日期、时间函数来读取、统计和处理这些日期、时间,因此日期、时间函数在 SQL 中有着非常重要的作用。不过,感到遗憾的是,不同的 DBMS 这些日期时间函数相差很大,可移植性最差。

    比如,可以使用如下语句检测一下你的数据库是否支持使用 CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP 来获取当前日期、时间、日期时间。

    SELECT 
        CURRENT_DATE,
        CURRENT_TIME,
        CURRENT_TIMESTAMP;
    

    下面是小鱼的 SQLite 数据库返回的结果:

    使用 STRFTIME 可以将表中的日期时间类型转换为指定格式的日期时间字符串。在不支持使用 YEAR DATEPARTEXTRACT 函数的 DBMS 中,还可以用 STRFTIME 提取年、月等日期时间的成分。

    SELECT 
        STRFTIME( '%Y/%m/%d %H:%M:%S', CURRENT_TIMESTAMP ),
        STRFTIME( '%Y', CURRENT_TIMESTAMP ),
        STRFTIME( '%m', CURRENT_TIMESTAMP );
    

    下面是小鱼的 SQLite 数据库返回的结果:

    函数 DATETIME DATE 可以将日期时间格式的字符串转换为表中的日期时间类型,以便进行过滤和运算。

    SELECT 
        DATETIME( '2022-03-13 05:44:19' ),
        DATE('2022-03-13');
    

    下面是小鱼的 SOLite 数据库 DATE DATETIME 返回结果。

    最后,我们来看几个案例,案例使用的表格为下面的订单表:

    首先,我们需要检索出 2020 年 2 月份的所有订单编号和订单日期:

    SELECT
      order_num,
      order_date 
    FROM
      Orders 
    WHERE
      STRFTIME( '%Y/%m', order_date ) = '2020/02';
    

    上述 SQL 语句中,将表中的日期类型 order_date 日期转换为 %Y/%m 格式的日期字符串,然后利用字符串的比较来筛选出 2020 年 02 月份的订单。检索结果如下:

    前面,小鱼说表中存储的日期时间类型可以很方便地进行排序和过滤。下面我们就先来看看过滤吧!使用 SQL 语句筛选出 2020 年 1 月 15 号至 2020 年 2 月 15 号的所有订单:

    SELECT
        order_num,
        order_date 
    FROM
        Orders 
    WHERE
        order_date BETWEEN DATE( '2020-01-15' ) 
        AND DATE( '2020-02-15' );
    

    使用 DATE() 函数可以将时间格式的字符串转换为表中的日期类型,日期类型同样可以用于比较操作符和 BETWEEN 等。检索结果如下:

    日期时间类型也可以用于排序的依据:

    SELECT
        order_num,
        order_date 
    FROM
        Orders 
    WHERE
        STRFTIME( '%Y%m', order_date ) = '202001' 
    ORDER BY
        order_date;
    

    按升序方式返回的 2020 年 1 月份订单:

    总结

    本节,我们主要学习了 SQL 中常用的文本处理函数以及时间、日期处理函数。这些函数在格式化、数据过滤等方面非常重要,但比较遗憾的是它们在不同的 DBMS 中实现很不一致,可移植性差。

    相关文章

      网友评论

          本文标题:SQL 语句中的函数

          本文链接:https://www.haomeiwen.com/subject/qdnarrtx.html