zoukankan      html  css  js  c++  java
  • MySQL之SQL语句零碎总结

    一、MySQL中有个ifnull函数,跟Oracle的nvl类似,用法如下:

    select* from Ta t where ifnull(pro, 0) < 100;

    解释:当pro是null的时候返回0,否则返回pro本身;通过这个方法可以用来给参数定义默认值

    ,比如对于存储过程传来的参数如果是null则给它赋默认值-1:

    if(ifnull(param, -1) < 10) then

    ...

    elseif(...) then

    ...

    else

    ...

    end if;

    二、创建函数:

    在MySQL里函数和存储过程的内部语法其实很像,各自主要的特点是:

    ①存储过程可以通过call sp_xxx(..)单独调用,而函数则必须存在于其它SQL语句(比如select ifnull(..)、where ifnull(..)等)。

    ②存储过程可以调用存储过程,也可以直接调用函数(比如在if判断里),函数可以调用函数但是不能调用存储过程。

    ③存储过程的参数有三种类型in、out、inout,默认是in(没有指明任意一种类型的情况下)

    ,注意out类型的参数无论外部传来的参数是什么都会变为null,如果存储过程不对这个参数做任何操作则最终将输出null,而inout则类似C#的ref关键字。

    ④函数的参数不能带in、out、inout

    ⑤存储过程的方法签名里没有返回类型,后面直接接begin。。end块;而函数的方法签名最后面有returns 返回类型(如bigint)然后接begin。。end块。

    ⑥存储过程虽然方法签名里没有返回类型,但是它会返回内部select的集合,有多少个select语句就会返回多少个结果集,在C#里可以用DataSet一次性存储

    ,但是select..into和if(select..)等情况下的查询结果集不会作为存储过程的“返回值”。

    创建函数的例子(不具备编程意义):

    delimiter ;;
    drop function if exists f_nvl;;
    create function f_nvl(param varchar(20), defaultVal varchar(20)) RETURNs VARCHAR(20)
    BEGIN
    if(ifnull(param,null) is not null) THEN
    return param;
    ELSE  -- elseif块后面也要then
    return defaultVal;
    end if;
    END;;

    创建存储过程的例子(不具备编程意义):

    delimiter ;;
    drop procedure if exists sp_test;;
    create procedure sp_test(in pro varchar(20))
    begin
        -- create temporary table tmp select* from student; -- 不会存储到存储过程的返回结果集(DataSet)里而是放在临时表里
        -- if(select count(1) from student) then  -- 不会存储到返回结果集里
        select* from monitor;  -- 会存储到返回的结果集里,作为第一个记录集
        select count(1) into @mm from student;  -- 不会存储到返回结果集里
        -- end if;
    end;;
    delimiter ;

    三、delimiter的作用:

    如上,在drop procedure。。之前先有个delimiter ;;的作用是告诉SQL解释器将“提交符”变更为;;,那么当SQL解释器看到;;后就会将;;之前的SQL语句

    作为一个整体执行,类似SQLServer的go,也有点像Oracle增删改等情况下的commit(Oracle增删改等是需要commit;才会生效的);

    这样子SQL解释器就能知道drop...;;这部分是一个整体。create。。。end;;这部分是一个整体而不会出现drop。。还没执行就接着create的情况。

    四、个人经验:

    建议大家学习SQL里的存储过程、函数、触发器、event等内容以及写一些的时候一定要和自己熟悉的编程语言关联起来,毕竟我们大多是都是代码写的

    多存储过程、SQL函数等写的少;如果将存储过程和函数看成是Java、C#里的方法(有部分不同,但是内部业务逻辑实现流程还是很像的),而表就看成是

    po对象集合,这样子会思路清晰很多。

    五、distinct用法:

    SQL:select distinct name,gender from student

    解释:从student数据表里查询所有记录的name,gender列,并且去除name和gender同时重复的记录

    ,注意即便distinct(name),gender。。也是去除name和gender同时重复的记录而非只是name重复的记录(也是一种记录虚拟合并)

    且distinct必须放在查询字段的开头,即select gender, distinct name 。。是错误的。其实distinct在功能上完全可以用group by代替,但是

    如果只是去重且重复的记录很多则distinct效率以及方便程度都要比group by要好,如果需要对部分列去重但又要保留其它列的一些信息则要用group by和聚合函数。

    六、SQL语句执行时间测试:

    ①是通过执行后的显示信息会提示耗时多少。

    ②当①情况为0时(即耗时太短时)可以用show profiles看duration和query列查看更详细的信息。

    七:其它一些sql语句

    1.insert into score_temp(score) select score from student limit 0, 1000;可以将第二个查询出来的结果放到第一个表里,一般用于临时表的数据插入,或定期将某表数据备份到另一个表(星期/月/年);

    2.truncate table student;和delete比起来更快,因为它不需要有日志记录,但是delete是可恢复的,而truncate后不可恢复;

  • 相关阅读:
    Linux系统编程之--守护进程的创建和详解【转】
    【转】Android虚拟平台的编译和整合
    【转】6.4.6 将驱动编译进Linux内核进行测试
    【转】Linux驱动模块编译进内核中
    【转】Android HAL实例解析
    【转】ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件
    【转】Linux下tar.xz结尾的文件的解压方法--不错
    【转】linux tree命令以树形结构显示文件目录结构 ---- 不错
    【转】NDK编译可执行文件在Android L中运行显示error: only position independent executables (PIE) are supported.失败问题解决办法。------不错
    【转】Notepad++ 快捷键 大全 官方整理过来的
  • 原文地址:https://www.cnblogs.com/silentdoer/p/8283779.html
Copyright © 2011-2022 走看看