一、视图

  视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。

SELECT
*
FROM
(
SELECT
nid,
NAME
FROM
tb1
WHERE
nid > 2
) AS A
WHERE
A. NAME > 'alex';

创建视图

--格式:CREATE VIEW 视图名称 AS  SQL语句
CREATE VIEW v1 AS
SELET nid,
name
FROM
A
WHERE
nid >

删除视图

--格式:DROP VIEW 视图名称

DROP VIEW v1

修改视图

-- 格式:ALTER VIEW 视图名称 AS SQL语句

ALTER VIEW v1 AS
SELET A.nid,
B. NAME
FROM
A
LEFT JOIN B ON A.id = B.nid
LEFT JOIN C ON A.id = C.nid
WHERE
A.id >
AND C.nid <

使用视图

  使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

select * from v1

  

二、触发器

  对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。

创建基本语法

-- 插入前
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

示例1:

delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN IF NEW. NAME == 'alex' THEN
INSERT INTO tb2 (NAME)
VALUES
('aa')
END
END//
delimiter ;

示例2:

delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
IF NEW. num = THEN
INSERT INTO tb2 (NAME)
VALUES
(''),
('') ;
ELSEIF NEW. num = THEN
INSERT INTO tb2 (NAME)
VALUES
(''),
('') ;
END IF;
END//
delimiter ;

特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

删除触发器

DROP TRIGGER tri_after_insert_tb1;

使用触发器

insert into tb1(num) values(666)

三、存储过程

 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

创建存储过程

-- 创建存储过程

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 ; set temp1 = ; set r1 = i1 + i2 + temp1 + temp2; set i3 = i3 + ; end\\
delimiter ; -- 执行存储过程
set @t1 =;
set @t2 = ;
CALL p1 (, ,@t1, @t2);
SELECT @t1,@t2;

结果集:

delimiter //
create procedure p1()
begin
select * from v1;
end //
delimiter ;

结果集+out:

delimiter //
create procedure p2(
in n1 int,
inout n3 int,
out n2 int,
)
begin
declare temp1 int ;
declare temp2 int default ; select * from v1;
set n2 = n1 + ;
set n3 = n3 + n1 + ;
end //
delimiter ;

事务:

