zoukankan      html  css  js  c++  java
  • SQL常用函数总结

    SQL常用函数总结

    这是我在项目开发中使用db2数据库写存储过程的时候经常用到的sql函数。希望对大家有所帮助;

    sql cast函数

    (1).CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'12'转换为整型:

     SELECT CAST('12' AS int)

    (2).返回值是整型值12。如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢?

    SELECT CAST('12.5' AS int)  

    (3).CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于12.5不能用int数据类型来表示,所以对这个函数调用将产生一个错误:

    Server: Msg 245, Level 16, State 1, Line 1

    Syntax error converting the varchar value

    '12.5' to a column of data type int.

    (4).要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9 与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。

    SELECT CAST('12.5' AS decimal(9,2))

    decimal数据类型在结果网格中将显示有效小数位: 12.50

    (5).精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的小数部分,而不会产生错误。

    SELECT CAST('12.5' AS decimal)

        结果是一个整数值:12

    还有一个情况我们必须用到cast函数转换数据,那就是当我们在同一个select语句中对sum()的值计算比时,必须用cast转换。如下:

    select sum(a),sum(b),case when sum(b) = 0 then 0 else (cast sum(a) as double)/sum(b) end from table

    sql case函数

    在上面的语句中,我们就用到了case函数来做判断,当sum(b) =0是不能做分母,我们就令这个字段的值为0,否则,计算出sum(a)和sum(b)的比;

     sql中COALESCE()函数的功能

    返回其参数中的第一个非空表达式。这个函数是对null进行判断,而不是‘’。

     sql trim()函数

    去掉两头空格
    sql语法中没有直接去除两头空格的函数,但有ltrim()去除左空格rtrim()去除右空格。
    合起来用就是sql的trim()函数,即select ltrim(rtrim(UsrName))

    sql NULLIF函数

    如果两个指定的表达式相等,则返回空值。
    语法NULLIF ( expression1 , expression2 )
    参数expression1,expression2
    常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合。
    返回类型返回类型与第一个 expression1 相同。
    输出结果:
    如果两个表达式不相等,NULLIF 返回第一个 expression1 的值。
    如果两个表达式相等,NULLIF 返回空值NULL。  
    SQLServer函数是一样的功能
    例子: PRINT NULLIF('222','') --返回222
    PRINT ISNULL(NULLIF('222','222'),'23') --返回23 证明返回的是null

    sql char函数

    char(current date,ISO)——转换成yyyy-mm-dd
    char(current date,USA)——转换成mm/dd/yyyy
    char(current date,EUR)——转换成dd.mm.yyyy

    sql Date函数

    DATE()函数是提取日期或日期/时间表达式的日期部分。
    MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
    DATE - 格式 YYYY-MM-DD
    DATETIME - 格式: YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
    YEAR - 格式 YYYY 或 YY

    SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
    DATE - 格式 YYYY-MM-DD
    DATETIME - 格式: YYYY-MM-DD HH:MM:SS
    SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式: 唯一的数字

     SQL 中ROLLUP 用法

    ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。
    下面是 CUBE 和 ROLLUP 之间的具体区别:
    CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
    ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
    ROLLUP 优点:
    (1)ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
    (2)ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。
    (3)有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

    下面对比一下GROUP BY 、CUBE 和 ROLLUP后的结果
    创建表:

    CREATE TABLE DEPART 
    (部门 char(10),员工 char(6),工资 int)
    INSERT INTO DEPART SELECT 'A','ZHANG',100 
    INSERT INTO DEPART SELECT 'A','LI',200 
    INSERT INTO DEPART SELECT 'A','WANG',300 
    INSERT INTO DEPART SELECT 'A','ZHAO',400 
    INSERT INTO DEPART SELECT 'A','DUAN',500 
    INSERT INTO DEPART SELECT 'B','DUAN',600 
    INSERT INTO DEPART SELECT 'B','DUAN',700

    部门 员工 工资
    A ZHANG 100
    A LI 200
    A WANG 300
    A ZHAO 400
    A DUAN 500
    B DUAN 600
    B DUAN 700

    (1)GROUP BY

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工

    结果:
    A DUAN 500
    B DUAN 1300
    A LI 200
    A WANG 300
    A ZHANG 100
    A ZHAO 400
    (2)ROLLUP

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工 WITH ROLLUP

    结果如下:

    A DUAN 500 
    A LI 200 
    A WANG 300 
    A ZHANG 100 
    A ZHAO 400 
    A NULL 1500 
    B DUAN 1300 
    B NULL 1300 
    NULL NULL 2800

    ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。
    等价于下列SQL语句

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工 
    union 
    SELECT 部门,'NULL',SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门 
    union 
    SELECT 'NULL','NULL',SUM(工资)AS TOTAL 
    FROM DEPART

    结果:
    A DUAN 500
    A LI 200
    A NULL 1500
    A WANG 300
    A ZHANG 100
    A ZHAO 400
    B DUAN 1300
    B NULL 1300
    NULL NULL 2800
    (3)CUBE

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工 WITH CUBE

    结果:
    A DUAN 500
    A LI 200
    A WANG 300
    A ZHANG 100
    A ZHAO 400
    A NULL 1500
    B DUAN 1300
    B NULL 1300
    NULL NULL 2800
    NULL DUAN 1800
    NULL LI 200
    NULL WANG 300
    NULL ZHANG 100
    NULL ZHAO 400
    CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工 WITH CUBE

    等价于下列的SQL语句:

    SELECT 部门,员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 部门,员工 WITH ROLLUP
    union
    SELECT 'NULL',员工,SUM(工资)AS TOTAL 
    FROM DEPART 
    GROUP BY 员工

    结果:
    NULL NULL 2800
    A NULL 1500
    A DUAN 500
    A LI 200
    A WANG 300
    A ZHANG 100
    A ZHAO 400
    B NULL 1300
    B DUAN 1300
    NULL DUAN 1800
    NULL LI 200
    NULL WANG 300
    NULL ZHANG 100
    NULL ZHAO 400

    sql UNION 操作符

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
    请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
    SQL UNION 语法

    SELECT column_name(s) FROM table_name1
    UNION
    SELECT column_name(s) FROM table_name2

    注释:默认地,UNION 操作符选取不同的值,即UNION是去了重的。如果允许重复的值,请使用 UNION ALL。
    SQL UNION ALL 语法

    SELECT column_name(s) FROM table_name1
    UNION ALL
    SELECT column_name(s) FROM table_name2

    另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

    sql Merge函数

    通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表

    语法如下

    MERGE INTO [your table-name] [rename your table here] 
    USING ( [write your query here] )[rename your query-sql and using just like a table] 
    ON ([conditional expression here] AND [...]...) 
    WHEN MATHED THEN [here you can execute some update sql or something else ] 
    WHEN NOT MATHED THEN [execute something else here ! ] 

    我们先看看一个简单的例子,来介绍一个merge into的用法

    merge into products p using newproducts np on (p.product_id = np.product_id) 
    when matched then 
    update set p.product_name = np.product_name 
    when not matched then 
    insert values(np.product_id, np.product_name, np.category) 

    在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到product的product_name里。如果没有匹配上则insert这样的一条语句进去。 大家看看这个merget inot的用法是不是一目了然了呀。这里merger的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。

    sql substr函数

    substr(字符串,截取开始位置,截取长度) //返回截取的字

    substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串

    substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符

    substr('Hello World',2,4) //返回结果为 'ello'

    substr('Hello World',-3,3)//返回结果为 'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符

    测试:

    select substr('Hello World',-3,3) value from dual;

    附:java中substring(index1,index2)的简单用法

    作用:从字符串索引(下标)为index1的字符开始截取长度为index2-index1 的字符串。

    String str="Hello World";

    System.out.println(str.substring(0,5));

    打印结果为:Hello

    sql REPLACE函数

    REPLACE
    用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

    语法
    REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )

    参数
    ''string_replace1''

    待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。

    ''string_replace2''

    待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。

    ''string_replace3''

    替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。

    返回类型
    如果 string_replace(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果 string_replace(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。

    示例
    下例用 xxx 替换 abcdefghi 中的字符串 cde。

    SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')GO
    下面是结果集:

    ------------abxxxfghixxx(1 row(s) affected)

    sql PARTITION BY 函数

    SQL的partition by 字段(可实现自动分配组号跟归组合并)

    先看例子:

    if object_id('TESTDB') is not null drop table TESTDB
    
    create table TESTDB(A varchar(8), B varchar(8))
    
    insert into TESTDB
    
    select 'A1', 'B1' union all
    
    select 'A1', 'B2' union all
    
    select 'A1', 'B3' union all
    
    select 'A2', 'B4' union all
    
    select 'A2', 'B5' union all
    
    select 'A2', 'B6' union all
    
    select 'A3', 'B7' union all
    
    select 'A3', 'B3' union all
    
    select 'A3', 'B4'

    -- 所有的信息

    SELECT * FROM TESTDB

    A    B

    -------

    A1  B1

    A1  B2

    A1  B3

    A2  B4

    A2  B5

    A2  B6

    A3  B7

    A3  B3

    A3  B4

    -- 使用PARTITION BY 函数后

    SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM FROM TESTDB

    A   B   NUM

    -------------

    A1  B1  1

    A1  B2  2

    A1  B3  3

    A2  B4  1

    A2  B5  2

    A2  B6  3

    A3  B7  1

    A3  B3  2

    A3  B4  3


    可以看到结果中多出一列NUM 这个NUM就是说明了相同行的个数,比如A1有3个,他就给每个A1标上是第几个。

    -- 仅仅使用ROW_NUMBER() OVER的结果

    SELECT *,ROW_NUMBER() OVER(ORDER BY A DESC)NUM FROM TESTDB

     A   B     NUM

    ------------------------


    A3  B7   1

    A3  B3   2

    A3  B4   3

    A2  B4   4

    A2  B5   5

    A2  B6   6

    A1  B1   7

    A1  B2   8

    A1  B3   9

    可以看到它只是单纯标出了行号。

    sql 循环函数

     sql 的循环函数是极大影响数据库查询速度的,我们在查询的时,尽量避免使用;

    1. sql for 循环

    案例:

    begin atomic 
    declare v_id int;
    declare v_name varchar(30);
    for v_c as select id,name from J1
    do 
    set v_name=v_c.id||v_c.name;
    insert into j1 values(v_c.id+10,v_name);
    end for;
    end
    
    for v_a as select id from SESSION.ids
    
         do
    
         insert into L_REQUIRE_PRINT_MAIN_tj(PRINT_ID, REQUIRE_ID, CARTEAM_CODE, ARRIVE_DATE, TEMPLATE_INFO, SAVE_PERSONID, SAVE_TIME)
    
                                 values(v_printid, v_a.id, p_carteamcode, p_arrive_date, p_info, p_personid, current timestamp);
    
         
    
         end for;

    2.sql while 循环

     案例:

    begin atomic 
     declare v_cnt int;
     set v_cnt=100;
     while (v_cnt<1000) do 
     insert into j1 values (v_cnt+1000,'nixiaozi');
     set v_cnt=v_cnt+1;
     end while;
     end

    3.sql repeat 循环

     案例:

     create procedure p10
     language sql
     modifies sql data
     BEGIN atomic
       DECLARE v_id INTEGER ;
       DECLARE v_name varchar(20);
    
       set v_id=1;
      set v_name='n';
       REPEAT
          SET v_id = v_id + 2;                 
          SET v_name = cast(v_id as varchar(3))||v_name;
       insert into j6 values(v_id,v_name);
       UNTIL (v_id > 100)
       END REPEAT;
    END 
  • 相关阅读:
    201671010146 2017-2 <表格监督>
    201671010146 2017-2 《Java学期末有感》
    201671010146 2017-2 《Java线程》
    201671010146 2017-2 《第十六周学习Java有感》
    201671010146 2017―2 《第16周学习java有感》
    201671010146 2017―2 《第十五周学习java有感》
    201671010146 2017-2 《java第十一章学习感悟》
    201671010146 2017-2 《第十章学习感悟》
    201671010146 2017―2 《第11周学习java有感》
    201671010146 2017-2 《java第八章学习感悟》
  • 原文地址:https://www.cnblogs.com/sdgf/p/4732864.html
Copyright © 2011-2022 走看看