sql  结构化查询语言
     是一种编程语言   用于管理数据库的编程语言
    
元素:
    数据

 
   数据类型
        变量的数据类型  就是字段的数据类型 

    变量

    字段名就是变量  

    自定义变量

    
    为了区分用户变量和系统变量 需要在用户变量前增加 @ 标志
    set  变量名 = 变量值   set 是专门给变量赋值的语句

    set  @who = 'gwyy';     查看自定义变量  select @who;

    set  @a = (select count(*) from t1);   甚至给set赋值语句都可以是一条sql语句    

    select into 方法注入变量

    select 字段列表  表达式   into  变量列表

    select  19,29,39 into  @a,@b,@c;    把3个数字注入到3个变量里面

    select name from t1 where id = 1 into @d;   把查询结果注入到变量里面

    select  into var 要求只能返回一个记录
    select 方式给变量赋值

    select   @a := 'gwyy';   也可以这么写  set @a := 'gwyy';

    

    变量有效期

    会话结束就消失 连接结束

    作用域  用户定义的是全局的  函数内可用  作用于是重叠的  但是mysql也存在局部作用域变量 在函数内部定义 的






   
 函数

        内置函数 

数值函数

Abs(X),绝对值abs(-10.9) = 10

Format(X,D),格式化千分位数值 format(1234567.456, 2) = 1,234,567.46

Ceil(X),向上取整ceil(10.1) = 11

Floor(X),向下取整floor (10.1) = 10

Round(X),四舍五入去整

Mod(M,N) M%N M MOD N求余10%3=1

Pi(),获得圆周率

Pow(M,N) M^N

Sqrt(X),算术平方根

Rand(),随机数  select floor(rand() *5 +5);

TRUNCATE(X,D) 截取D位小数

时间日期函数

Now(),current_timestamp(); 当前日期时间

Current_date();当前日期

current_time();当前时间

Date(‘yyyy-mm-dd HH;ii:ss’);获取日期部分

Time(‘yyyy-mm-dd HH;ii:ss’);获取时间部分

