MySQL数据库中包含各自数据库对象,常见的数据库对象有:表、索引、视图、事件、存储过程和存储函数等等。视频讲解如下:
一、 创建与管理表
表是一种非常重要的数据库对象,MySQL数据库的数据都是存储在表中。MySQL的表是一种二维结构,由行和列组成。表有列组成,列有列的数据类型。下面通过具体的步骤来演示如何操作MySQL的表。这些操作包括创建表、查看表、修改表和删除表。
(1)创建一张新的表test5
mysql> create table test5(id int,name varchar(32),age int);
(2)查看创建表的语句。
mysql> show create table test5 \G; # 输出的信息如下: *************************** 1. row *************************** Table: test5 Create Table: CREATE TABLE `test5` ( `id` int DEFAULT NULL, `name` varchar(32) DEFAULT NULL, `age` int DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
(3)查看表的结构
mysql> desc test5; # 输出的信息如下: +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | age | int | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ # 提示:这里也可以使用下面语句查看表的结构。 mysql> show columns from test5;
(4)在表中增加一个字段
mysql> alter table test5 add gender varchar(1) default 'M'; # 提示:这里增加了一个gender字段用于表示性别,默认是“M”。
(5)修改表将gender字段的长度改为10个字符,并且默认值改为“Female”
mysql> alter table test5 modify gender varchar(10) default 'Female';
(6)修改字段的顺序,将gender字段放在id字段的后面
mysql> alter table test5 modify gender varchar(10) after id;
(7)重新查看表的结构
mysql> desc test5; # 输出的信息如下: +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | gender | varchar(10) | YES | | NULL | | | name | varchar(32) | YES | | NULL | | | age | int | YES | | NULL | | +--------+-------------+------+-----+---------+-------+
(8)删除gender字段
mysql> alter table test5 drop column gender;
(9)删除表test5
mysql> drop table test5;
二、 在查询时使用索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引是一种数据结构。MySQL默认的索引类型是B+树索引。下面以普通索引为例来介绍如何使用MySQL的索引。
# 普通索引是最基本的索引,它没有任何限制,用于加速查询。
(1)基于员工表创建一张新的表。
mysql> create table indextable1 as select * from emp; # 提示:通过子查询创建表,只会复制表中的数据,不会复制索引。
(2)在员工姓名ename上创建普通索引。
mysql> create index index1 on indextable1(ename); # 提示:索引页可以在创建表的时候,同时创建创建索引。例如: mysql> create table mytable1( id int, name varchar(10), index index_mytable1_name(name));
(3)查看表indextable1上的索引信息。
mysql> show indexes from indextable1 \G; # 输出的信息如下: *************************** 1. row *************************** Table: indextable1 Non_unique: 1 Key_name: index1 Seq_in_index: 1 Column_name: ename Collation: A Cardinality: 15 Sub_part: NULL Packed: NULL Null: YES Index_type: BTREE Comment: Index_comment: Visible: YES Expression: NULL 1 row in set (0.01 sec)
(4)查询名叫KING的员工信息,使用explain查看SQL的执行计划。
mysql> explain select * from indextable1 where ename='KING' \G; # 输出的信息如下: *************************** 1. row *************************** id: 1 select_type: SIMPLE table: indextable1 partitions: NULL type: ref possible_keys: index1 key: index1 key_len: 33 ref: const rows: 1 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)
三、 使用视图简化查询语句
当SQL的查询语句比较复杂并且需要反复执行,如果每次都重新书写该SQL语句显然不是很方便。因此MySQL数据库提供了视图用于简化复杂的SQL语句。视图(view)是一种虚表,其本身并不包含数据。它将作为一个select语句保存在数据字典中的。视图依赖的表叫做基表。通过视图可以展现基表的部分数据;视图数据来自定义视图的查询中使用的基表。在了解的视图的作用后,下面通过具体的步骤来演示如何使用视图。
(1)查看创建视图的语法
mysql> help create view; # 输出的信息如下: Name: 'CREATE VIEW' Description: Syntax: CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = user] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
(2)基于员工表emp创建视图。
mysql> create or replace view view1 as select * from emp where deptno=10; # 提示:视图也可以基于多表进行创建,例如: mysql> create or replace view view2 as select emp.ename,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;
(3)使用show create view语句查看视图信息。
mysql> show create view view1;
(4)从视图中查询数据。
mysql> select * from view1; # 输出的信息如下: +-------+--------+-----------+------+------------+------+------+--------+ | empno | ename | job | mgr | hiredate | sal | comm | deptno | +-------+--------+-----------+------+------------+------+------+--------+ | 7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450 | NULL | 10 | | 7839 | KING | PRESIDENT | -1 | 1981/11/17 | 5000 | NULL | 10 | | 7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300 | NULL | 10 | +-------+--------+-----------+------+------------+------+------+--------+
(5)通过视图执行DML操作,例如:给10号部门员工涨100块钱工资。
mysql> update view1 set sal=sal+100; # 提示:并不是所有的视图都可以执行DML操作。在视图定义时含义以下内容,视图则不能执行DML操作: 1、查询子句中包含distinct和组函数 2、查询语句中包含group by子句和order by子句 3、查询语句中包含union 、union all等集合运算符 4、where子句中包含相关子查询 5、from子句中包含多个表 6、如果视图中有计算列,则不能执行update操作 7、如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
(6)创建视图时使用WITH CHECK OPTION约束 。
mysql> create or replace view view2 as select * from emp where sal<1000 with check option; # 提示:WITH CHECK OPTION表示对视图所做的DML操作,不能违反视图的WHERE条件的限制。
(7)在view2上执行update操作。
mysql> update view2 set sal=2000; # 此时将出现下面的错误信息: ERROR 1369 (HY000): CHECK OPTION failed 'demo1.view2'
四、 MySQL的事件
事件(Event)是MySQL数据库中的时间触发器,类似Linux的Crontab定时间的功能。在某一特定的时间点,Event会自动有MySQL调用从而触发相关的SQL语句或存储过程。要使用MySQL的事件,需要将参数“event_scheduler”设置为“ON”。
mysql> show variables like 'event_scheduler'; # 输出的信息如下: +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+
创建事件的语法格式如下:
CREATE [DEFINER = user] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] DO event_body; # 其中: ON SCHEDULE:用于设定Event的触发时间。可以使用”AT 时间戳“来完成单次的计划任务;或者使用”EVERY 时间的数量时间单位“来完成重复的计划任务。 ON COMPLETION [NOT] PRESERVE:表示“当这个事件不会再发生的时候”;PRESERVE的作用是使Event在执行完毕后不会被删除。
下面通过一个示例来说明如何使用MySQL的事件。
(1)创建一张表用于保存当前是时间。
mysql> create table testevent(currenttime timestamp);
(2)创建事件每隔3秒往表testevent插入当前的时间戳。
mysql> create event if not exists insert_timestamp_event on schedule every 3 second on completion preserve enable do insert into testevent values(current_timestamp()); # 提示:这里的Event调用的是insert语句往表testevent插入当前的时间戳。Event也可以调用存储过程来完成更加复杂的业务逻辑。
(3)查看数据库中已有的事件
mysql> show events \G; # 输出的信息如下: *************************** 1. row *************************** Db: demo1 Name: insert_timestamp_event Definer: root@localhost Time zone: SYSTEM Type: RECURRING Execute at: NULL Interval value: 3 Interval field: SECOND Starts: 2025-07-24 20:28:53 Ends: NULL Status: ENABLED Originator: 1 character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci
(4)查看testevent表中的数据。
mysql> select * from testevent; # 输出的信息如下: +---------------------+ | currenttime | +---------------------+ | 2025-07-24 20:28:53 | | 2025-07-24 20:28:56 | | 2025-07-24 20:28:59 | | 2025-07-24 20:29:02 | | 2025-07-24 20:29:05 | +---------------------+ # 提示:从表testevent中的数据可以看出,Event每隔3秒往表中插入了当前的时间。
(5)删除事件。
mysql> drop event insert_timestamp_event;