——————————————数据库
表(table):有行有列,行又叫记录,列又叫(属性)字段
在数据库中建立临时表:
Create table 表名 as select * from 表名 [查询条件];
Create table emp111 as select * from emp; -----创建的临时表不会继承原表的主外键约束,但表结构和表数据是一样的
索引(index):加快检索的速度,是优化数据库查询效率的常见方法之一
加快了数据库的检索速度,但是降低了删除、修改、插入等维护类的任务的执行速度
Create index 索引名 on 表名(列名);
删除索引:drop index 名称 on 表名(列名);
————————————————————存储过程
Mysql 5.0以后版本中才开始支持存储过程
存储过程:是一种在数据库中存储的复杂的程序,以便外部程序或其他应用程序对数据进行调用的数据库对象。
两个要点:存储在数据库中 复杂的程序
被调用
存储过程就是在数据库中编写代码,目的是为了完成特定的任务或功能的SQL的集合,
它是一个语句集,经过编写保存在数据库中,可以让指定的用户对其进行调用,提成效率。
即:是数据库中SQL层面的代码的封装和调用
优点:
- 可封装,并且隐藏复杂的商业逻辑
- 可以进行回传值,并且可以接收参数
- 可以让复杂的语句封装成简单的函数或者子程序
- 可以用在数据库效验,企业规则,内部逻辑比较复杂的业务上
缺点:
- 存储过程对数据库的依赖很大,定制化在特定的数据库上,支持的语言规范不一样
- 可移植性一般,复用率低
- 无法直接使用select指令进行运行,因为是子程序
Create procedure 过程名([in out inout] 参数名 数据类型,[in out inout]参数名 数据类型,…)
Begin;
过程体;
End;
存储过程中的参数:
Mysql中参数的定义,一共支持三种类型:in out inout
In(输入参数):表示调用者向过程传入值(可以是具体的值,也可以是变量)
Out(输出参数):表示过程向调用者传出值(可以返回多个值,传出的值只能是变量)
Inout(输入输出参数):表示调用者向过程传入值,也可表示过程向调用者传出值(值只能是变量)
建议:输入值用in,输出值用out,inout参数尽量少用
过程体:
由合法的SQL语句构成,即SQL命令集,可执行,过程体包含了过程调用执行的所有SQL语句:如DQL、DML、DDL、if-then-else等,以及申明变量
过程体的格式:以begin开始,end结束(可以嵌套)
每个嵌套块中每条命令的结束,都必须以;结束
调用:1.可以使用一个call命令通过名字对存储进行调用:
Call 存储过程的名();
2.可以供外部程序调用,比如java、pythen
修改界定符(delimiter):为//或者$$,目的是让;暂时失效,不表示语句结束
Delimiter $$
Create procedure 过程名()
Begin
过程体;
End;
$$
调用:call 过程名; call 过程名();
每调用一次存储过程,就相当于把过程体执行一次
调用的时候,没有参数的存储过程,()可加可不加
Delimiter //
Create procedure 过程名(in 参数 数据类型)
Begin
Select 参数 from 表名;
End;
//
Call 过程名(参数的值);
把查询SQL放在过程体中:
根据输入的部门编号,查询部门的员工信息
Delimiter //
Create procedure select22(in ptno int)
Begin
Select * from emp where deptno=ptno;
End;
//
Call select22(10);
如果参数名称和列名一致时,则参数会被当成整个列的情况,即使输入参数值,查询的结果始终是整个列所有的信息(即所有部门员工),参数失效;如果删除的是存储,则删除的是整个数据
DELIMITER//
CREATE PROCEDURE del_user_name(IN name1 VARCHAR(50))
BEGIN
DELETE FROM user_tab WHERE user_name=name1;
END;
CALL del_user_name('孙权');
存储过程编写思路:
前提:进入数据,保证可以正常使用存储过程要执行的数据库
- 修改mysql界定符(语句结束语):
Delimiter // 或者delimiter $$
2. 创建存储过程:
Create procedure 过程名(in/out/inout 参数 数据类型)
Begin
过程体;
End;//
3.调用:
Call 过程名(参数值)
带变量的存储过程:
变量:变量在存储过程中的使用,和编程的使用的过程类似,可以进行申明变量,用来取一类值。
用户变量:set @变量名=变量值
例:set @name=123;
Select @name;
备注:用户变量,只是针对用户的创建者可以使用,用户断开以后,用户变量就会被销毁
作用:将SQL语句查询的结果存入用户变量,方面后面使用。
DELIMITER//
CREATE PROCEDURE gc11(IN name1 VARCHAR(50),OUT num1 INT)
BEGIN
DELETE FROM biao1 WHERE bname=name1;
SELECT COUNT(*) FROM biao1 INTO num1;
SET @nums=num1;
END;
SELECT * FROM biao1;
CALL gc('周瑜',@nums); -- 把count()统计结果放在用户变量@nums这里
SELECT @nums; # 用 select 来查看验证结果
注意:不建议频繁使用用户变量,滥用用户变量会导致存储过程很难理解和管理
用户变量的特点决定的:
- 每个用户都可以创建属于自己的私有变量,称为用户变量
- 用户变量用来临时存放一些数据,一旦用户下线,变量就失效销毁
- 用户变量只能定义者使用,其他用户无权使用
局部变量:只是在存储过程中使用
定义方式:declare 变量名称 数据类型 default 0; ---defauil o表示变量默认值为0,不是所有变量值都需要默认值
例:declare aa int default 0; ---定义申明变量aa为int类型,默认值为0
Declare aa int ; ---定义aa为int类型的变量
Set aa=0; ---给变量aa赋值为0
例如:定义两个局部变量,并且赋值,将这两个局部变量的值求和
Delimiter //
Create procedure s1()
Begin
Declare aa int;
Declare bb int;
Set aa=10;
Set bb=20;
Set @cc=aa+bb;
End;
Call s1(111,222)
Select @cc;