delimiter \\
create PROCEDURE p1(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = ;
rollback;
END; DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = ;
rollback;
END; START TRANSACTION;
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT; -- SUCCESS
set p_return_code = ; END\\
delimiter ;

游标:

delimiter //
create procedure p3()
begin
declare ssid int; -- 自定义变量1
declare ssname varchar(); -- 自定义变量2
DECLARE done INT DEFAULT FALSE; DECLARE my_cursor CURSOR FOR select sid,sname from student;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor;
xxoo: LOOP
fetch my_cursor into ssid,ssname;
if done then
leave xxoo;
END IF;
insert into teacher(tname) values(ssname);
end loop xxoo;
close my_cursor;
end //
delimter ;

动态执行sql:

delimiter \\
CREATE PROCEDURE p4 (
in nid int
)
BEGIN
PREPARE prod FROM 'select * from student where sid > ?';
EXECUTE prod USING @nid;
DEALLOCATE prepare prod;
END\\
delimiter ;

删除存储过程

drop procedure proc_name;

执行存储过程

-- 无参数
call proc_name() -- 有参数,全in
call proc_name(,) -- 有参数,有in,out,inout
set @t1=;
set @t2=;
call proc_name(,,@t1,@t2)

四、用户操作与权限管理

MySQL用户操作

创建用户

方法一: CREATE USER语句创建
CREATE USER 用户名@’IP地址’ IDENTIFIED BY ‘密码’; 方法二: INSERT语句创建
INSERT INTO mysql.user(user,host, password,ssl_cipher,x509_issuer,x509_subject)
VALUES(‘用户名’,’IP地址’,password(‘密码’),’’,’’,’’);
FLUSH PRIVILEGES; 方法三: GRANT语句创建
GRANT SELECT ON *.* TO 用户名@’IP地址’ IDENTIFIED BY ‘密码’;
FLUSH PRIVILEGES;

删除用户

方法一:DROP USER语句删除

       DROP USER 用户名@’IP地址’;

方法二:DELETE语句删除

       DELETE FROM mysql.user
WHERE user=’用户名’ AND host=’IP地址’;
FLUSH PRIVILEGES;

修改密码

root用户修改自己密码:

方法一:
# mysqladmin -uroot -p123 password 'new_password' //123为旧密码 方法二:
UPDATE mysql.user SET password=password(‘new_password’)
WHERE user=’root’ AND host=’localhost’;
FLUSH PRIVILEGES; 方法三:
SET PASSWORD=password(‘new_password’);
FLUSH PRIVILEGES;

root修改其他用户密码:

方法一:
SET PASSWORD FOR 用户名@’IP地址’=password(‘new_password’);
FLUSH PRIVILEGES; 方法二:
UPDATE mysql.user SET password=password(‘new_password’)
WHERE user=’用户名’ AND host=’IP地址’;
FLUSH PRIVILEGES; 方法三:
GRANT SELECT ON *.* TO user3@’localhost’ IDENTIFIED BY ‘yuan’;
FLUSH PRIVILEGES;

普通用户修改自己密码:

SET password=password(‘new_password’);

丢失root用户密码:

# vim /etc/my.cnf
skip-grant-tables
# service mysqld restart
# mysql -uroot
mysql> UPDATE mysql.user SET password=password(‘new_password’)
WHERE user=’root’ AND host=’localhost’;
mysql> FLUSH PRIVILEGES;

修改用户名:

rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';

注解 flush privileges:

/*
flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。
MySQL用户数据和权限有修改后,搜索希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令
*/

MySQL权限管理

授权

--语法格式:

    grant 权限列表  on 库名.表名 to 用户名@'客户端主机'  [identified by '密码'  with option参数];

示例

-- 给该用户授予对数据库db1下的表tb1所有的操作权限
grant all privileges on db1.tb1 TO '用户名'@'IP' -- 给该用户授予对数据库db1下所有表进行查操作的权限
grant select on db1.* TO '用户名'@'IP' -- 给该用户授予对所有数据库下所有表进行查和增的操作
grant select,insert on *.* TO '用户名'@'IP' -- 用户只能在该IP段下才能(通配符%表示任意)对所有数据库下所有表进行查操作
grant select on *.* TO '用户名'@'192.168.1.%' -- 用户能用户可以在任意IP下(通配符%表示任意)对所有数据库下所有表进行查操作
grant select on *.* TO '用户名'@'%'

with_option参数:

GRANT OPTION:                                    -- 授权选项

    MAX_QUERIES_PER_HOUR:                        -- 定义每小时允许执行的查询数
MAX_UPDATES_PER_HOUR: -- 定义每小时允许执行的更新数
MAX_CONNECTIONS_PER_HOUR: -- 定义每小时可以建立的连接数
MAX_USER_CONNECTIONS: -- 定义单个用户同时可以建立的连接数

示例: 限制用户每小时的查询数量

mysql> grant select on *.* to '用户名'@'IP地址' identified by '123456' with max_queries_per_hour 5;

查看权限

show grants for '用户'@'IP地址'

回收权限

--语法:
REVOKE 权限列表 ON 库名.表名 FROM 用户名@‘客户端主机’

示例:

REVOKE DELETE ON *.*  FROM 用户名@’%’;             -- 回收部分权限
REVOKE ALL PRIVILEGES FROM 用户名@’%’; -- 回收所有权限

  

五、索引

1. 索引简介

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。
索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!

2.索引语法

创建索引

--创建表时
--语法:
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
); -------------------------------- --创建普通索引示例: CREATE TABLE emp1 (
id INT,
name VARCHAR() ,
resume VARCHAR(),
INDEX index_emp_name (name)
--KEY index_dept_name (dept_name)
); --创建唯一索引示例: CREATE TABLE emp2 (
id INT,
name VARCHAR() ,
bank_num CHAR() UNIQUE ,
resume VARCHAR(),
UNIQUE INDEX index_emp_name (name)
); --创建全文索引示例: CREATE TABLE emp3 (
id INT,
name VARCHAR() ,
resume VARCHAR(),
FULLTEXT INDEX index_resume (resume)
); --创建多列索引示例: CREATE TABLE emp4 (
id INT,
name VARCHAR() ,
resume VARCHAR(),
INDEX index_name_resume (name,resume)
); ---------------------------------

添加和删除索引

---添加索引

    ---CREATE在已存在的表上创建索引
CREATE [UNIQUE] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ; ---ALTER TABLE在已存在的表上创建索引 ALTER TABLE 表名 ADD [UNIQUE] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ; CREATE INDEX index_emp_name on emp1(name);
ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num); -- 删除索引 语法:DROP INDEX 索引名 on 表名 DROP INDEX index_emp_name on emp1;
DROP INDEX bank_num on emp2;

