视图就是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需要使用[名称]即可获取结果集并可以将其当做代表来使用·
-- 临时表搜索
SELECT
*
FROM
(
SELECT
nid,
name
FROM
tb1
WHERE
nid > 2
) AS A
WHERE
A.name > 'Wyc';
1丶创建视图
-- 格式: CREATE VIEW 视图名称 AS SQL语句
CREATE VIEW v1 AS
SELECT nid,
name
FROM
A
WHERE
nid > 4;
2丶删除视图
-- 格式: DROP VIEW 视图名称
DROP VIEW v1;
3丶修改视图
-- 格式:ALTER VIEW 视图名称 AS SQL语句
ALTER VIEW v1 AS
SELTER A.nid,
B.name
FROM
A
LETE JOIN B ON A.id = B.nid
LETE JOIN C ON A.id = C.nid
WHERE
A.id > 2
AND C.nid < 5;
4丶使用视图
使用视图时,将其当做表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建,更新和删除操作,仅能做查询用·
select * from 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_updata_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW BEGIN
....
END
-- 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATA ON FOR EACH ROW BEGIN
....
END
-- 插入前触发器
delimiter //
CREATE TRIGEER tri_before_insert_tb1 BEFOR INSERT ON tb1 FOR EACH ROW BEGIN
IF NEW.NAME == 'Wyc' THEN
INSERT INTO tb2 (NAME)
VALUES
('aa')
END
END//
delimiter ;
-- 插入后触发
delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW BEGIN
IF NEW.nue = 666 THEN
INSERT INTO tb2(NAME)
VALUES
('666'),
('666');
ELSEIF NEW.num = 555 THEN
INSERT INTO tb2(NAME)
VALUES
('555'),
('555');
END IF;
END //
delimiter;
特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据·
2丶删除触发器
DROP TRIGGER tri_after_insert_tb1;
3丶使用触发器
触发器无法由用户直接调用,而只由于对表的[增/删/改]操作被动引发的·
insert into tb1(num) values(666);
存储过程是一个SQL语句集合,当主动去调用存储过程时,其内部的SQL语句会按照逻辑执行·
1丶创建存储过程
-- 无参数存储过程
delimiter//
create procedure p1()
BEGIN
select * from t1;
END//
delimiter;
-- 执行存储过程
call p1()
对于存储过程,可以接收参数,其参数有三类:
· in 仅用于传入参数用
· out 仅用于返回值用
· inout 既可以传入有可以当做返回值
-- 有参数存储过程
delimiter \\
create procedure p1(
in i1 int,
in i2 int,
inout i3 int,
out r1 int
)
BEGIN
DECLARE temp1 int;
DECLARE temp2 int default 0;
set temp1 = 1;
set r1 = i1 + i2 + temp1 + temp2;
set i3 = i3 + 100;
end \\
delimiter;
-- 执行存储过程
DECLARE @t1 INT default 3;
DECLARE @t2 INT;
CALL p1 (1,2,@t1,@t2);
SELECT @t1,@t2;
2丶删除存储过程
drop procedure proc_name;
3丶执行存储过程
-- 无参数
call proc_name()
-- 有参数,全in
call proc_name(1,2)
-- 有参数,有in,out,inout
DECLARE @t1 INT;
DECLARE @t2 INT default 3;
call proc_name(1,2,@t1,@t2)
## pymysql执行存储过程
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwod='123',db='t1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#执行存储过程
cursor.callproc('p1',args=(1,2,3,4))
#获取执行完存储的参数
cursor.execute('select @_p1_0,@_p1_1,@_p1_2,@_p1_3')
result = cursor.fetchall()
conn.commit() -- 提交
cursor.close()
conn.close()
#execute :创建游标
索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构,类似于字典中的目录查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可·
MySQL中常见索引有:
·普通索引
·唯一索引
·主键索引
·组合索引
1丶普通索引
普通索引仅有一个功能:加速查询
1 create table in1(
2 nid int not null auto_increment primary key,
3 name varchar(32) not null,
4 email varchar(64) not null,
5 extra text,
6 index ix_name(name)
7 )
1 create_index index_name on table_name(column_name)
1 drop index_name on table_nme;
1 show index from table_name;
注意:对于创建索引时如果是BLOB和TEXT类型,必须制定length·
create index ix_extra on in1(extra(32));
2丶唯一索引
唯一索引有两个功能:加速查询和唯一约束(可含null)
1 create table in1(
2 nid int not null auti_increment primary key,
3 name varchar(32) not null,
4 email barchar(64) not null,
5 extra text,
6 unique ix_name (name)
7 )
1 create unique index 索引名 on 表名(列名)
1 drop unique index 索引名 on 表名
3丶主键索引
主键有两个功能:加速查询和唯一约束(不可含null)
1 create table in1(
2 nid int not null auto_increment primary key,
3 name varchar(32) not null,
4 email varchar(64) not null,
5 extra text,
6 index ix_name(name)
7 )
8
9 OR
10
11 create table in1(
12 nid int not null auto_increment,
13 name varchar(32) not null,
14 email varchar(64) not null,
15 extra text,
16 primary key(ni1),
17 index ix_name(name)
18 )
1 alter table 表名 add primary key(列名);
1 alter table 表名 add paimary key;
2 alter table 表名 modify 列名 int,drop primary key;
4丶组合索引
组合索引时将n个列组合成一个索引
其应用场景为:频繁的同事使用n列来进行查询,如:where n1 = 'Wyc' and n2 =666·
1 create table in3(
2 nid int not null auto_increment primary key,
3 name varchar(32) not null,
4 email varchar(64) not null,
5 extra text
6 )
1 create index ix_name_email on in3(name,email);
如上创建组合索引之后,查询:
· name and email -- 使用索引
· name -- 使用索引
· email -- 不使用索引
注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并·
1、条件语句
delimiter \\
CREATE PROCEDURE proc_if ()
BEGIN
declare i int default 0;
if i = 1 THEN
SELECT 1;
ELSEIF i = 2 THEN
SELECT 2;
ELSE
SELECT 7;
END IF;
END\\
delimiter ;
2、循环语句
delimiter \\
CREATE PROCEDURE proc_while ()
BEGIN
DECLARE num INT ;
SET num = 0 ;
WHILE num < 10 DO
SELECT
num ;
SET num = num + 1 ;
END WHILE ;
END\\
delimiter ;
delimiter \\
CREATE PROCEDURE proc_repeat ()
BEGIN
DECLARE i INT ;
SET i = 0 ;
repeat
select i;
set i = i + 1;
until i >= 5
end repeat;
END\\
delimiter ;
delimiter \\
CREATE PROCEDURE proc_loop ()
BEGIN
declare i int default 0;
loop_label: loop
select i;
set i=i+1;
if i>=5 then
leave loop_label;
end if;
end loop;
END\\
delimiter ;
3、动态执行SQL语句
delimiter \\
DROP PROCEDURE IF EXISTS proc_sql \\
CREATE PROCEDURE proc_sql ()
BEGIN
declare p1 int;
set p1 = 11;
set @p1 = p1;
PREPARE prod FROM 'select * from tb2 where nid > ?';
EXECUTE prod USING @p1;
DEALLOCATE prepare prod;
END\\
delimiter ;