MySQL中级篇
Posted 57容杰龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中级篇相关的知识,希望对你有一定的参考价值。
1.视图view
视图是一个虚拟表,其内容由查询定义。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。
视图的优点:
①简化了操作,把经常使用的数据定义为视图。
②安全性,用户只能查询和修改能看到的数据。
③逻辑上的独立性,屏蔽了真实表的结构带来的影响。
视图的缺点:
①性能差。
②修改限制。
A.创建视图
CREATE VIEW 视图名称 AS SQL语句
1 CREATE VIEW stu AS SELECT * FROM student WHERE id<3;
B.删除视图
DROP VIEW view1
1 DROP VIEW stu;
C.修改视图
ALTER VIEW 视图名称 AS SQL语句
1 ALTER VIEW stu AS SELECT * FROM CLIENT;
D.使用视图
select * from v1
1 SELECT * FROM stu;
2.存储过程procedure
应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个查询sql语句,
那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不容易维护。另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。
而存储例程正好可以帮我们解决这些问题。
A.创建存储过程
无参的:
1 DELIMITER $$ --自定义语句结尾符号,因为这里要执行好多句sql语句,所以就得自定义,以防止出错
2
3 CREATE PROCEDURE pro1()
4 BEGIN
5 SELECT * FROM users;
6 END $$
7
/* 改回默认值 ; */
delimiter ;
8 -- 执行存储过程
9
10 CALL pro1()
带参的:
- in 仅用于传入参数用
- out 仅用于返回值用
- inout 既可以传入又可以当作返回值
1 -- 创建存储过程 2 DELIMITER $$ 3 CREATE PROCEDURE p1( 4 IN i1 INT, -- 传入参数i1 5 IN i2 INT, -- 传入参数i2 6 INOUT i3 INT, -- 即传入又能得到返回值 7 OUT r1 INT -- 得到返回值 8 ) 9 BEGIN 10 DECLARE temp1 INT; 11 DECLARE temp2 INT DEFAULT 0; 12 SET temp1 = 1; 13 SET r1 = i1 + i2 + temp1 + temp2; 14 SET i3 = i3 + 100; 15 END $$
1 -- 执行存储过程 2 -- DECLARE @t1 INT default 3; -- 设置变量默认值为3 3 SET @t1=8; 4 DECLARE @t2 INT; -- 设置变量 5 CALL p1 (1, 2 ,@t1, @t2); -- 执行存储过程,并传入参数,t2自动取消 6 SELECT @t1,@t2; -- 查看存储过程输出结果
mysql存储过程将查出来的结果集赋给一个变量
DELIMITER $$
CREATE PROCEDURE p2(OUT param INT)
BEGIN
DECLARE X INT;
SELECT COUNT(NAME) INTO X FROM table WHERE NAME=\'rjl\';
SET param = X;
END$$
DELIMITER ;
B.删除存储过程
1 DROP PROCEDURE p1;
C.java 语言调用存储过程
详细介绍:http://www.cnblogs.com/57rongjielong/p/7765915.html
3.函数function
函数也可以传参数,也可以接收返回值,但是函数没办法得到执行语句得到的结果,存储过程可以。
A.内置函数
B.自定义函数
1 DELIMITER $$ 2 CREATE FUNCTION f1( 3 x1 INT, 4 y1 INT) 5 RETURNS INT 6 BEGIN 7 DECLARE num INT; 8 SET num = x1 + y1; 9 RETURN num; 10 END $$ 11 DELIMITER ; 12 13 SELECT f1(50,50);
C.删除函数:
DROP FUNCTION f1;
4.事务
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
1 START TRANSACTION; 2 SELECT * FROM users; 3 SAVEPOINT sel; 4 *********** 5 ROLLBACK sel; 6 COMMIT;
5.触发器TRIGGER
——对表的行进行【增/删/改】前后的行为。触发器无法由用户直接调用,这是对表的【增/删/改】操作被动引发的。
1 # 插入前 2 CREATE TRIGGER tri1 BEFORE INSERT ON tb1 FOR EACH ROW 3 BEGIN 4 ... 5 END 6 7 # 插入后 8 CREATE TRIGGER tri2 AFTER INSERT ON tb1 FOR EACH ROW 9 BEGIN 10 ... 11 END 12 13 # 删除前 14 CREATE TRIGGER tri3 BEFORE DELETE ON tb1 FOR EACH ROW 15 BEGIN 16 ... 17 END 18 19 # 删除后 20 CREATE TRIGGER tri4 AFTER DELETE ON tb1 FOR EACH ROW 21 BEGIN 22 ... 23 END 24 25 # 更新前 26 CREATE TRIGGER tri5 BEFORE UPDATE ON tb1 FOR EACH ROW 27 BEGIN 28 ... 29 END 30 31 # 更新后 32 CREATE TRIGGER tri6 AFTER UPDATE ON tb1 FOR EACH ROW 33 BEGIN 34 ... 35 END
例一:NEW表示即将插入的数据行,OLD表示即将删除的数据行。
DELIMITER $$ CREATE TRIGGER tri_before_insert BEFORE INSERT ON student FOR EACH ROW BEGIN IF new.sex = \'男\' THEN UPDATE users SET qq=\'123456\'; END IF; END $$ DELIMITER ; INSERT INTO student(sex,address) VALUES(\'男\',\'广东广州\');
例二:
DELIMITER $$ CREATE TRIGGER tri_after_delete AFTER DELETE ON student FOR EACH ROW BEGIN IF old.sex=\'女\' THEN INSERT INTO CLIENT(sex,address) VALUES(\'男\',\'中国\'); END IF; END$$ DELIMITER ; DELETE FROM student WHERE sex=\'女\';
删除触发器
DROP TRIGGER tri_before_insert;
以上是关于MySQL中级篇的主要内容,如果未能解决你的问题,请参考以下文章
运维学python之爬虫中级篇Python3 MySQL 数据库连接
Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