3. 索引测试实验

--创建表
create table Indexdb.t1(id int,name varchar()); --存储过程 delimiter $$
create procedure autoinsert()
BEGIN
declare i int default ;
while(i<)do
insert into Indexdb.t1 values(i,'yuan');
set i=i+;
end while;
END$$ delimiter ; --调用函数
call autoinsert(); -- 花费时间比较:
-- 创建索引前
select * from Indexdb.t1 where id=;--.32s
-- 添加索引
create index index_id on Indexdb.t1(id);
-- 创建索引后
select * from Indexdb.t1 where id=;--.00s

MySQL数据库(5)_MySQL数据库视图、触发器的更多相关文章

  1. mysql 12章_MySQL数据库的高级管理

    一. 用户管理 Root用户是MySQL数据库管理系统中的系统管理员,但在实际开发过程中通常需要根据不同的开发者分配不同的用户,这样有利于用户的管理和维护. . 用户的创建: ) 方式1:使用MySQ ...

  2. MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份

    一.视图 -- view 视图:是一个虚报表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 视图有如下特点: 1.视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 ...

  3. MySQL之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份

    1.视图 视图: 是一个虚拟表,其内容由查询定义: 视图有如下特点;  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系.  2. 视图是由基本表(实表)产生的表(虚表).  3. ...

  4. 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

    数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...

  5. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  6. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    -- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...

  7. MySQL数据库(1)_MySQL数据库介绍与安装

    一.数据库相关概念的简介 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展 ...

  8. 🚴‍♂️全套MySQL数据库教程_Mysql基础入门教程,零基础小白自学MySQL数据库必备教程☔ #002 # 第二单元 MySQL数据类型、操作表#

    二.本单元知识点概述 (Ⅰ)知识点概述 二.本单元教学目标 (Ⅰ)重点知识目标 1.Mysql的数据类型2.如何选择数据类型3.创建表4.修改表5.删除表 (Ⅱ)能力目标 1.熟练创建数据库及删除数据 ...

  9. MySQL学习笔记01_数据库基础知识

    01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...

  10. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

随机推荐

  1. java序列化,二进制和数据流

    类的序列化需要支持Serializable接口,如果类支持序列化,可以通过ObjectOutPutStream和ObjectInputStream将对象和Stream之间进行方便的转换. 首先来 看一 ...

  2. python学习之sys.getsizeof()

    sys.getsizeof() >>> help(sys.getsizeof)Help on built-in function getsizeof in module sys: g ...

  3. c++ what happens when a constructor throws an exception and leaves the object in an inconsistent state?

    为什么会想到这个问题?因为我总是不自觉地将c++和java进行对比.java对这种情况的处理方式是constructor返回一个null,然后已经构造的objects交给Garbage Collect ...

  4. java内存管理和gc回收机制

    Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码 ...

  5. Redis的README.md

    This README is just a fast *quick start* document. You can find more detailed documentation at http: ...

  6. MFC 控件RadioButton和CheckBox区别

    1. 单个RadioButton在选中后,通过点击无法变为未选中 单个CheckBox在选中后,通过点击可以变为未选中 2. 一组RadioButton,只能同时选中一个 一组CheckBox,能同时 ...

  7. K - Large Division 判断a是否是b的倍数。 a (-10^200 ≤ a ≤ 10^200) and b (|b| > 0, b fits into a 32 bit signed integer). 思路:取余;

    /** 题目:K - Large Division 链接:https://vjudge.net/contest/154246#problem/K 题意:判断a是否是b的倍数. a (-10^200 ≤ ...

  8. Swoole系列(一):简介

    前言: 实际上作为一名PHP程序员,我很清楚PHP的确有很多局限性,比如Unix系统编程.网络通信编程.异步io,大部分PHPer不懂.PHP界也确实没有这样的东西.Swoole开源项目就是为了弥补P ...

  9. 甲醛(Formaldehyde)

    化学式:HCHO 又称蚁醛 无色气体,有特殊的刺激气味 气体相对密度1.067(空气=1),液体密度0.815g/cm³(-20℃).熔点-92℃,沸点-19.5℃.易溶于水和乙醇.水溶液的浓度最高可 ...

  10. Eclipse 浏览(Navigate)菜单浏览 Eclipse 工作空间

    Eclipse 浏览(Navigate)菜单 浏览 Eclipse 工作空间 浏览(Navigate)菜单提供了多个菜单可以让你快速定位到指定资源. 上图中 Open Type, Open Type ...