第6章 MySQL编程基础

由 天空David 发布

池州学院红队Write up

0x00课程名称:

1.数据库原理与应用
Principle and Application of Database

2.数据库原理与应用2022年春-池州学院
ChiZhou University: Database System (2022 Spring)
(课程名称排名不分先后:中文优先级大于英文,老师发给我的课件上的翻译大于我感觉的翻译)
池州学院:大数据与人工智能学院
刘老师的作业要求:提交时,一个题目、一个命令、一个截图

0x01目标与要求:

本章主要学习MySQL的常量、变量、函数、表达式、关键词、注释等编程基础知识,自定义函数的创建与使用和程序基本控制结构。
了解:MySQL的脚本、注释语句;
重点:自定义函数创建与应用,程序三种基本结构;
难点:用MySQL编程解决实际问题

0x02内容提纲:

1.编程基础知识
2.自定义函数
3.流程控制结构

0x03:编程基础知识

0x04注释、定界符与语句块

1.注释:不会被执行,用于解释说明,便于维护代码。
单行注释符号(--或#)放在行末,注释本行;
多行注释符号(/ …… /),须成对使用,可以注释多行;

2.定界符:
MySQL默认定界符为分号(;)
修改方法用delimiter命令(格式为delimiter 新的符号)

3.语句块:由若干条语句组成的程序代码单元,在逻辑上是一个整体,全部被执行或不会被执行。
语句块定义:
begin
语句序列(可包含多条语句)
and;

0x05变量的定义及使用

1.变量三要素:变量名、变量类型和变量的值;
2.变量名不能与系统中的关键词或函数名同名;
3.每个变量是一个容器,用于保存数据;
4.变量分类(从作用域和生存期):用户会话变量、局部变量和系统变量;

0x06用户会话变量(@变量名)

每个用户拥有独立会话空间,用户会话变量互不干扰;
与服务器的连接断开则空间释放,会话变量生存期结束;
不用先定义,直接赋值即可使用;
赋值方法(用set 或select):
set 格式:set @变量名1=值1, @变量名2=值2 ;
select:
格式1:select @变量名1 : =值1, @变量名2:=值2;
格式2: select 值1 into @变量名1;

0x07局部变量(变量名)

是指定义在某个局部范围内的变量,如语句块中定义的变量;
作用范围仅在定义的局部内;
必须先定义再赋值和使用;
定义方法:declare
格式: declare 变量名 1[,变量名2] 数据类型(n) default 值;
例定义局部变量myvar,数据类型为int,默认值为100。
declare myvar int default 100;
给myvar赋值为77
set myvar=77;

0x08系统变量(@@变量名)

由MySQL自动创建的变量,前缀符号为“@@”;
分类:全局系统变量和用户系统变量;
全局系统变量影响服务器整体操作,初始值由数据库启动时自动初始化;
用户系统变量只影响各个用户连接,由数据库服务器针对每次连接创建的变量,并复制一份全局变量的值作为会话变量的初始值;
查看方法:
全局系统变量:show global variables;
用户系统变量:show session variables|show variables;
查看具体的变量:select @@系统变量名; 如select @@ verison

0x09查看变量值

系统变量:
全局系统变量:show global variables;
用户系统变量:show session variables|show variables;
查看具体的变量:
select @@系统变量名;
如select @@ verison;
select @@global.变量名;
select @@session.变量名;
会话变量:select @变量名;
局部变量:select 变量名; (在语句块中使用)

0x10运算符与表达式

MySQL表达式是由运算符将常量、变量、字段名和函数等组合连接而成的有意义的字符序列。一个表达式通常可以得到一个值。
常按运算符分类:算术表达式、关系表达式、逻辑表达式、位运算表达式;
运算符优先级;
内置函数;数学函数、字符串函数、时间日期函数
PPT(17-18):同一页面既成为“时间日期函数”和“系统信息函数”,可能是老师的隐写,当时用意我还没有体会到,sorry。
其他函数:
1.控制流函数
IF(expr,v1,v2)
翻译:如果表达式expr的值为真,则返回vl的值,否则返回v2的值
示例:IF(50<100, 5, 10)的值为5

IFNULL(v1,v2)
翻译:如果表达式expr的值不是NULL,则返回vl,否则返回v2
示例:IFNULL(1/0, 4)的值为4
2.数据类型转换函数
CAST(Value AS type)
翻译:将Value的数据类型转换为type类型
示例:CAST(3.14 AS CHAR(4))的值为字符串'3.14'

CONVERT(Value,type)
示例:CONVERT('3.14',FLOAT)的值为3.14 (数值)
相同点:都是进行数据类型转换,实现的功能基本等同

补充(事实上就是re,CTF中常用,机器学习中的LSTM也常用,升华:温故而知新,可以为师矣):
不同点:两者的语法不同,cast(value as type) 、 convert(value,type)
所支持的类型如下:

二进制,同带binary前缀的效果 : BINARY

字符型,可带参数 : CHAR()

日期 : DATE

时间: TIME

日期时间型 : DATETIME

浮点数 : DECIMAL

整数 : SIGNED

无符号整数 : UNSIGNED

0x11:自定义函数

1.创建自定义函数
创建函数必须具有create routine权限(alter routine和execute权限被自动授予给创建者);
创建一个spuser用户并对它赋予create procedure 权限
grant create routine on tempdb.* to “spuser”@'localhost' identified by '123456';

Tips&Flag:spuser是什么意思?如何拆解这个单词,是sp - user吗?sp英文全称是什么?音标你能写出来吗?代表了什么用户组?有哪些权限?

MySQL创建自定义函数时,需要打开数据库,但可以创建非当前数据库的自定义函数(数据库名.函数名);

安全参数默认没有开启
log_bin_trust_function_creators 默认为0,是不允许function的同步;

show variables like '%fun%' ;
set global log_bin_trust_function_creators=1;

语法格式:
create function func_name([[in | out | inout]func_parameter type[,…]])
returns return_type
[characteristic…]
begin

function_body_statements;
return[return_values];

end;

例:定义一个求长方形面积的函数
delimiter //咱就是说,俺叫“定界符”
create function func_area(long1 int,wide1 int)
returns int
begin
return long1 * wide1;
end //
delimiter ; //你到底有没有记住我呜呜呜,我叫“定界符”,艺名“迪丽米特儿”,英 /dɪˈlɪmɪtə(r)/ 美 /dɪˈlɪmɪtər/

函数定义说明(一) :
[in | out | inout] func_parameter type :函数参数及类型列表。in表示输入参数, out表示输出参数,inout表示输入输出参数,func_parameter表示参数名, type参数类型。
returns return_type:函数返回值类型。
begin…end: 函数体起止符。由实现任务的语句序列组成,函数体内要有“return return_values;”语句,表示函数返回值表达式。

函数定义说明(二):
characteristics:用于指定函数的特征参数,由以下一种或几种选项组合而成:
language sql 默认为sql
|[not] deterministic 对同样的输入参数是否会产生相同的结果
|{ contains sql|no sql|reads sql data|modifies sql data }
CONTAINS SQL表⽰⼦程序不包含读或者写数据的语句
NO SQL 表⽰⼦程序不包含sql
READS SQL DATA 表⽰⼦程序包含读数据的语句,但是不包含写数据的语句
MODIFIES SQL DATA 表⽰⼦程序包含写数据的语句。
|sql security {definer|invoker } definer表示只有定义者才能执行;

        invoker表示拥有权的调用者才可以执行,默认为definer;

|comment ‘string‘ 注释信息,用来描述存储函数;

例:定义函数实现给定一个学号从student表中读取此学生的性别;
delimiter &&
create function func_sno(s_no varchar(11))
returns char(2)
READS SQL DATA
begin
return (select sex from student
where studentno =s_no);
end &&
delimiter ;

2.调用自定义函数
在MySQL系统中,因为函数和数据库相关,如果要调用函数时,需要打开相应的数据库或指定数据库名称。存储函数的调用与MySQL内部函数的调用方式相同,用select实现。

示例:
select func_sno('19126113307');
select func_area(4,5);
3.管理自定义函数
3.1查看函数
方法一:查看当前数据库中所有的自定义函数
show function status;
show function status like ‘表达式’;
方法二:查看指定数据库(如teaching)中的所有的自定义函数。可使用SQL语句。

    mysql> select name from MySQL.proc
            where db = 'teaching' and type='function' ;

方法三:可以查看指定函数名的详细信息。

      mysql>show create function 函数名;

方法四:通过函数保存数据库information_schema的表routines。
mysql> select * from information_schema.routines
where routine_name='func_course';

3.2修改函数
alter function 函数名 [characteristic …]; 或者删除重新创建;

例:修改存储函数func_course的定义。将读写权限改为reads sql data,并加上注释信息“find function name”
mysql> alter function func_course
reads sql data
comment ‘find function name’;

3.3删除函数

0x12 MySQL流程控制语句

概览:
1.IF语句
2.CASE语句
3.WHILE语句
4.LOOP语句
5.repeat语句
6.iterate和leave

MySQL语言编程,可以通过流程控制语句实现程序的顺序、选择和循环三种基本程序结构,解决复杂问题如存储过程、函数和触发器等的编程。

0x13 IF语句,根据条件不同执行不同的语句。

语法:
if condition then

[elseif condition then]

[else]

End if

例:创建函数exam_if,判断输入参数的值是否为10,如果是则输出1;是否为20,如果是则输出2,当以上条件都不满足时输出3。然后调用函数exam_if

mysql> delimiter //
mysql>
create function exam_if(x int)
returns int
begin
if x=10 then set x=1;
elseif x=20 then set x=2;

  else  set x=3;

end if;
return x;
end //
mysql> delimiter ;
mysql> select exam_if(77);

0x14:CASE语句,多分支语句。

格式1:
case 表达式

  when value then …
  [when value then…] 
  [else…] 

end

格式2:
case

  when 条件1 then …
  [when 条件2 then…] 
  [else…] 

end

例:创建函数exam_if,判断输入参数的值是否为10,如果是则输出1;是否为20,如果是则输出2,当以上条件都不满足时输出3。然后调用函数exam_if

mysql>delimiter //
mysql>
create function exam_case1(x int)
returns int
begin
case x
when 10 then set x=1;
when 20 then set x=2;
else set x=3;
end case;
return x;
end //

调用函数:select exam_case(17);

0x15 条件判断函数if()、ifnull()

直接调用,主要用在SQL语句中进行条件判断;
(1)if()函数。if(condition,v1,v2)函数中condition为条件表达式,当condition的值为true时,函数返回v1的值,否则返回v2的值。

例:从表student中查询学号studentno,入学成绩entrance。成绩大于等于800分,显示“pass!”,否则,显示“bye.”,输出前5条记录。
mysql>select studentno, entrance,if(entrance

          =800,'pass','bye! ')
         from  student  limit  5;

(2)ifnull()函数。ifnull(expression, alt_value)函数中,如果expression的值为null,则该函数alt_value的值;否则该函数返回expression的值。
例:
SELECT IFNULL(NULL, "RUNOOB");
SELECT IFNULL("Hello", "RUNOOB");

0x16 while循环语句

while循环语句执行时首先判断condition条件是否为真,如果是则执行循环体,否则退出循环。
语法:
[begin label: ]while condition do

end while [begin label];
例:定义函数exam_while,应用while语句求1到100项的和。
mysql> delimiter //
mysql> create function exam_while(n int)
returns int
begin

declare sum int default  0; 
declare m int default  1;
while  m< = n  do
    set  sum=sum+m;
    set  m=m+1;
end while;
return  sum;

end //

函数调用:
mysql> delimiter ;
mysql> select exam_while(100);

0x17 loop循环语句

loop循环语句是没有退出条件语句的循环,一般通过leave语句退出循环体。
语法:
[begin label: ] loop

end loop [begin label];
例:定义函数exam_loop,应用loop语句求1~100之和。通过leave语句退出循环并输出结果。
mysql> delimiter //
mysql> create function exam_loop(n int) returns int
begin
declare sum int default 0;
set n=1;
loop_label:loop
set sum=sum+n;
set n=n+1;
if n>100 then
leave loop_label;
end if;
end loop;
return sum;
end //

函数调用:
mysql> delimiter ;
mysql> select exam_loop(100);

0x18 repeat循环语句

先执行一次循环体,之后判断condition条件是否为真,若为真则退出循环,否则继续执行循环。
语法:
[begin label: ] repeat

until condition
end repeat [begin label];

例:求解12+22+32+……+i2<1000的i的最大值
delimiter //
create function sum_i ( ) returns int
begin

declare  I int default 1; 
declare s int default 0;

repeat

  set s=s+(i*10+2);
  set i=i+1;
 until s>1000

end repeat;
return i-1 ;
end //
delimiter ;

delimiter //
create function sum_ia(x int ) returns int
begin

declare  I int default 1; 
declare s int default 0;
repeat 
    set s=s+(i*10+2);
    set i=i+1;
    until i=x
end repeat;

return s;
end //
delimiter ;

0x19 leave与iterate语句

语法 :leave|iterate <结束标签>;
可以出现在loop、repeat和while语句内;
相同点:都可以中止循环;
区别:leave语句是结束循环; iterate语句是结束本次循环,转向下一次循环。
delimiter //
create function exam_iterate2(n int) returns int
begin

 declare sum char(20) default 0;
 declare s int default 0;
 add_num: while  true  do
     set s=s+1;
     if (s%2=0) then
       set sum=sum+s;
   else
      iterate  add_num;
  end if;

if (s=n) then

    leave  add_num;
 end if;
 end while add_num;

return sum;
end //
delimiter ;

本章小结:
1.变量三要素及三种常用变量;
2.自定义函数定义及调用;
3.程序控制流语句(分支与循环);

FLAG{你能看到这里,那就是我们的缘分,首先,刘老师2022年4月23日下午15时40分下课时讲到了运算符与表达式,PPT定位在17-18页,后面的内容是我闲暇之余对着老师这一章的课件手敲的,可能会有些错漏,只要你留言,我会查阅资料再进行勘误,我们是不是冠军,不重要,你能不能看懂隐写,才重要,欢迎报考池州学院。这是明着写的隐写,对NLP浅学一下其实就差不多}

FLAG{大风泱泱,大潮滂滂,五千年文脉涵养了巍巍中华。}

Tips:图片我尽量外链,会更新的,学生机流量有限。


暂无评论

发表评论