【赵渝强老师】MySQL中的数据库对象

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本教程详细介绍了MySQL数据库中的常见对象,包括表、索引、视图、事件、存储过程和存储函数的创建与管理。内容涵盖表的基本操作、索引的使用、视图简化查询、事件调度功能等,并通过具体示例演示相关SQL语句的使用方法。

b377.png

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;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
466 158
|
6月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
538 93
|
5月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
310 0
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1113 152
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
857 156
|
6月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
467 156
|
6月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
564 161
|
6月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
6月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
6月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。

热门文章

最新文章

推荐镜像

更多