MySQL数据库管理
上一篇博客我们介绍了数据库的一些基本操作,那么这次就让我们一次来认识一下操作数据库的一些更深入的方法。
一、视图
视图通常分为三种:
- 简单视图,单张表
- 复杂视图,多张表
- 物化视图
(1)简单视图的创建
mysql> create view v1_students as select name,age from students;
Query OK, 0 rows affected (0.01 sec)
(2)复杂视图的创建
mysql> create view v2_students as select s.name student_name,t.name teacher_name from students s join teachers t on s.teacherid=t.tid;
Query OK, 0 rows affected (0.00 sec)
(3)查看指定的视图信息
mysql> show create view v2_students\G;
*************************** 1. row ***************************
View: v2_students
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2_students` AS select `s`.`Name` AS `student_name`,`t`.`Name` AS `teacher_name` from (`students` `s` join `teachers` `t` on((`s`.`TeacherID` = `t`.`TID`)))
character_set_client: latin1
collation_connection: latin1_swedish_ci
1 row in set (0.00 sec)
(4)查看所有的视图信息
MariaDB [hidb]> select * from information_schema.views\G;
mysql> select * from information_schema.views\G;
*************************** 1. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: hellodb
TABLE_NAME: v1_students
VIEW_DEFINITION: select `hellodb`.`students`.`Name` AS `name`,`hellodb`.`students`.`Age` AS `age` from `hellodb`.`students`
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: latin1
COLLATION_CONNECTION: latin1_swedish_ci
*************************** 2. row ***************************
TABLE_CATALOG: NULL
TABLE_SCHEMA: hellodb
TABLE_NAME: v2_students
VIEW_DEFINITION: select `s`.`Name` AS `student_name`,`t`.`Name` AS `teacher_name` from (`hellodb`.`students` `s` join `hellodb`.`teachers` `t` on((`s`.`TeacherID` = `t`.`TID`)))
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: latin1
COLLATION_CONNECTION: latin1_swedish_ci
2 rows in set (0.05 sec)
(5)删除视图
MariaDB [hidb]> drop view v1_students;
Query OK, 0 rows affected (0.00 sec)
(6)更新视图数据
mysql> update v2_students set teacher_name='Tie Muzhen' where student_name='da ji';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from teachers;
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| 1 | Liu Bang | 45 | M |
| 2 | Ying Zheng | 94 | M |
| 3 | Wu Zetian | 77 | F |
| 4 | Tie Muzhen | 93 | F |
+-----+------------+-----+--------+
4 rows in set (0.00 sec)
由这个例子我们可以看出,修改视图实际上修改的是基表,那么需要注意的就是有些情况下是不能修改视图的数据的。分为以下几种情况,select字句中不能包含distinct,组函数,union以及group by 等语句。
二、自定义函数
函数有多种,大致分为自定义和内置函数两种,内置函数也有很多,不需要定义,可直接进行调用,那么我们一起来详细的认识一下自定义函数的用法。
(1)自定义函数的创建
create +function 然后加函数名 后跟renturn内容即可。
mysql> CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!";
Query OK, 0 rows affected (0.04 sec)
(2) 查看所有函数信息
mysql> show function status\G;
*************************** 1. row ***************************
Db: hellodb
Name: simpleFun
Type: FUNCTION
Definer: root@localhost
Modified: 2018-09-06 01:31:30
Created: 2018-09-06 01:31:30
Security_type: DEFINER
Comment:
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
(3)查看指定自定义函数的定义
mysql> show create function simplefun\G;
*************************** 1. row ***************************
Function: simplefun
sql_mode:
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `simplefun`() RETURNS varchar(20) CHARSET utf8
RETURN "Hello World!"
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
(4)带参自定义函数
mysql> delimiter // 将分割符定义为//
mysql> create function addtwonumber(x smallint unsigned,y smallint unsigned)
-> returns smallint begin
-> declare a,b smallint unsigned;
-> set a=x,b=y;
-> return a+b;
-> end//
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ; 重新定义为;
mysql> select addtwonumber(10,20);
+-------------------------------+
| addtwonumber(10,20) |
+-------------------------------+
| 30 |
+-------------------------------+
1 row in set (0.03 sec)
(5)删除自定义函数
MariaDB [mysql]> drop function simplefun;
Query OK, 0 rows affected (0.00 sec)
三、触发器trigger
触发器是基于两个表之间的联系,一个表发生变化触动触发器然后引起的另一个表也发生变化。
先建两个表
mysql> create table student_info( stu_id int(11) primary key auto_increment,
-> stu_name varchar(255) default null);
Query OK, 0 rows affected (0.01 sec)
create table student_count( student_count int(11) default 0);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student_count values(0);
Query OK, 1 row affected (0.00 sec) 表的基本操作已完成,接下来就是建立触发器了。
(1)触发器创建
mysql> create trigger trigger_student_count_insert after insert on student_info for each row update student_count set student_count=student_count+1;
Query OK, 0 rows affected (0.01 sec) 这里需要注意的是触发器的名字尽量起与之相关的,容易看懂。
mysql> insert into student_info values (1,'wsy');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_count;
+---------------+
| student_count |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
(2)查看现有触发器
mysql> SHOW TRIGGERS\G;
*************************** 1. row ***************************
Trigger: trigger_student_count_insert
Event: INSERT
Table: student_info
Statement: update student_count set student_count=student_count+1
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
(3)删除触发器
mysql>DROP TRIGGER trigger_student_count_insert;
四、存储过程
存储过程:存储过程保存在mysql.proc表中
(1)创建一个无参存储过程
mysql> delimiter //
mysql> create procedure showtime() begin select now(); -> end //
Query OK, 0 rows affected (0.00 sec)
(2) 创建一个含参存储过程
mysql>create procedure deletebyld(in uid smallint unsigned,out num smallint unsigned) begin delete from hellodb.students where stuid=uid; select row_count() into num; end//
mysql> delimiter ;
mysql> call deletebyld(2,@line);
Query OK, 0 rows affected (0.02 sec)
mysql> select @line;
+-------+
| @line |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
(2)存储过程的调用
mysql> call showtime;
+---------------------+
| now() |
+---------------------+
| 2018-09-06 02:15:54 |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
(2)查看指定的存储过程创建
mysql>show create procedure showtime\G;
(3)删除存储过程
mysql> drop procedure showtime;
(4)查看存储过程列表
mysql> SHOW PROCEDURE STATUS\G;
*************************** 1. row ***************************
Db: hellodb
Name: showtime
Type: PROCEDURE
Definer: root@localhost
Modified: 2018-09-06 02:15:37
Created: 2018-09-06 02:15:37
Security_type: DEFINER
Comment:
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
(5)存储过程的优势
- 存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中, 当需要时从数据库中直接调用,省去了编译的过程
- 提高了运行速度
- 同时降低网络数据传输量
有关MySQL的相关函数及触发器内容就介绍到这里了。