Date_format(‘yyyy-mm-dd HH;ii:ss’,’ %D %y %a %d %m %b %j');

Unix_timestamp();获得unix时间戳

From_unixtime();//从时间戳获得时间

字符串函数

LENGTH (string )  //string长度,字节

CHAR_LENGTH(string)   //string的字符个数

SUBSTRING (str, position [,length ])   //从str的position开始,取length个字符

REPLACE (str,search_str ,replace_str )   //在str中用replace_str替换search_str

INSTR (string ,substring )  //返回substring首次在string中出现的位置

CONCAT (string [,... ])  //连接字串

CHARSET(str)  //返回字串字符集

LCASE (string ) //转换成小写

LEFT (string ,length )  //从string2中的左边起取length个字符

LOAD_FILE (file_name)   //从文件读取内容

LOCATE (substring , string [,start_position] )   //同INSTR,但可指定开始位置

LPAD (string ,length ,pad )  //重复用pad加在string开头,直到字串长度为length lpad(1,3,0)  在1前面补3个0

LTRIM (string ) //去除前端空格

REPEAT (string ,count )  //重复count次

RPAD (string ,length ,pad)  //在str后用pad补充,直到长度为length

RTRIM (string )  //去除后端空格

STRCMP (string1 ,string2 )  //逐字符比较两字串大小

流程函数:

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END   多分支

IF(expr1,expr2,expr3)  双分支。

 

聚合函数

Count()

Sum();

Max();

Min();

Avg();

Group_concat()

其他常用函数

Md5();

Default();

用户自定义函数

    函数名
    参数列表
    函数体

    返回值

语法:

新建:

Create function function_name (参数列表) returns 返回值类型

函数体

函数名,应该合法的标识符,并且不应该与已有的关键字冲突。

一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。

参数部分,由参数名和参数类型组成。

返回值类类型

函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。

多条语句应该使用 begin end语句块包含。

注意,一定要有return 返回值语句。

函数参数

参数 同样需要确定类型

可以有多个参数

函数内部定义局部变量

declare i  int default 0;

删除:

Drop function if exists function_name;

查看:

Show function status like ‘partten’

Show create function function_name;

修改:

Alter function function_name 函数选项。


DEMO

最简单的函数 输出 hello world
delimiter $$
  create  function sayhello() returns varchar(20)
    begin

        return 'hello world';
    end
$$

delimiter ;
稍微复杂的 算出现在是不是晚上
delimiter $$
  create  function fun1() returns varchar(20)
    begin

        --  hour 可以获得当前时间的小时部分

        if  hour(now()) >=18 then
          return   '晚安';
        else
        return  '早';
        end if;
    end
$$

delimiter ;


测试循环
delimiter $$
drop function if exists  fun2$$
  create  function fun2() returns varchar(20)
    begin

       set @i = 1;
        set @num = 0;

       w:while @i<=10 do
            if @i =5 then     -- 如果循环到了5就退出整个循环

            -- set @i = @i+1;
            leave  w;

            end if;
            set @i = @i+1;
            set @num = @num + @i;
        end while  w;

        return @num;
    end
$$

delimiter ;

带参数的
delimiter $$
drop function if exists sayhello$$
  create  function sayhello(name varchar(10)) returns varchar(20)
    begin

        return  concat( 'hello',name);
    end
$$

delimiter ;


学号函数
delimiter $$
drop function if exists sayhello$$
  create  function sno(c_id  int) returns char(20)
    begin

    declare s_no char(10);

    declare  class_name   char(10);
    select stu_no from  join_student where chass_id = c_id  into s_no

    if  isnull(s_no) then

  --  没有学生 返回001
        select c_name from join_class where id = c_id into class_name ;

        return  concat(class_name,'001');

    else 

        --  有的话 最大值+1

    return  concat(class_name, lpad(right(s_no,3) +1 ,3,'0'));
end if;
    end
$$

delimiter ;








控制流程
  分支
    if 条件1 then   

        条件1满足语句

    else if  条件2 then

        条件2满足的语句

    else 

        都不满足的语句

    End if;

    
循环
while  条件  do
循环体

循环的提前终止
break  相当于 mysql里面的  leave退出整个循环
continue  没有 但是有 iterate  退出当前循环

注意 不是根据 leave 和 iterate 的位置来跳出的 而是根据循环标签来跳出的

给循环起个名字   :

标签 : while

end while 标签






    



    

    运算符

        算数运算符  + - * /

        逻辑运算符    and  or  not   !

        关系运算符 > < >= <=  == != = ===

    注释

        行注释  #  --     块注释  /*  xxx  */

    结束符  

        默认是; 也可以是 \g  也可以是 \G   当然 ;和\g是一样的  \G是分组显示  \g和\G是命令行独有的
        除此之外 我们还可以用 delimiter 来修改语句结束符  delimiter  $$










存储过程

存储过程 类似于一个函数  就是把一段sql 语句 封装成一个整体 当要使用的时候 可以调用这个存储过程来实现

在封装的语句体里面 可以用 if  else  case while  等控制结构

列也可以当成变量来看  所以 存储过程 可以当成一个程序来看     可以进行 sql编程

查看现有的存储过程

Show procedure  status;

删除存储过程

Drop procedure  存储过程名称;

写一个存储过程

Create  procedure p1()

Begin

Select * from g;

End$

调用存储过程

Call p1();

存储过程和函数的区别  一个名字不同 一个 没有return   其他都一样














sql编程 && 存储过程的更多相关文章

  1. PL/SQL编程—存储过程

    SQL> create or replace procedure sp_pro3(name_in varchar2,id_in varchar2) is begin update mytest ...

  2. SQl编程存储过程

    过程化存储 存储过程,一组为完成特定功能.经过编译后存储在数据库中的SQL语序集 灵活性:存储过程中可以进行流程控制和循环操作来完成复杂的判断和运算 一致性:通过存储过程可以使一些关联的操作一起发生, ...

  3. 基于oracle 的PL/SQL编程 - 存储过程

    接上篇,游标使用的语句,相当于一段匿名的函数,窗口关闭了就不存在了.如果想要窗口关闭了,还能继续执行那段代码,就需要存储过程了: PLSQL是指一个个PLSQL的业务处理过程存储起来进行复用,这些被存 ...

  4. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...

  5. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  6. SQL Server 存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  7. [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)

      最新更新请访问: http://denghejun.github.io Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中 ...

  8. java 调用 sql server存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  9. sql编程小结

    对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...

随机推荐

  1. 关于UtilTimerStack类的使用--XWork2、Struts2内置性能诊断类

    关于UtilTimerStack类的使用--XWork2.Struts2内置性能诊断类 一.UtilTimerStack做什么用的? 这个本来是Xwork2(Struts2的核心)的相关的工具类,可以 ...

  2. PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解

    一.公钥加密假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文 ...

  3. 一个简单的dom查询函数

    var regid = /^#([\w-]*)$/, regClass = /^\.([\w-]*)$/, regName = /^(div|a|p|ul|li|input|select|docume ...

  4. DELL iDRAC 远程虚拟机报错:虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用

    原因很简单,那就是虚拟介质的映射功能,只能被使用一次. 推荐做法: 1.由于通过远程,在Lifecycle Controller里DeployOS安装系统,需要在虚拟介质里映射ISO,因此映射功能要留 ...

  5. testNg的安装与卸载

    1.testNG的安装 打开eclips,点击Help菜单.选择Install New Software. 在弹出的窗口的work with的输入框,输入http://beust.com/eclips ...

  6. Linux Kernel的Makefile与Kconfig文件的语法

    https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...

  7. 【工作笔记二】ASP.NET MVC框架下使用MVVM模式

    ASP.NET MVC框架下使用MVVM模式 原文:http://www.cnblogs.com/n-pei/archive/2011/07/21/2113022.html 对于asp.net mvc ...

  8. 【转】android 欢迎界面翻页成效,仿微信第一次登陆介绍翻页界面

    android 欢迎界面翻页效果,仿微信第一次登陆介绍翻页界面 本实例做的相对比较简单主要是对翻页控件的使用,有时候想要做一些功能是主要是先了解下是否有现成的控件可以使用,做起来比较简单不用费太大的劲 ...

  9. SpringMVC全注解

    SpringMVC全注解不是你们那么玩的 前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来. 偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解. 1)工程图一张: web.xm ...

  10. [Java]利用拦截器和自定义注解做登录以及权限验证

    1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import ...