视图:(子查询)是从一个或多个表导出的虚拟的表,其内容由查询定义
单表视图一般用于查询和修改,会改变基本表的数据,
多表视图一般用于查询,不会改变基本表的数据。
作用:
①简化了操作,把经常使用的数据定义为视图。
②安全性,用户只能查询和修改能看到的数据。
③逻辑上的独立性,屏蔽了真实表的结构带来的影响。
view 对查询的结果做一个快捷方式,视图根据表的数据实时更新,
创建:
create view 起的名字 as 查询...
从视图中检索数据:
select * from 视图名字;
删除视图:
drop view 名字;
索引:
数据库系统满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
优点:可以大大提高MySQL的检索速度。缺点:增加了数据库的存储空间,在插入和修改数据时要花费较多的时间,
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。但过多的使用索引将会造成滥,虽然索引提高了查询速度,同时却会降低更新表的速度,
二分查找,有序数据,字符串汉字转换UNICODE 编码比较 ord()函数
创建索引:create index 名字 on 表具体的字段
删除索引:DROP INDEX [indexName] ON表具体的字段 ;
显示索引信息:SHOW INDEX FROM
唯一索引:UNIQUE INDEX indexName ON表具体的字段 ;索引列的值必须唯一,但允许有空值, unique indexName (字段)
联合唯一索引:unique indexName (字段1,字段2)两个字段的值不能完全一样
存储过程:
存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组为了完成特定功能的 SQL 语句集 , 存储在数据库中 , 经过第一次编译后再次调用不需要再次编译 , 用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个重要对象 ; 存储过程中可以包含 逻辑控制语句 和 数据操纵语句 , 它可以接受参数 , 输出参数 , 返回单个或多个结果集以及返回值 ;
存储过程就像函数一样,有名字 有参数,有语句,要把结束符改掉,否则可能会遇到结束符会语句提交,最后在替换回来,可以把常用的SQL语句写成存储过程,存储过程可以避免sql注入,(所有 MySql 变量都必须以 @ 开始)
获得最后一个ID :select LAST_INSERT_ID()
select@@identity
创建存储过程:
create procedure xxx();
调用存储过程:
call xxx();
删除存储过程:
drop procedure xxx;
例:
delimiter $$ #更改结束符
create procedure open_order(
in card_num int, #输入参数 参数3种类型in 输入 out 输出 inout 输入输出
out order_id int # 输出参数
)
begin #要做什么
insert into orders(m_num)valus(card_num); #赋值给参数
select@@identity,#系统变量,可以直接执行,代表系统刚刚插入的自增ID
end$$ ; #结束
delimiter; #改回结束符
set @oid=0; # set赋值
call open_order(10001,@oid) #调用函数,加参数,两个参数,一个参数给输入,第二个给输出
@自定义变量 set @x=xx 或查询ID中id into @x
@@系统自带的变量 一般显示系统当前的状态
最常用的@@identity
一般子查询都可以用自定义变量来拆分多条语句 但是一组值不能用变量传值 可以用游标
事务:
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为ACID特性(ACID properties)。
原子性:事务中包括的所有操作要么都做,要么都不做
一致性:事务执行的结果必须是使数据库从一个一致性状态变成另一个一致性状态
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的
持续性:也称永久性(Permanence),指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
开启事务start transaction;
提交事务commit;
回滚撤销rollback;可以设置回滚点
触发器
本质: 触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标细和更准的功能有更精复杂的数据控制能力。
定义一个触发器的语法:
delimiter $$
after insert(字段名)
on records(创建在那个表中)
from each row
begin
declare a char(8);
declare b char(10);
declare c char(10);
declare d int (定义a b c d 为全局变量)
select gno,gname,gtype,conut into a,b,c,d from goods where gno = new.gid;
if d < 100 then
insert into not_enough values(a,b,c,d)
on buplicate key update count = d;
end (红色部分为SQL语句 触发器的作用)
end if;
end $$
delimiter ;
# 增加数据(触发 触发器)
insert into records(oid,gid,count,price_s)values(6,'A0001002',1,16.0);
建表:用于描述库存不足。
create tble not_enough(
gno char(8) pyimary key,
gname char(10) ,
gtype vhar(10),
count int not null
);
增加not_enough 表中数据
set @c =97 #定义c 为变量
insrt into not_enough values('A0001002', '朗姆可乐' ,'250mL',@c); 这里增加会报错(主键冲突)。
主键冲突解决方法:on duplicate key update count =@c;