MySQL 笔记 (18) SQL编程

局部变量

变量声明

1
declare var_name[,...] type [default value]

这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。

赋值

使用 set 和 select into 语句为变量赋值。

  • 注意:在函数内是可以使用全局变量(用户自定义的变量)

全局变量

定义、赋值

set 语句可以定义并为变量赋值。

1
set @var = value;

也可以使用select into语句为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。

还可以把赋值语句看作一个表达式,通过select执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。

1
2
3
select @var:=20;
select @v1:=id, @v2=name from t1 limit 1;
select * from tbl_name where @var:=30;

select into 可以将表中查询获得的数据赋给变量。

1
select max(height) into @max_height from tb;

自定义变量名

为了避免select语句中,用户自定义的变量与系统标识符(通常是字段名)冲突,用户自定义变量在变量名前使用@作为开始符号。

1
@var=10;

变量被定义后,在整个会话周期都有效(登录到退出)

控制结构

if语句

1
2
3
4
5
6
7
8
if search_condition then
statement_list
[elseif search_condition then
statement_list]
...
[else
statement_list]
end if;

case语句

1
2
3
4
CASE value WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result]
END

while循环

1
2
3
[begin_label:] while search_condition do
statement_list
end while [end_label];
  • 如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。
    • 退出循环
      退出整个循环 leave
      退出当前循环 iterate
      通过退出的标签决定退出哪个循环

内置函数

数值函数

1
2
3
4
5
6
7
8
9
10
11
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() -- 随机数
truncate(x, d) -- 截取d位小数

时间日期函数

1
2
3
4
5
6
7
8
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(); -- 从时间戳获得时间

字符串函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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) 双分支。

聚合函数

1
2
3
4
5
6
count()
sum();
max();
min();
avg();
group_concat()

其他常用函数

1
2
md5();
default();

存储函数,自定义函数

新建

1
2
CREATE FUNCTION function_name (参数列表) RETURNS 返回值类型
函数体
  • 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
  • 一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
  • 参数部分,由”参数名”和”参数类型”组成。多个参数用逗号隔开。
  • 函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
  • 多条语句应该使用 begin…end 语句块包含。
  • 一定要有 return 返回值语句。

删除

1
DROP FUNCTION [IF EXISTS] function_name;

查看

1
2
SHOW FUNCTION STATUS LIKE 'partten'
SHOW CREATE FUNCTION function_name;

修改

1
ALTER FUNCTION function_name 函数选项

存储过程,自定义功能

定义

存储存储过程 是一段代码(过程),存储在数据库中的sql组成。
一个存储过程通常用于完成一段业务逻辑,例如报名,交班费,订单入库等。
而一个函数通常专注与某个功能,视为其他程序服务的,需要在其他语句中调用函数才可以,而存储过程不能被其他调用,是自己执行 通过call执行。

创建

1
2
3
4
CREATE PROCEDURE 过程名 (参数列表)
BEGIN
过程体
END

调用:CALL 过程名

参数列表:不同于函数的参数列表,需要指明参数类型
IN|OUT|INOUT 参数名 数据类型
IN 输入:在调用过程中,将数据输入到过程体内部的参数
OUT 输出:在调用过程中,将过程体处理完的结果返回到客户端
INOUT 输入输出:既可输入,也可输出
注意,没有返回值。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :