Mysql函数(内置函数,自定义函数)

简述

SQL:结构化查询语言,是一门编程语言,是用于管理数据库的编程语言。

元素:数据,数据类型,变量,函数,流程控制,运算符,注释。

注释:

行:

#

–[空格]

块:

/* */

select * from swpu_stu #where id=2;
;

select * from swpu_stu -- where id=2;
;

结束符:

select * from swpu_stu where id=2\g
select * from swpu_stu where id=2\G

可以使用delimiter来修改语句结束符,eg:delimiter $$

变量:

字段名就是变量。

系统默认变量

show variables like ‘char%‘;

用户自定义变量:

如何定义一个变量?

set 变量名=变量值

注意:为了区分系统变量和字段与用户自定义变量,需要在用户变量前,增加@标识符。

通过select语句可以或得当前变量的值。

set @who="李国冬";
select @who;

定义一个变量select into

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

select 10,15,20 into @a,@b,@c;
select @a,@b,@c;

select stu_money from swpu_stu where id=1 into @stu_money;
select @stu_money;

注意:select into @var要求只能返回一行,如果返回多行,会语法错误,或者只将最后一行的

数据注入到变量内。

利用select语句的部分表达式达到为变量赋值的目的

使用:=的形式

select @who := ‘张国荣‘;
select @who;

注意:

=应该赋值,但是在select语句中,就成了关系等于,使用专门的赋值运算符:=

:=同样适用于set

set @i := ‘周杰伦‘;
select @i;

使用变量是在表达式或者使用select查询到即可。

set @total = (select count(*) from swpu_stu);
select @total;

1、作用域。

用户定义的函数,是全局的(函数内可用)。

存在局部作用域变量,函数内定义的变量。

2、有效期。会话结束(连接结束)。

内置函数

数值:

rand()得到0-1之间的随机数

得到5至10

select 5+5*rand();

取整

select floor(5+5*rand());

格式化:format

select format(1234567.1234,2);

时间和日期:

now()当前时间

select unix_timestamp();
select from_unixtime(12345);
select from_unixtime(unix_timestamp());

字符串:

concat()字符串连接

length()

char_length()

select length("李国冬");
select char_length("李国冬");

select substring(‘中华人民共和国‘,2,2);
select substring(‘中华人民共和国‘,-2,2);

左边补足

lpad(需要补足的字符串,补足后的长度,补字符串);

select lpad(‘1‘,3,‘0‘);

其他:

md5

sha1

passwd

select md5(‘1‘);
select sha1(‘1‘);
select password(‘1‘);

自定义函数

要素:函数名,参数列表,函数体,返回值。

语法:

create function 函数名 (参数列表) 返回值类型

函数体

delimiter $$
create function sayHello() returns varchar(20)
begin
return ‘hello world!‘;
end
$$

delimiter ;

select sayHello();

注意:

函数与当前的数据库绑定的,在其他数据库使用该函数是不存在的,可以使用 数据库名.函数名

select testthings.sayHello();

sql中的流程控制—分支

if 条件1 then
    条件1满足执行的语句
elseif 条件2 then
    条件2满足执行的语句
...
else
    上面的条件都不满足,执行的语句
end if;

else if和else都是可以省略的。
--hour可以获得当前时间的小时部分
delimiter $$
create function func() returns varchar(20)
begin
if hour(now())>=11 then
	return ‘晚‘;
else
	return ‘早‘;
end if;
end
$$

delimiter ;

select func();
drop function func1;
delimiter $$
create function func1() returns varchar(20)
begin
if hour(now())>=11 then
return ‘晚‘;
elseif hour(now())>=9 then
return ‘中‘;
else
return ‘早‘;
end if;
end
$$

delimiter ;

select func1();

sql中的流程控制—循环

drop function func1;
delimiter $$
create function func1() returns varchar(20)
begin
set @i=1;
set @sum=0;

while @i<10 do
    set @sum = @sum + @i;
    set @i = @i+1;
end while;

return @sum;
end
$$

delimiter ;

select func1();

循环的提前终止:

leave 终止循环,类似于break

iterate 终止循环,类似于continue

注意:

不是根据leave和iterate所在的位置来决定终止那个循环,而是由循环的标签来决定的。

循环的标签,给循环取名字。

标签: while

drop function func1;
delimiter $$
create function func1() returns varchar(20)
begin
set @i=0;
set @sum=0;

w:while @i<10 do
set @i = @i+1;

if @i=5 then
iterate w;
end if;

set @sum = @sum + @i;
end while w;

return @sum;
end
$$

delimiter ;
select func1();

函数内部使用的变量:

@var的形式,相当于全局变量,函数内和函数外通用。

函数的参数:

参数同样需要确定类型(参数名 类型)

drop function sayHello;
delimiter $$
create function sayHello(user_name varchar(10)) returns varchar(20)
begin
return concat(‘hello, ‘,user_name);
end
$$

delimiter ;

select sayHello(‘李国冬‘);

一个函数可以有多个参数,使用逗号分隔。

函数声明的局部变量;

使用declare声明局部变量,需要指定类型,可以指定默认值default

drop function func1;
delimiter $$
create function func1() returns varchar(20)
begin
declare i int default 0;
declare total int default 0;

while i<10 do
    set i = i+1;
    set total = total + i;
end while;

return total;
end
$$

delimiter ;
select func1();


原始数据

create table class_join(
id int primary key auto_increment,
c_name char(7)
);
insert into class_join values(null,‘lol0011‘);
insert into class_join values(null,‘lol0022‘);
insert into class_join values(null,‘lol0033‘);
insert into class_join values(null,‘lol0044‘);

create table student_join(
stu_id int primary key auto_increment,
stu_no char(10),
class_id int not null,
stu_name varchar(10),
stu_info text
);
insert into student_join values(null,‘lol0033003‘,‘3‘,‘李小龙‘,‘info‘);

如何获取当前班级内最大的学号?。如果有,增加1;如果没有,从001开始。已知条件,班级id。

drop function sno;
delimiter $$
create function sno(c_id int) returns varchar(20)
begin
declare s_no char(10);#保存当前班级最大的学号,如果没有就是null。
declare class_name char(7);

select stu_no from student_join where class_id = c_id order by stu_no desc limit 1 into s_no;

if isnull(s_no) then
-- 没有学生,从1开始,获得班级名字
    select c_name from class_join where id=c_id into class_name;
    return concat(class_name, ‘001‘);
else
-- 有,最大值加1
    return concat(left(s_no,7),lpad(right(s_no,3)+1,3,‘0‘));
end if;
end
$$

delimiter ;
select sno(2);


随机产生名字

delimiter $$
create function sname() returns char(2)
begin
declare first_name char(16) default ‘赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨‘;
declare last_name char(5) default ‘甲乙丙丁戊‘;
declare full_name char(2);
set full_name = concat(substring(first_name,floor(rand()*16+1),1),
substring(last_name,floor(rand()*5+1),1));
return full_name;
end
$$
delimiter ;

select sname();

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-31 03:23:45

Mysql函数(内置函数,自定义函数)的相关文章

Mysql研究之MySQL常用内置函数完全解析

说明: 1)可以用在SELECT/UPDATE/DELETE中,及where,orderby,having中 2)在函数里将字段名作为参数,变量的值就是字段所对应的每一行的值. 3)在程序设计语言如C++中提供的函数,MySQL大部分也提供了,关于MySQL函数的完整信息,请参阅<MySQL参考手册> 一.字符串函数[比较常用,需要掌握] 1. concat(s1,s2,…,sn) #把传入的参数连接成一个字符串 selectconcat(‘abc’,’def’); selectconcat(

MYSQL常用内置函数详解说明

函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值:在整理98在线字典数据时(http://zidian.98zw.com/),有这要一个需求,想从多音字duoyinzi字段值提取第一个拼音作为拼音pinyin字段的值,如:duoyinzi(ā,á,ǎ,à,a),想提取ā作为pinyin的值:数据有好几万条,不想用程序一条条处理,只想用一个sql来实现,后来了解了下MYSQL常用内置函数,是可以做到的:sql:UPDATE ol_zidian set pinyin=LEFT(duoyi

python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)

今日临时总结的内容,可能还有些不正确的地方,初步当做个速查表吧. 类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(return None和不返回没区别)子类重写了__init__()方法要在子类中的__init__()方法调用父类的__init__方法(super(当前类, self).__init__(参数)) stu = Student() __new__ 类实例化被调用时 stu = Studetn() _

thinkphp内置截取字符串函数无法显示省略号解决方法

thinkphp内置截取字符串函数无法显示省略号解决方法 functions.php function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ if(function_exists("mb_substr")) {      if($suffix)    {         if($str==mb_substr($str, $start, $length, $charset))

mysql 报错之创建自定义函数

I experienced this error while trying to alter one of my stored procedures remotely on a master server. After some research, I ended up getting information from “Binary Logging of Stored Programs“. From MySQL Reference in verbatim:When you create a s

property内置装饰器函数和@name.setter、@name.deleter

# property # 内置装饰器函数 只在面向对象中使用 # 装饰后效果:将类的方法伪装成属性 # 被property装饰后的方法,不能带除了self外的任何参数 from math import pi class Circle: def __init__(self, r): self.r = r def perimeter(self): return 2 * pi * self.r def area(self): return pi * self.r**2 * pi c1 = Circle

七. python进阶(内置高阶函数)

一. 内置高阶函数 高阶函数 函数接收的参是一个函数名 返回值包含函数 把函数当作一个参数传给另一个函数 def a(n): print(n) def b(name): print('my name is 哈哈哈') a(b('111111111111111111111111111111111')) # my name is 哈哈哈 # None def a(n): print(n) #<function b at 0x000002EAA7B43E18> def b(): print('my

6 JavaScript函数&amp;内置构造&amp;函数提升&amp;函数对象&amp;箭头函数&amp;函数参数&amp;参数的值传递与对象传递

JavaScript函数:使用关键字function定义,也可以使用内置的JavaScript函数构造器定义 匿名函数: 函数表达式可以存储在变量中,并且该变量也可以作为函数使用. 实际上是匿名函数. <body> <p>函数存储在变量后,变量可作为函数使用:</p> <p id="demo"></p> <script> var x = function(a,b){return a+b; }; document.g

SQL学习之开窗函数-内置函数盘点

开窗函数 开窗函数提供了跨越行集执行计算的能力,行集中的行通过某种方式与当前查询行联系在一起. 内置开窗函数列表见表-1.注意调用这些函数必须使用开窗函数语法:也就是需要加上OVER子句. 除了这些函数,任何内置和自定义的聚合函数也可以作为开窗函数使用.聚合函数只有当在调用语句后面加上OVER子句后才会当作开窗函数执行,否则他们就是正常的聚合函数. 表1-常见的开窗函数 函数  返回值类型  描述 row_number() bigint 组内当前行的序号,从1开始 rank() bigint 有