Java二十六篇:数据库编程
视图
概念
将有关联的表创建成一张视图表,生成的视图表是一张虚拟表,只能完成数据的查询和修改,不能完成数据的删除和新增。
优缺点:
优点:可以将有关联的表,创建成视图,供下一次查询的时候,可以当成单表查询,提高程序员编写代码的速度。
缺点:
1、只能做查询和修改操作,不能做删除和新增操作
2、视图并不是越多越好,因为视图一旦创建,要求原数据库表中的字段不能做任何的修改,如果做了修改,那么视图崩溃。
变量和控制语句
变量
系统变量
定义:在数据库管理系统里面,在设计的时候,就已经规定好了的变量,一般用来控制整个数据库管理系 统, 比如mysql数据库管理系统。
系统变量的语法:@@变量名
查询系统变量:show variables;(查询所有的系统变量)
show variables like "%名称%"(查询部分系统变量)
会话变量(用户变量/全局变量)
程序员根据编程需要,在数据库的本次会话中创建一个变量,供下面代码使用。
会话变量语法:@变量名
添加一个会话变量:set @变量名 = 值;
查询一个会话变量:select @变量名;
每一次修改会话变量的值,必须加set关键字
局部变量
作用在部分代码片段中的变量,一般是在函数、存储过程、触发器中的变量,在begin和end代码之间存在,必须还要用declare定义声明
定义局部变量:declare 变量名 数据类型 default 值;
控制语句
分支语句
-- 第一种情况
IF 判断语句 THEN
当判断语句为真的时候,执行的代码
ENDIF;
-- 第二种情况
IF 判断语句1 THEN
当判断语句1位真的时候,执行的代码;
ELSEIF 判断语句2 THEN
当判断语句2位真的时候,执行代码;
ELSE
如果上面情况都不满足,执行的代码;
ENDIF;
-- 分支语句的嵌套
IF 判断语句 THEN
IF 判断语句 THEN
执行语句
ENDIF;
ENDIF;
循环语句
WHILE 判断语句 DO
循环的代码;
ENDWHILE;
-- 数据库中跳出循环的方法:
leave:终止循环的代码,和java中的break作用一致。
iterate:结束本次循环,继续下一次循环,和java中的continue作用一致。
当有多层循环的时候,要跳出指定层次的循环,需要使用跳出循环的标记。
-- 举例:
WHILE 判断语句1 DO
log:WHILE 判断语句2DO
WHILE 判断语句3DO
循环的代码;
IF 判断语句 THEN
leave log;
ENDIF;
ENDWHILE;
ENDWHILE;
ENDWHILE;
函数
概念:将实现特定功能的代码片段进行封装,需要使用的时候,调用函数即可,提高代码的复用性,是封装的最小体现单元。
系统函数
-- 聚合函数
count();
max();
min();
avg();
sum();
-- 其他聚合函数
now();获取当前的瞬时时间戳
year();获取字段中的年份
UUID();生成一个36位不重复的字符串,后续数据库要使用UUID生成主键。
LAST_INSERT_ID();最后一次新增数据的主键值(必须是主键自增)。
新增函数
-- 语法:
CREATEfunction 函数名(参数列表) RETURNS 返回值数据类型
BEGIN
实现特定功能的函数代码片段
END
-- 举例:计算两个数和
-- 修改数据库结束标识符
delimiter &
createfunction add1() returnsint
begin
-- 定义一个局部变量,记录两个数的和
declare res intdefault0;
set res = 10 + 20;
return res;
end &
查询函数
-- 查询语法:查询所有的函数
showfunctionstatus;
-- 使用模糊查询到程序员自定义的函数
showfunctionstatuslike"%add1%";
调用函数
-- 语法
select 函数名();
删除函数
-- 语法
dropfunction 函数名;
案例:
-- 计算1-100之间的所有能被3和7同时整除的数之和
createfunction add4() returnsint
begin
-- 定义一个局部变量,来记录两个数的和
declare res intdefault0;
-- 定义一个局部变量,来记录循环判断
declare i intdefault1;
-- 循环的代码
while i <= 100 do
if i % 3 = 0and i % 7 = 0then
set res = res + i;
endif;
set i = i + 1;
endwhile;
-- 返回值
return res;
end-- 定义一个函数,计算x的y次方。x和y的值由参数传入。
create function fun(x int,y int) returns double
begin
-- 定义一个变量,用于记录最终的结果
declare res double default 1.0;
declare i int default 0;
declare j int default 0;
-- 判断指数的大小(大于0?小于0?等于0)
if y > 0 then
while i < y do
set res = res * x;
set i = i + 1;
end while;
elseif y < 0 then
set y = y * (-1);
while j < y do
set res = res * x;
set j = j +1;
end while;
set res = 1 / res;
else
set res = 1.0;
end if;
return res;
end
存储过程
概念:和函数的概念一致,将实现特定功能的代码片段封装起来,放在一个存储过程中,需要使用的时候调用即可。关键字为:procedure
和函数的区别
1、函数存在返回值,存储过程没有返回值。
2、函数的参数,只有参数名和数据类型;存储过程参数,有参数名,数据类型,参数类型。
创建过程
-- 语法:
createprocedure 过程名称(参数列表)
begin
实现存储过程的代码片段;
end
-- 举例:
createprocedure pro1()
begin
-- 定义变量,记录两个数的和
declare res intdefault0;
-- 定义一个变量,用于判断
declare i intdefault1;
while i <= 100 do
set res = res + i;
set i = i + 1;
endwhile;
select res;
end
查询过程
-- 查询所有的存储过程
show procedure status;
-- 模糊查询存储过程
show procedure status like "%pro%";
调用过程
call 存储过程名称();
删除过程
drop procedure 存储过程名称;
参数列表
参数列表:参数类型 参数名 数据类型
重点:参数类型
in:将存储过程外面的变量可以传入到存储过程里面使用。外面的变量:会话变量。
out:可以把存储过程里面操作过的会话变量的值传到存储过程外面。
inout:既可以将存储过程外面的值传入到里面使用,也可以将里面修改过后的值,作用到存储过程外面。
案例:
-- 定义三个会话变量
set @num1 = 1;
set @num2 = 2;
set @num3 = 3;
-- 查询三个会话变量
select @num1,@num2,@num3;
-- 定义一个存储过程,三个形式参数,参数类型分别为in,out,inout
create procedure pro3(in a int,out b int,inout c int)
begin
-- 查询三个形式参数的值
select a,b,c; -- 1,2,3
-- 查询三个会话变量
select @num1,@num2,@num3; -- 1,2,3
-- 修改形式参数的值(局部变量)
set a = 10;
set b = 20;
set c = 30;
-- 查询一遍a,b,c的值
select a,b,c; -- 10,20,30
-- 查询三个会话变量
select @num1,@num2,@num3; -- 1,2,3
end
-- 调用存储过程
call pro3(@num1,@num2,@num3);
-- 再次查询会话变量
select @num1,@num2,@num3;
如果参数类型为out类型,那么在实际参数传递给形式参数的时候,形式参数将抛弃实际参数的值,先将其置为null(形式参数)
当整个存储过程执行结束之后,返回去检测每个形式参数的参数类型,如果是out或者inout,那么将形式参数修改过后的值,作用到实际参数上。
触发器
概念:封装一段代码片段(一般都是对数据的增、删、改的操作),当达到了触发器的条件的时候,自动调用并执行。不需要程序员主动用代码进行调用。
创建触发器
create trigger 触发器名称 触发时机 触发事件 on 表名 for each row
begin
封装的代码片段;
end
触发时机:after和before
触发事件:insert、update、delete
-- 创建触发器
CREATE TRIGGER tri1 AFTER INSERT ON t_order FOR EACH ROW
BEGIN
-- 修改商品表中的数据
UPDATE t_product SET p_number = p_number - new.o_number where p_id = new.p_id;
END
-- 说明:
new.o_number:刚刚新增数据中字段的数据
new.p_id:刚刚新增数据中字段的数据
查询触发器
-- 查询触发器
show triggers;
删除触发器
drop trigger 触发器名称
索引
概念:索引的作用就是增加数据库的查询效率,索引本质上就是将一个字段有顺序的生成为一个数据结构(树结构),在mysql中存在主键默认加索引。
优缺点
优点:索引会增加查询效率
缺点:会增加维护成本,主要维护成本是在新增数据、删除数据和修改数据的时候维护,所以会降低这三个操作的效率;索引的本质是数据结构,会占用一定的内存空间。
注意:索引只是一种技术,索引是存在引擎里面的,数据库管理系统可能是不一样引擎,因此数据库会因为引擎的不一样而对索引类型的支持不一样。
索引的类型
BTREE索引:B树索引(B+树),基本上大部分引擎都支持B数索引
Hash索引:只有在menory引擎才会支持该索引
Full-text索引:全文索引,一般在搜索功能里面会用到。
唯一索引:主键用的就是唯一索引
空间索引:
B树索引:多路平衡搜索树,不一定是二叉树,可以是M叉树。
举例说明一下B树的生成过程,以5叉树为例
25、19、23、21、18、27、16、13、29、28、26、31、24、17、33、15
我也知道的比较少,像这种数据结构的东西,所以我在学习Java方面的数据结构和算法,加油吧!
总结:
1、一般数据库编程中,在企业中存储过程还有些老的企业还在使用
2、索引是这里面的重中之重,学好索引你的查询效率会有所提升
优缺点
优点:索引会增加查询效率
缺点:会增加维护成本,主要维护成本是在新增数据、删除数据和修改数据的时候维护,所以会降低这三个操作的效率;索引的本质是数据结构,会占用一定的内存空间。
3、在不同的需求面前,都是先用最容易的方式实现功能等后期才优化代码、代码扩展和并发
4、技术是为需求服务的


