1.MySql基础和存储过程
2021-04-14 09:47:29 0 举报
AI智能生成
GPNU老师的课堂💭 整理成笔记💬 方便考试 🏴☠️🏴☠️🏴☠️🏴☠️
作者其他创作
大纲/内容
1、数据库基础操作
1-0、简述
show DATABASES; -- 查询所有的数据库
use (mysql); -- 选择括号内的数据库<br>show tables; -- 然后查询所选数据库的所有的表
1-1、登陆数据库
1、进入mysql:cd D:\MySQL\mysql-5.7.30-winx64\bin
2 . \mysql -u root -p
3、输入密码
4、成功进入数据库
1-2、创建数据库
create database xlqdb;
1-3、数据类型
-- 在开发的过程中,不建议使用的,因为这两种类型在存储方式上是区别其他基础类型的
char(10) 定长的 'xlq '
varchar(10) 变长的 'xlq'
blob 二进制
text 字符串
1-4、创建表
1、得用语句说明使用哪个数据库: use xlqdb;
2、写创建数据库表的语句:create table table_name(列名, 类型);
create table demo_tbl(<br> demo_id INT AUTO_INCREMENT,<br> demo_title varchar(100) NOT NULL,<br> demo_desc varchar(400),<br> submission_date date,<br> primary key(demo_id) -- 建立一个主键索引<br> ) ENGINE = InnoDB default charset = utf8;
1-5、删除表
drop table table_name;
drop table xlqdb;
2、存储过程
2-0、前提概要
简介:MySql 5.0 以后才出现的,触发器、事件。存储过程是一段编译过后的SQL语句
优点:
1、有助于提高应用程序的性能,直接放在缓存
2、有助于减少应用程序与数据库服务器之间的通信,而存储只需要发送名字和参数
3、可重用、透明的,与编程语言没有关系
4、存储过程是安全的,存储过程是可能通过授权才能调用
缺点
1、加大连接的内存,CPU的使用率会增加
2、基于存储过程开发业务逻辑比较复杂
3、不能调试
4、不能跨库,不能迁移
delimiter $$<br> create procedure pro_test_1()<br> begin<br> select 'Hello MySql'; -- 写SQL语句<br> end $$<br> call pro_test_1();<br>delimiter ;
2-1、创建存储过程
delimiter $$<br> create procedure pro_test_1()<br> begin<br> select 'Hello MySql'; -- 写SQL语句<br> end $$<br>
2-2、使用存储过程
call pro_test_1();<br> delimiter ;
2-3、查看存储过程
-- 查询指定数据库的一个procedure的名字
select name from mysql.proc where db = 'xlqdb';
-- 查询存储过程的状态信息
show procedure status;
查到了所有数据库的的存储过程的状态信息
-- 查看某个存储过程的定义
show create procedure xlqdb.pro_test_1 ;-- 命令行
2-4、删除存储过程
drop procedure pro_test_1;
3、存储过程的语法结构
变量
赋值(有两种方式)
set 变量名 = 值;
delimiter $$<br> create procedure pro_test_3()<br> begin<br> -- 定义一个局部变量<br> declare num int default 0;<br> set num = 20; -- set 赋值方式<br> select num + 20;<br> end $$<br> delimiter ;<br> call pro_test_3();
select 列名 into 变量名
delimiter $$<br> create procedure pro_test_4()<br> begin<br> -- 定义两个局部变量<br> declare var_demo_title varchar(100) default '';<br> declare var_demo_desc varchar(100) default '';<br> select t.demo_title, t.demo_desc into var_demo_title, var_demo_desc from demo_tbl t where demo_id = 1;<br> select concat(var_demo_title, '-', var_demo_desc);<br> -- select var_demo_title, '-', var_demo_desc;<br> end $$<br> delimiter ;<br> call pro_test_4();
select concat(var_demo_title, '-', var_demo_desc);<br>
子主题
select var_demo_title, '-', var_demo_desc;
子主题
局部变量
声明((通过 declare 进行声明))
在 begin end 代码块中有效
delimiter $$<br> create procedure pro_test_2()<br> begin<br> -- 定义一个局部变量<br> declare num int default 0;<br> select num + 5;<br> end $$<br> delimiter ;(与下面的语句在上在下都可以)<br> call pro_test_2();
用户变量(不需要进行声明 @变量名)
set @age = 19;<br> select @age * 10;<br><br> -- 使用 select 使用用户变量 := 对变量赋值 <br><br> select @name := 'xlq';<br> select concat(@name, '-', 'Hello');
好像是即刻显示的临时变量?(不懂)
会话变量(@@变量名)
show session VARIABLES;<br> select @@session.unique_checks;<br><br> set @@session.unique_checks = 0;<br><br> select @@session.unique_checks;
实验了重复运行这条语句,会储存你的历史值
全局变量(整个数据库的配置文件,数据库必须重启)
show global variables like '%char%'
参数
IN
delimiter $$<br> create procedure sp_param_1(in age int)<br> begin<br> set @user_age = age;<br> set @user_age = @user_age + 10;<br> select @user_age;<br> end $$<br> <br> delimiter ;<br> call sp_param_1(10);<br> select @user_age;
有两个结果(一样的)
子主题
OUT
delimiter $$<br> create procedure sp_param_2(in id int, out demo_title varchar(100))<br> begin<br> select t.demo_title into demo_title from demo_tbl t where demo_id = id;<br> end $$<br> <br> delimiter ;<br> -- 测试<br> set @demo_title = '';<br> call sp_param_2(2, @demo_title);<br> select @demo_title;
代码分析分析地我头晕晕的
INOUT
delimiter $$<br> create procedure sp_param_3(inout name varchar(100))<br> begin<br> set name = concat('Hello-', name);<br> end $$<br> <br> delimiter ;<br> set @user_name = 'xieliqing'; <br> call sp_param_3(@user_name);<br> select @user_name;
改变变量@user_name
子主题
修改SQL解释的结束标记
delimiter ;<br>drop procedure if exists pro_demo
-- 计算 a + b, 结果通过 c 返回<br>create procedure pro_demo(in a int, in b int, out c int)<br>begin<br> declare var_a int;<br> declare var_b int;<br> set var_a = a;<br> set var_b = b;<br> set c = var_a + var_b;<br>end $$<br><br>delimiter ;<br>call pro_demo(100, 200, @c);<br>select @c;<br>drop procedure if exists pro_demo;
似乎是方便后面操作,万一重复了就不好了
因为我们是做实验,删除了就可以重复操作,在最后的时候,不会被卡
选择结构
if
delimiter $$<br>create procedure pro_demo()<br>begin<br> declare result varchar(32) default '';<br> if timestampdiff(year, '2000-01-01', now()) > 40 then<br> set result = '元老';<br> elseif timestampdiff(year, '2000-01-01', now()) > 30 then<br> set result = '老司机';<br> else<br> set result = '小萌新'; <br> end if;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;<br>
timestampdiff(unit, exp1, exp2) MySQL的时间差函数
case
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo()<br>begin<br> declare result varchar(32) default '';<br> declare message varchar(32) default '';<br> case<br> when timestampdiff(year, '1900-01-01', now()) > 40 then<br> set result = 'yuan lao';<br> set message = 'old grad';<br> when timestampdiff(year, '1900-01-01', now()) > 30 then<br> set result = 'old car driver';<br> set message = 'middle';<br> else<br> set result = 'new one';<br> set message = 'frist';<br> end case;<br> select concat(result, ':', message);<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo(in score int)<br>begin<br> declare result varchar(32);<br> case score<br> when 90 then<br> set result = 'good';<br> when 50 then<br> set result = 'fail';<br> else<br> set result = 'just so so '; <br> end case;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo(90);<br>drop procedure if exists pro_demo;
循环结构
loop leave 示例
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo()<br>begin<br> -- 声明变量<br> declare result varchar(100) default '1';<br> declare i int default 2; <br> demo_loop:<br> loop<br> if i >= 11 then<br> leave demo_loop;<br> end if;<br> set result = concat(result, ',', i);<br> set i = i + 1;<br> end loop demo_loop;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
loop iterate 示例
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo()<br>begin<br> -- 声明变量<br> declare result varchar(100) default '1';<br> declare i int default 2; <br> demo_loop:<br> loop <br> set result = concat(result, ',', i);<br> set i = i + 1;<br> if i <= 10 then<br> iterate demo_loop;<br> end if;<br> leave demo_loop; -- 退出<br> end loop demo_loop;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
repeat 示例
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo()<br>begin<br> -- 声明变量<br> declare result varchar(100) default '1';<br> declare i int default 2; <br> demo_repeat:<br> repeat<br> set result = concat(result, ',', i);<br> set i = i + 1;<br> until i >= 11 end repeat demo_repeat;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
while 循环结构
delimiter $$<br>drop procedure if exists pro_demo $$<br>create procedure pro_demo()<br>begin<br> -- 声明变量<br> declare result varchar(100) default '1';<br> declare i int default 2;<br> demo_while:<br> while i <= 10 do<br> set result = concat(result, ',', i);<br> set i = i + 1;<br> end while demo_while;<br> select result;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
课程小作业
请打印出 100 ~ 999 之间所有的回文数,如:101, 212, 999
delimiter $$<br>drop procedure if exists pro_demo $$<br>drop table if exists demo_data $$<br>create table demo_data(<br> id int auto_increment,<br> info int,<br> PRIMARY KEY(id)<br>) ENGINE=INNODB DEFAULT CHARSET = utf8 $$<br>create procedure pro_demo()<br>begin<br> declare i int default 100;<br> declare a int; -- 百位数<br> declare b int; -- 个位数 <br> demo_while:<br> while i <= 999 do<br> set a = floor(i / 100);<br> set b = i % 10;<br> if a = b then<br> insert into demo_data (info) values (i);<br> end if;<br> set i = i + 1;<br> end while demo_while;<br>end $$<br>delimiter ;<br>call pro_demo();<br>select * from demo_data;<br>drop procedure if exists pro_demo;<br>drop table if exists demo_data;
4.补充知识
游标
作用
1)类似于 Java 当中的 ResultSet<br>
2)为了处理数据集当中的行,一次性只能处理一行
需要严格按顺序创建,打开,关闭游标
语法
创建
declare 游标名字 cursor for SQL语句(已经确定了所选择的列)
打开游标
open 游标名字
从游标中获取数据
fetch 游标名字 into 变量1,.....
关闭游标
close 游标名字
示例
先创建一张表
actor
变量
first_name
last_name
actor_id
运行
delimiter $$<br>drop procedure if exists pro_demo $$<br><br>create procedure pro_demo()<br>begin <br> declare var_first_name varchar(100);<br> declare var_last_name varchar(100);<br> -- 一定在最前面声明游标结束的标记<br> declare flag int default 1; -- 有数据<br> <br> -- 声明游标<br> declare cursor_actor cursor for<br> select first_name, last_name from actor where actor_id <= 5;<br> <br> -- 使用 handler 来决定什么时候结束游标 NOT FOUND<br> declare CONTINUE HANDLER for 1329 set flag = 0;<br> <br> -- 打开游标<br> open cursor_actor;<br> <br> demo_loop:<br> loop<br> -- 从游标中获取数据<br> fetch cursor_actor into var_first_name, var_last_name;<br> if flag = 1 then<br> select var_first_name, var_last_name;<br> else<br> leave demo_loop;<br> end if;<br> end loop demo_loop;<br>end $$<br>delimiter ;<br>call pro_demo();<br>drop procedure if exists pro_demo;
5.课后作业
(1)写一个存储过程,打印水仙花数
-- 水仙花数<br>delimiter $$<br>drop procedure if exists pro_demo $$<br>drop table if exists demo_data $$<br>-- 创建临时数据表:存放水仙数<br>create table demo_data(id int, info int) $$<br>create procedure pro_demo()<br>begin<br> -- 100 ~ 999<br> declare i int default 100;<br> declare a int default 0; -- 百位<br> declare b int default 0; -- 十位<br> declare c int default 0; -- 个位<br> declare id int default 1; -- 水仙花数的个数 <br> demo_while:<br> while i < 1000 do<br> set a = floor(i / 100);<br> set b = floor(i / 10) % 10;<br> set c = i % 10;<br> if i = a*a*a + b*b*b + c*c*c then<br> insert into demo_data(id, info) value (id, i);<br> set id = id + 1;<br> end if; <br> set i = i + 1;<br> end while demo_while; <br>end $$<br>delimiter ;<br>call pro_demo();<br>select * from demo_data;<br>drop procedure if exists pro_demo $$<br>drop table if exists demo_data $$
水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
(2)写一个存储过程,要求有两个参数,一个IN(n),一个OUNT(result)<br> 请计算 1+...+n的结果,并通过参数 result 返回
delimiter $$<br>drop procedure if exists p2 $$<br>create procedure p2(in n int,out total int)<br><br>begin<br>set total=0;<br>declare num int default 0;<br><br>do_while:<br>while num < n do<br>set num=num+1;<br>set total=total+num;<br>end while;<br>end$$<br><br>delimiter ;<br>call p2(10,@sumq);<br>select @sumq;
0 条评论
下一页