一:变量
(1)分类:
- 系统变量:
- 全局变量
- 会话变量
- 自定义变量:
- 用户变量
- 局部变量
(2)系统变量
#一:系统变量/*说明:变量由系统提供,不是用户定义,属于服务器层面。注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session。全局变量的作用域:服务器每次启动将为所有的全局变量赋初始值,针对所有的会话(连接)有效,但不能跨重启。会话变量的作用域:仅仅针对于当前会话(连接)有效。*/#1.查看所有的系统变量#(1).查看所有的全局变量SHOW GLOBAL VARIABLES;#(2).查看所有的会话变量SHOW SESSION VARIABLES;#2.查看满足条件的部分系统变量SHOW GLOBAL VARIABLES LIKE '%char%';#3.查看指定的某个系统变量的值/*语法:SELECT @@global|【session】.系统变量名;例如:SELECT @@global.character_set_system;*/#4.为某个系统变量赋值/*语法一:set global|【session】系统变量名=值;语法二:set @@global|【session】.系统变量名=值;*/
(3)自定义变量
```sql二:自定义变量
/ 说明:变量是用户自定义的,不是系统给的。 使用步骤: 声明 赋值 使用(查看、比较、运算等) /
1.用户变量
/ 作用域:针对于当前会话(连接)有效,同于会话变量的作用域 可以应用在任何地方,也就是begin end里面或外面。 / / (1)声明并初始化 set @用户变量名=值; set @用户变量名:=值; select @用户变量名:=值; (2)赋值(更新用户变量的值) 方式一:通过set或select SET @用户变量名=值; SET @用户变量名:=值; SELECT @用户变量名:=值; 方式二:通过SELECT into select 字段 into @变量名 from 表; (3)使用(查看用户变量的值) select @用户变量名; /
2.局部变量
/ 作用域:仅仅在定义它的begin end中有效。 应用在begin end中的第一句话!!! / / 1.声明 declare 变量名 类型; declare 变量名 类型 default 值; 2.赋值 方式一:通过set或select SET 局部变量名=值; SET 局部变量名:=值; SELECT @局部变量名:=值; 方式二:通过SELECT into select 字段 into 局部变量名 from 表; 3.使用 select 局部变量名; /
案例:声明两个变量并赋初始值,求和,打印
1.用户变量
SET @m=1; SET @n=2; SET @sum=@m+@n; SELECT @sum;
<a name="4gO4O"></a>#### 用户变量和局部变量的比较:| | 作用域 | 定义和使用的位置 | 语法 || --- | --- | --- | --- || 用户变量 | 当前会话 | 会话中的任何地方 | 必须加@符号,不用限定类型 || 局部变量 | begin end 中 | 只能在begin end中,且为第一句话 | 一般不用加@符号,需要限定类型 |<a name="J55c2"></a>## 二:存储过程<a name="csC6M"></a>### (1)梗概```sql#存储过程和函数/*存储过程和函数:类似于java中的方法好处:1.提高代码的重用性2.简化操作*/#存储过程/*一组预先编译好的SQL语句的集合,理解成批处理语句好处:1.提高代码的重用性2.简化操作3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率*/#一:创建存储过程/*create procedure 存储过程名(参数列表)begin存储过程体(一组合法的SQL语句)end注意:1.参数列表包含三部分参数模式 参数名 参数类型举例:in stuname varchar(20)参数模式:in:该参数可以作为输入,也就是该参数需要调用方传入值。out:该参数可以作为输出,也就是该参数可以作为返回值。inout:该参数既可以作为输入又可以作为输出,也就是该参数既可以传入值又可以返回值。2.如果存储过程体仅仅只有一句话,begin end可以省略。存储过程体中的每条SQL语句的结尾要求必须加分号。存储过程的结尾可以使用delimiter重新设置。语法:delimiter 结束标记例如:delimiter $*/#二:调用存储过程/*语法:call 存储过程名(实参列表);*/
(2)空参的存储过程
#1.空参的存储过程
#案例:插入到admin表中五条记录
#(1)创建
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO `admin`(username,`password`)
VALUES('join','00000'),
('zjl','11111'),
('fws','22222'),
('zzf','33333'),
('lh','44444');
END $
#(2)调用
CALL myp1() $
(3)带in模式的存储过程
#2.带in模式参数的存储过程
#案例:创建存储过程实现,根据女神名,查询对应的男神信息
#(1)创建
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b
ON bo.id=b.boyfriend_id
WHERE b.name=beautyName;
END $
#(2)调用
CALL myp2('周芷若') $
(4)带out模式的存储过程
#3.带out模式参数的存储过程
#案例:创建存储过程实现,根据女神名,返回对应的男神名
#(1)创建
CREATE PROCEDURE myp3(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 $
#(2)调用
CALL myp3('周芷若',@bName) $
SELECT @bName $ #查看返回结果
#案例二:创建存储过程实现,根据女神名,返回对应的男神名和男神魅力值
#(1)创建
CREATE PROCEDURE myp4(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
SELECT bo.boyName,bo.userCP INTO boyName,userCP
FROM boys bo
INNER JOIN beauty b
ON bo.id=b.boyfriend_id
WHERE b.name=beautyName;
END $
#(2)调用
CALL myp4('小昭',@bName,@usercp) $
SELECT @bName,@usercp $ #查看返回结果
(5)带inout模式的存储过程
#4.带inout模式的存储过程
#案例:传入a和b两个值,最终a和b都翻倍并返回。
#(1)创建
CREATE PROCEDURE myp5(INOUT a INT,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
#(2)调用
SET @m=10 $
SET @n=20 $
CALL myp5(@m,@n) $
SELECT @m,@n; # 20,40
(6)存储过程的删除和查看
#存储过程的删除
/*
语法:
drop procedure 存储过程名; #存储过程名无括号
注意:存储过程名一次只能删除一个。
*/
#查看存储过程的信息
/*
语法:
show create procedure 存储过程名; #存储过程名无括号
*/
SHOW CREATE PROCEDURE myp1;
三:函数
(1)梗概
#函数
/*
一组预先编译好的SQL语句的集合,理解成批处理语句
好处:
1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
与存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回。适合做批量插入、批量更新。
函数:有且仅有1个返回。适合做处理数据后返回一个结果。
*/
/*
一:创建语法:
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
注意:
1.参数列表包含两部分:参数名 参数类型
2.函数体:肯定会有return语句,如果没有会报错。如果return语句没有放在函数体的最后也不会报错,但不建议。
3.和存储过程一样,如果函数体只有一句话的话,则可以省略begin end.
4.使用delimiter语句设置结束标记。
二:调用语法:
select 函数名(参数列表)
*/
(2)无参有返回函数
#1.无参有返回
#案例:返回公司的员工个数
#(1)创建
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0; #定义局部变量
SELECT COUNT(*) INTO c #为变量赋值
FROM employees;
RETURN c;
END $
#(2)调用
SELECT myf1() $
(3)有参有返回函数
#2.有参有返回
#案例:根据员工名,返回他的工资
#(1)创建
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 $
#(2)调用
SELECT myf2('K_ing') $
(4)函数的查看和删除
#查看函数
/*
语法:
show create function 函数名; #此时的函数名无括号
*/
SHOW CREATE FUNCTION myf1;
#删除函数
/*
语法:
drop function 函数名; #此时的函数名无括号
*/
DROP FUNCTION myf1;
