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. 网站静态化处理—CSI(5)

    网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...

  2. linux下crontab的使用实现

    1 crontab实现定时任务 1.1服务状态 /sbin/service crond status 查看定时任务的服务是否启动 参数:start 启动服务      Stop 停止服务      R ...

  3. 快速构建Windows 8风格应用29-捕获图片与视频

    原文:快速构建Windows 8风格应用29-捕获图片与视频 引言 本篇博文主要介绍Windows 8中相机的概念.捕获图片与视频的基本原理.如何实现捕获图片与视频.相机最佳实践. 一.相机 关于相机 ...

  4. leetcode[60] Rotate List

    题目:给定链表,和一个k,把链表的后k个旋转到前头,例如链表为: 1->2->3->4->5->NULL and k = 2, return 4->5->1- ...

  5. The Native POSIX Thread Library for Linux - 设计文档

    nptl-design

  6. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  7. 手工配置Service的过程中。

    正在使用srvctl创建service时间,需要注意TAF政策选择必须是dbms_service套餐配置.下面的例子演示了如何创建一个服务felix_ora: 1.查看现有的创建之前系统service ...

  8. python进程池剖析(二)

    之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果 ...

  9. 老调重弹--面向对象设计原则--S.O.L.I.D设计原则

    SRP - 单一职责原则 全称:Single Responsibility Principle 定义:每一个上下文对象(类.函数.变量等等)的定义应该仅仅包含单一的职责 描述:对象提供单一职责的高度封 ...

  10. Git工作流:中心工作流(翻译)

    使用Git作为版本控制器,有众多可能的工作流(Workflow),这使得我们这些新鸟不知道在实际工作中不知道该选择哪种工作流.这里我们对最常见的Git工作流做一个对比,为企业团队提供一个参考. 正如你 ...