存储过程
- 基本过程:
- 定义变量`
SET @studentNo = 2;
SET @loginPwd = '111111';
SET @studentName = '测试名字';
SET @sex = '女';
SET @gradeId = 7;
SET @phone = '18391234541';
SET @address = 'xxxxxx';
- 创建存储过程
CREATE PROCEDURE insertStudent(in studentNo int(4),loginPwd varchar(20),studentName varchar(50),
sex char(2),gradeId int(4),phone varchar(50),address varchar (255))
BEGIN
insert into student(studentNo,loginPwd,studentName,sex,gradeId,phone,address)
values(studentNo,loginPwd,studentName,sex,gradeId,phone,address);
SELECT studentNo;
END
创建过程外:
变量声明并赋值
SELECT 'HELLO ZHANGSAN!' INTO @hello;
查询变量内容
SELECT @hello;
创建过程中:
变量声明并赋值
DECLARE str VARCHAR(10);
SELECT 'HELLO ZHANGSAN!' INTO str;
set str = 'HELLO ZHANGSAN!';
- 执行存储过程
CALL insertStudent(@studentNo,@loginPwd,@studentName,@sex,@gradeId,@phone,@address);
- 删除存储过程
drop PROCEDURE insertstudent;
IN OUT INOUT
- IN 输入参数 表示改参数的值 必须在调用存储过程时指定,在存储过程中改参数的值不能被返回
-- IN
CREATE PROCEDURE get_in(in stuNo int(4))
BEGIN
SELECT stuNo; -- 1: 存储过程输入了参数stuNo
SET stuNo=1011; -- 1011:存储过程中 改参数的值
SELECT stuNo;
END
SET @stuNo = 1;
CALL get_in(@stuNo); -- 调用存储过程时 指定输入参数
-- 存储过程 没有输出参数 stuNo仍为1
select @stuNo; -- 1:存储过程中改参数的值 不能被返回
- OUT 输出参数 该值在存储过程中,内部被改变并可以返回
-- OUT
CREATE PROCEDURE get_out(out stuNo int(4))
BEGIN
SELECT stuNo; -- null:没有输入参数 没有初值,默认为null
SET stuNo=1011;
SELECT stuNo;
END
SET @stuNo=1;
CALL get_out(@stuNo); -- 调用必须有形参@x
SELECT @stuNo+1;-- 1012(存储过程输出了参数stuNo1011)
- INOUT 输入输出参数,调用是指定,并且可以被改变和返回
-- INOUT
CREATE PROCEDURE demo_in_out(INOUT p_inout INT)
BEGIN
SELECT p_inout; -- 1 :存储过程输入了参数stuNo
SET p_inout =2; -- 2
SELECT p_inout;
END
SET @stuNo=1;
CALL demo_in_out(@stuNo); -- stuNo为1 (存储过程输出了参数stuNo)
-- 存储过程 输出了参数 stuNo为2
SELECT @stuNo+1; -- 3:
存储过程 使用if
if xx (无分号)
then xx;
else xx;
end if;
CREATE PROCEDURE addSex(in sex int(1))
BEGIN
DECLARE str VARCHAR(10); -- DECLARE:声明一个变量
if sex = 0 -- IF语句开始
THEN set str = '男';
ELSE set str = '女';
end IF ; -- IF语句结束
select str;
END
set @sex = 0;
CALL addSex(@sex);
if xx(无分号)
then xx;
elseif xx (无分号)
then xx;
else xx;
end if;
CREATE PROCEDURE adSex(in sex int(1))
BEGIN
DECLARE str VARCHAR(10); -- DECLARE:声明一个变量
if sex = 0 -- IF语句开始
THEN set str = '男';
ELSEIF sex = 1
then set str = '女';
else set str = '未知性别';
end IF ; -- IF语句结束
select str;
END
set @sex = 3;
CALL adSex(@sex);
存储过程 使用case
CASE x (无分号)
WHEN x THEN xx;
WHEN x THEN xx;
END CASE;
CREATE PROCEDURE addSex1(in sex int(1))
BEGIN
DECLARE str VARCHAR(10);
CASE sex -- 开始case
WHEN 0 THEN SET str = '男';
WHEN 1 THEN SET str = '女';
when 2 then set str = '未知性别';
END CASE; -- 结束case
select str;
END
set @sex = 2;
CALL addSex1(@sex);
存储过程 使用loop 循环
既没有输入参数 也没有输出参数 的存储过程addSex2()
LOOP名:LOOP(无分号)
xx;
xx;
END LOOP;
CREATE PROCEDURE addSex2()
BEGIN
DECLARE var int;
set var = 0;
LOOP_LABLE:LOOP -- LOOP开始循环(起名为 LOOP_LABLE)
INSERT INTO table1 VALUES('循'); -- 循环体
SET var = var +1;
IF var >10 THEN
LEAVE LOOP_LABLE; -- LOOP离开循环 (语法 LEAVE 循环名称;)
END IF;
END LOOP; -- LOOP结束循环
END
CALL addSex2();
mysql执行流程
MySQL 索引
索引的作用
确保数据的唯一性,
快速的定位特定数据,
提高查询的速度(使用分组和排序进行数据检索时 可以显著的减少时间)
索引的缺点
insert update delete时,降低表的更新速度
《 保存内容,保存索引文件
什么时候建索引
- 不必建索引
- 某列有许多重复
- 对于很小的表
- 需要建索引
- 经常查的列
- 但不经常改变的列
有哪些
- 主键索引
- 最 常见的索引 类型
- 确保数据记录的唯一性,确定特定的数据记录在数据库中的位置
- 主键索引只能有一个
- 唯一索引
- 避免同一个表中某数据列中值重复
- 唯一索引可以有多个
- 常规索引
- 快速的定位到特定数据
- 全文索引
- 快速的定位特定数据
- 只能用于MyISAM类型的表,只能用于 CHAR VARCHAR TEXT数据类型 适合大型数据集。
怎样添加
ALTER TABLE ‘表名’ ADD INDEX 索引名ind
(studentNo
,subjectNo
)
ALTER TABLE cardinfo ADD INDEX (IsReportLoss
)
索引的底层数据结构
B-TREE B+TREE HASH等
– B树特征
– B+数 从根节点到叶子结点,逐级查找
HASH
– 是采用一定的哈希算法,把键换算成新的哈希值
– 只需要一次哈希算法结合立刻定位到响应的位置,速度非常快 不支持范围查询 比如 WHERE price > 100