zoukankan      html  css  js  c++  java
  • sql中的一些函数(长期更新。。)

    前言

    在最近看别人的sql的时候,看到一些函数,比如left(),right()等等,好奇是什么意思,查询之后觉得还是挺有用的,特此记录下来。博客会在遇到新的函数的时候定期更新。

    正文

    1. left()和right()

    在一个sql中遇见了left(character,integer)函数,觉得好奇,百度了之后发现意义是:返回left(character,integer)中character从左起第一个到第integer个字符。如果integer是负的,那么返回空的字符串。

    right()同理。

    举个例子:left("abcdefg",3)得到的结果是:abc,因为要拿abcdefg的前三个字符,也就是abc。

    需要注意的是:oracle中是没有这两个函数的,oracle中对应的是substr(字符串,截取开始位置,截取结束位置)。

    2. ISNULL(A,B)

    关于ISNULL(A,B),其意义是:如果A为null的时候,则返回B的值,如果不为null,则返回A的值。常见应用为聚合求和的时候。

    举个例子:

    ISNULL(SUM(num),0):如果对num列求和结果为null(也就是数据库这列数据都没有值),那么就返回0。

    3. NOW()函数:<<Mysql可用>>
    NOW()函数,可以用来获取当前时间的函数。目前测试了mysql和sqlserver,只可以在mysql中使用。

    --Mysql数据库

    SqlServer数据库,无法识别的内置函数

    4. day(),month(),year()时间函数
    • day()函数:获取查询结果的日期值
    • month()函数:获取查询结果的月份值
    • year()函数:获取查询结果的年份值

    正常的年份的查询,8位的数据格式。

    6位的时间格式,如果年份的后两位<= 12,那么系统会默认将后两位作为月份和日期来处理,前两位默认为20+“日期的前两位”,所以得到的是2020年12月01日的时间,需要特别注意!

    如果你的年份后两位>12,那么会直接报错!因为不能转换成大于12月的数据。所以一般还是建议时间格式位8位!

    所以:如果时间格式确定都是6位,那么建议使用的是left()函数,而非year()函数。

    5. dateAdd()和date_add()函数

    sqlServer中,几天后的时间使用的是dateAdd()函数,DATE_ADD() 函数向日期添加指定的时间间隔。

    DATE_ADD(date,INTERVAL expr type)
    date 参数是合法的日期表达式。
    expr 参数是您希望添加的时间间隔。
    type 参数可以是下列值:见w3cschool链接

    在mysql中,使用的则是:date_add()函数,DATEADD() 函数在日期中添加或减去指定的时间间隔。

    DATEADD(datepart,number,date):
    date 参数是合法的日期表达式。
    number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
    datepart 参数可以是下列的值:见w3cschool链接

    用法如下:

    sqlServer中的方法

    mysql中的方法

    特别注意的是:更过的date的时间函数,请参考w3cschool:W3Cschool数据库时间函数链接,其中有mysql和sqlServer的时间函数。

    6. UNION和UNION ALL

    在写sql的时候,有些数据的存储可能涉及到分库分表,查询的时候,可能需要查询所有的分表,这个时候,就需要用到UNION或者UNION AL。

    union操作符:用于合并两个或多个SELECT语句的结果集,这里需要注意的是:UNION内部的SELECT语句必须拥有相同数量的

    列,列也必须拥有相似的数据类型,同时,每条SELECT语句中列的顺序必须相同。

    SELECT name FROM user UNION  SELECT name FROM user1 //得到的结果就是:分别从user表和user1表中查询name字段,然后合并到一起。

    需要特别注意的是:union操作符合并的结果集,不允许重复,如果不要去重的话,需要使用union all。

    案例sql:(参考:https://blog.csdn.net/zouxucong/article/details/73468979)使用foreach循环,并用union all连接,简化操作,查询多表并将结果集进行合并。分库分表必会技能!

    <select id="getFourteenHotPost" parameterType="map" resultMap="productCommentsInfoAndroid">  
            select t.comments_id,t.product_id,t.comment,t.order_path from (  
            <foreach collection="tableNames" item="item" separator="UNION ALL">  
                (SELECT c.comments_id,c.product_id,c.comment,i.order_path,c.p_index,c.t_index,c.title,c.time   
                FROM ${item} as c left join `gshop_comments_img` as i on c.comments_id = i.comments_id    
                where c.object_type=2 and c.display=1 and c.is_show=1   
                and c.t_index=1   
                GROUP BY c.product_id ORDER BY c.p_index asc,c.t_index desc,c.title desc,c.time desc limit 14)    
            </foreach>) t  
            GROUP BY t.product_id ORDER BY t.p_index asc,t.t_index desc,t.title desc,t.time desc limit 14  
        </select>  

    后记

    这里仅仅记录了目前遇见的一些函数,如果以后遇到了还会继续更新。

  • 相关阅读:
    《STL源码剖析》-- 序列式容器
    IPV6 组播学习理解
    C 语言指针 引用学习
    C++ list 源码学习
    汇编基础学习---浮点运算
    C++ 运算符重载
    C++ 迭代器学习
    Play框架连接Mysql遇到的一些问题
    Jython中文乱码问题
    多线程之生产者消费者模式
  • 原文地址:https://www.cnblogs.com/chenmc/p/9240078.html
Copyright © 2011-2022 走看看