说明:变量由系统提供,不是用户定义,属于服务器层面程序员
#使用的语法 #1.查看全部的系统变量 SHOW GLOBAL VARIABLES#全局变量 SHOW 【SESSION】 VARIABLES#会话变量 #2.查看知足条件的部分系统变量 SHOW GLOBAL [SESSION] VARIABLES LIKE '%char%'; #3.查看指定的某个系统变量的值 SELECT @@global.系统变量名; SELECT @@session.系统变量名;#默认session #4.为某个系统变量赋值 #方式一 SET GLOBAL 系统变量值=值; SET 【SESSION】 系统变量值=值; #方式二 SET @@global.系统变量名=值; SET @@【session】.系统变量名=值; #注意:若是是全局级别,则须要加global,若是是会话级别,则须要加SESSION,若是不写,则默认SESSION。
#查看全部的全局变量 SHOW GLOBAL VARIABLES; #查看部分的全局变量 SHOW GLOBAL VARIABLES LIKE '%char%'; #查看指定的全局变量的值 SELECT @@global.autocommit; #为某个指定的全局变量赋值 SET @@global.autocommit=0;
做用域:服务器每次启动将为全部的全局变量赋初始值,针对于全部的会话(链接)有效。不能跨重启。sql
#查看全部的全局变量 SHOW 【SESSION】 VARIABLES; #查看部分的全局变量 SHOW 【SESSION】 VARIABLES LIKE '%char%'; #查看指定的全局变量的值 SELECT @@session.tx_isolation; #为某个指定的全局变量赋值 SET @@session.tx_isolation='read-uncommitted';
做用域:仅仅针对于当前会话(链接)有效数据库
说明:变量是用户自定义的,不是由系统制定的服务器
#使用步骤 声明 赋值 使用(查看、比较、运算等)
#(1)声明并初始化 SET @用户变量名=值; SET @用户变量名:=值; SELECT @用户变量名:=值;#用select只能用:= #(2)赋值(更新用户变量的值) #方式一:经过SET或SELECT SET @用户变量名=值; SET @用户变量名:=值; SELECT @用户变量名:=值;#用select只能用:= #案例1:声明并初始化 set @name='john'; set @name=100; #方式二:经过SELECT INTO SELECT 字段 INTO @变量名 FROM 表; #案例2:赋值 SELECT COUNT(*) INTO @count FROM employees; #(3)使用(查看用户变量的值) SELECT @用户变量名;
做用域:仅仅针对于当前会话(链接)有效,同于会话变量的做用域。
应用在任何地方,也便是begin end里面或者外面。session
#(1)声明 DECLARE 变量名 类型 DEFAULT 值; #(2)赋值 #方式一:经过SET或SELECT SET 局部变量名=值; SET局部变量名:=值; SELECT @局部变量名:=值;#用select只能用:= #方式二:经过SELECT INTO SELECT 字段 INTO 局部变量名 FROM 表; #(3)使用 SELECT 局部变量名;
做用域:仅仅在定义它的begin end中有效
应用在begin end 中的第一句话;函数
#案例1:声明两个变量并赋初始值,求和,并打印 #用户变量 set @m=1; SET @n=2; SET @sum=@m+@n; select @sum; #局部变量 DECLARE m INT DEFAULT 1; DECLARE n INT DEFAULT 2; DECLARE SUM INT; SET SUM=m+n; SELECT SUM;#会报错,由于不在begin end中
一组通过预先编译的sql语句的集合,理解为批处理语句code
一、提升了sql语句的重用性,减小了开发程序员的压力 二、简化操做 三、减小了编译次数而且减小了和数据库服务器的链接次数,提升了效率
一、无返回无参 二、仅仅带in类型,无返回有参 三、仅仅带out类型,有返回无参 四、既带in又带out,有返回有参 五、带inout,有返回有参 注意:in、out、inout均可以在一个存储过程当中带多个
create procedure 存储过程名(in|out|inout 参数名 参数类型,...)#也叫参数列表 begin 存储过程体(一组合法的SQL语句) end
一、存储过程体中的每条SQL语句的结尾要求必须加分号。存储过程的结尾须要设置新的结束标记,delimiter 新的结束标记 示例: delimiter $ #这是设置结束标记 CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...) BEGIN sql语句1; sql语句2; END $ 二、存储过程体中能够有多条sql语句,若是仅仅一条sql语句,则能够省略begin end 三、参数前面的符号的意思 in:该参数只能做为输入 (该参数不能作返回值)也就是该参数须要调用方传入值 out:该参数只能做为输出(该参数只能作返回值)也就是该参数能够做为返回值 inout:既能作输入又能作输出,也就是该参数既须要传入值,又能够返回值 四、 参数列表包含三部分:参数模式、参数名、参数类型 举例:IN stuname VARCHAR(20) 参数模式:IN、OUT、INOUT
call 存储过程名(实参列表)
#案例1:插入到admin表中五条记录 DELIMITER $ CREATE PROCEDURE myp1() BEGIN INSERT INTO admin(username,PASSWORD) VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000'); END $ #在cmd开启MySQL里使用 CALL myp1()$
#案例1:建立存储过程实现:根据女神名,查询对应的男神信息 DELIMITER $ create procedure myp2(IN beautyName varchar(20))#默认是IN,能够省略 begin select bo.* from boys bo right join beauty b on bo.id=b.boyfriend_id where b.name=beautyName; END $ call myp2('小昭')$ #案例2:建立存储过程实现,用户是否登录成功 DELIMITER $ create procedure myp5(in username varchar(20),in password varchar(20)) begin DECLARE result int default 0;#声明并初始化 select count(*) into result #赋值 from admin where admin.username=username and admin.password=password; select if(result>0,'成功','失败');#使用 end $ call myp5('张飞','8888')$ #在cmd开启MySQL里使用
#案例1:根据女神名,返回对应的男神名 USE girls; DELIMITER $ CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGIN SELECT bo.boyName INTO boyName FROM boys bo INNER JOIN beauty b ON bo.id=b.boyfriend_id WHERE b.name=beautyName; END $ CALL myp5('小昭',@bName)$ SELECT @bName$ #案例2:根据女神名,返回对应的男神名和男神魅力值 DELIMITER $ CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) BEGIN SELECT boys.boyname ,boys.usercp INTO boyname,usercp FROM boys RIGHT JOIN beauty b ON b.boyfriend_id = boys.id WHERE b.name=beautyName ; END $ #调用 CALL myp7('小昭',@name,@cp)$ SELECT @name,@cp$
#案例1:传入a和b两个值,最终a和b都翻倍并返回 DELIMITER $ CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT) BEGIN SET a=a*2; SET b=b*2; END $ SET @m=10$ SET @n=20$ CALL myp8(@m,@n)$ SELECT @m,@n$
#案例1:建立存储过程或函数实现传入用户名和密码,插入到admin表中 DELIMITER $ CREATE PROCEDURE test_pro1(IN username VARCHAR(20),loginpwd VARCHAR(20)) BEGIN INSERT INTO admin(admin.username,PASSWORD) VALUE(username,loginpwd); END $ CALL test_pro1('admin','0000')$ SELECT * FROM admin$ #案例2:建立存储过程或函数实现传入女神编号,返回女神名称和女神电话 DELIMITER $ CREATE PROCEDURE test_pro2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20)) BEGIN SELECT b.name,b.phone INTO NAME,phone FROM beauty b WHERE b.id=id; END$ CALL test_pro2(1,@m,@n)$ SELECT @m,@n$ #案例3:建立存储过程或函数实现传入两个女神生日,返回大小 CREATE PROCEDURE test_pro3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT) BEGIN SELECT DATEDIFF (birth1,birth2) INTO result; END $ CALL test_pro3('1998-1-1',NOW(),@result)$ SELECT @result$ #案例4:建立存储过程或函数实现传入一个日期,格式化成xx年xx月xx日并返回 DELIMITER $ CREATE PROCEDURE test_pro4(IN mydate DATETIME ,OUT strdate VARCHAR(50)) BEGIN SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strdate; END $ CALL test_pro4(NOW(),@str)$ SELECT @str$ #案例5:建立存储过程或函数实现传入女生名称,返回:女神 AND 男神 格式的字符串 #如 传入:小昭,返回:小昭 AND 张无忌 DELIMITER $ CREATE PROCEDURE test_pro5(IN beautyname VARCHAR(20) ,OUT str VARCHAR(50)) BEGIN SELECT CONCAT(beautyname,'and' ,IFNULL(boyname,'null') )INTO str FROM boys bo RIGHT JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.name=beautyname; END $ CALL test_pro5('柳岩',@str)$ SELECT @str$ #案例6:建立存储过程或函数,根据传入的条目数和起始索引,查询beauty表的记录 DELIMITER $ CREATE PROCEDURE test_pro6(IN size INT ,IN startindex INT) BEGIN SELECT * FROM beauty LIMIT startindex,size; END $ CALL test_pro6(3,5)$
#语法 DROP PROCEDURE 存储过程名 #一次只能删除一个 ##查看存储过程的信息 SHOW CREATE PROCEDURE 存储过程名;
一组预先编译好的SQL语句的集合,理解成批处理语句索引
一、提升了sql语句的重用性,减小了开发程序员的压力 二、简化操做 三、减小了编译次数而且减小了和数据库服务器的链接次数,提升了效率
学过的函数:LENGTH、SUBSTR、CONCAT等作用域
#语法 CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型 BEGIN 函数体 END
SELECT 函数名(实参列表)
#案例1:返回公司的员工个数 set global log_bin_trust_function_creators=1;#若是语法没问题仍是报错,加上这条语句 DELIMITER $ CREATE FUNCTION myf1() RETURNS INT BEGIN DECLARE c INT DEFAULT 0; #定义变量 SELECT COUNT(*) INTO c #赋值 FROM employees; RETURN c; END$ SELECT myf1()$ SELECT myf1()$
#案例1:根据员工名,返回它的工资(题外话:笑死,老师用的是‘它’) DELIMITER $ create function myf2(empname varchar(20)) returns double begin set @sal=0;#定义一个用户变量 select salary into @sal #赋值 from employees where last_name=empname; return @sal; end$ select myf2('kochhar')$ #案例2:根据部门名,返回该部门的平均工资 DELIMITER $ CREATE FUNCTION myf3(deptname VARCHAR(20)) RETURNS DOUBLE #double是浮点型 BEGIN DECLARE sal DOUBLE;#定义一个局部变量,double是浮点型 SELECT AVG(salary)INTO sal #赋值 FROM employees e JOIN departments d ON e.department_id=d.department_id WHERE d.department_name=deptname; RETURN sal; END$ SELECT myf3('IT')$
SHOW CREATE FUNCTION myf3;
DROP FUNCTION myf3;
#案例1:建立函数,实现传入两个float,返回两者之和。 DELIMITER $ CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT #不要忘记是returns不是return BEGIN DECLARE SUM FLOAT DEFAULT 0; SET SUM=num1+num2; RETURN SUM; END$ SELECT test_fun1(1,2)$