视图
视图是一个虚拟表(非真是存在的),其本质是【根据SQL语句获取动态的数据集】用户使用是只有使用’名称’ 即可获取结果集,并可以当作表来使用。
select * from
(
select
nid,
name
from
tb1
where
nid > 2
) AS A where A. name > 'aaa';
1,创建视图
格式:create viem 视图名称 AS sql 语句
crerte vime a1 AS
select nid,
name
from
a
where
nid > 4;
2,删除视图
格式:drop viem 视图名称
drop viem v1;
3,修改视图
格式:alter viem 视图名称 as sql 语句
alter viem v1 as
select a.nid,
b.name
from
a
left join b on b.id = b.nid
left join c on a.id = c.nid
where
a.id > 2
and c.nid < 5;
4,使用视图
视图使用是可其当作表进行操作即可,因为视图是虚拟表,所以无法与真是表一样对其进行创建,更新和删除操作,只能做查询用。
select * fron v1;
触发器
对某个表进行 增/删/改 的前后希望触发某个特定的行为是,可以使用触发器,触发器对于用户制定的 增/删/改 前后的行为。
1,创建基本语法
# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
...
END
# 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END
2,删除触发器
drop trigger tri_after_insert_tb1;
3,使用触发器
触发器用户无法直接调用,而导致触发器的 增/删/改 操作被动引发的。
insert into tb1(num)values(888);
函数
1,自定义函数
delimiter \\
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int;
set num = i1 + i2;
return(num);
END \\
delimiter ;
2,删除函数
drop function func_name;
3,执行函数
# 获取返回值
declare @i VARCHAR(32);
select UPPER('alex') into @i;
SELECT @i;
# 在查询中使用
select f1(11,nid) ,name from tb2;
关于MySQL内置函数,请关注下次更新《MySQL内置部分函数》。
事务
事务用于将某些操作的多个SQL作为原子性操作,一旦某一个出现错误,就会返回到原来的状态,从而保证数据库数据的完整性。
delimiter \\
create PROCEDURE p1(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;
START TRANSACTION;
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT;
-- SUCCESS
set p_return_code = 0;
END\\
delimiter ;
支持事务的存储过程
索引
索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找内容时可以根据目录找到数据存放的位置,即可获取。
MySQL中常见的索引有:
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
1,普通索引
普通索引只有一个功能:加速查询
create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index ix_name (name)
);
创建表 + 索引
创建索引
create index index_name on table_name(column_name);
删除索引
drop index_name on table_name;
查看索引
show index from table_name;
注意事项:创建索引是如遇到blob 与 text 类型,必须指定length
2,唯一索引
唯一索引有两个功能:加速查询和唯一约束(包含null)
create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
unique ix_name (name)
);
创建表 + 唯一索引
创建唯一索引
create unique index 索引名 on 表名(列名);
删除唯一索引
drop unique index 索引名 on 表名;
3,主键索引
主键索引有两个功能:加速查询和唯一约束(不包含null)
create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index ix_name (name)
)
OR
create table in1(
nid int not null auto_increment,
name varchar(32) not null,
email varchar(64) not null,
extra text,
primary key(ni1),
index ix_name (name)
)
创建表 + 创建主键
创建主键
alter table 表名 add primary key(列名);
删除主键
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
4,组合索引
组合索引是将 n 个列组合成一个索引
其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'gaojiale' and n2 = 666。
create table in3(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text
)
创建表
创建组合索引
create index ix_name_email on in3(name,email);
创建组合索引后,查询
- name an email --- 使用索引
- name --- 使用索引
- email --- 不使用索引
注意事项:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。