MySQL 基础模型:从数据库、表到基础 DDL 操作
学习 MySQL 时最先需要建立的不是某一条 SQL 的记忆而是对 MySQL 基础模型的理解客户端如何连接 MySQL Server数据库和表之间是什么关系SQL 语句分别在操作哪一层对象。本文从数据库的基本概念出发介绍 MySQL 中服务器、数据库、表之间的关系并通过常见 DDL 语句完成数据库和表的基础操作。1. 数据库基础1.1 什么是数据库在程序开发中数据可以直接保存到普通文件中但这种方式通常存在以下问题安全性较弱数据访问、权限控制和备份恢复都需要应用程序自行处理。查询和管理不方便复杂条件检索、排序、聚合等操作实现成本较高。不适合管理海量数据文件读写、并发访问和数据一致性都容易成为问题。程序需要直接控制数据组织方式业务代码和数据存储细节容易耦合。数据库可以理解为按照一定结构组织、存储和管理数据的集合。MySQL 则是一个关系型数据库管理系统负责提供数据存储、查询、更新、权限控制、事务处理等能力。在 MySQL 中数据通常以二维表的形式组织表中的一行表示一条记录。表中的一列表示一个字段。字段有明确的数据类型例如整数、字符串、日期时间等。1.2 MySQL Server、数据库和表的关系安装 MySQL本质上是在机器上安装一个数据库管理系统。应用程序并不直接操作磁盘文件而是通过客户端连接 MySQL Server再由 MySQL Server 管理具体的数据库和表。而server、DB、table三者之间的关系可以表示为可以这样理解一个 MySQL Server 可以管理多个数据库。一个数据库可以包含多张表。一张表用于保存某一类实体或业务对象的数据。表由字段和记录组成字段描述数据结构记录保存具体数据。1.3 MySQL 的简单使用流程第一次使用 MySQL 时通常会经历以下步骤创建数据库。选择当前要使用的数据库。在数据库中创建表。向表中写入或查询数据。示例createdatabasedb_name;usedb_name;createtabletable_name(idint,namevarchar(20));其中create database用于创建数据库use用于切换当前数据库create table用于创建表结构。1.4 MySQL 架构的基本认知从使用者视角看MySQL 可以分为几个主要层次其中SQL 层负责理解和执行 SQL 语句存储引擎层负责真正的数据读写。MySQL 支持多种存储引擎日常开发中最常见的是innodb。现阶段先建立一个基本认识即可我们写的 SQL 会提交给 MySQL Server由 MySQL Server 解析、优化并通过存储引擎访问底层数据。1.5 SQL 分类SQL 是操作关系型数据库的标准语言。按照用途常见 SQL 可以分为以下几类分类全称作用常见语句DDLData Definition Language定义和维护数据库对象结构create、alter、dropDMLData Manipulation Language操作表中的数据insert、update、deleteDQLData Query Language查询表中的数据selectDCLData Control Language控制权限grant、revokeTCLTransaction Control Language控制事务commit、rollback本文重点介绍 DDL也就是数据库和表结构的创建、修改与删除。2. 数据库的操作2.1 创建数据库创建数据库的基本语法如下createdatabase[ifnotexists]db_name[create_option]...;create_option:[default]charactersetcharset_name|[default]collatecollation_name常用写法createdatabaseifnotexistsschooldefaultcharactersetutf8mb4defaultcollateutf8mb4_0900_ai_ci;说明if not exists表示当数据库不存在时才创建可以避免重复创建时报错。character set用于指定数据库默认字符集。collate用于指定数据库默认排序规则。2.2 字符集和排序规则字符集和排序规则是创建数据库时经常被忽略但实际开发中很重要的配置。character set决定字符如何编码和存储。例如utf8mb4可以完整支持 Unicode 字符包括中文、Emoji 和一些特殊符号。collate决定字符串如何比较和排序。例如在进行order by、唯一索引比较、字符串等值判断时排序规则会影响比较结果。日常开发建议优先使用utf8mb4不要使用 MySQL 中旧语义的utf8。同一个业务系统尽量保持数据库、表、字段的字符集和排序规则一致。如果没有特殊需求可以使用 MySQL 8.0 默认的utf8mb4_0900_ai_ci。如果需要兼容旧版本 MySQL常见选择是utf8mb4_general_ci或utf8mb4_unicode_ci。其中ci表示 case-insensitive即大小写不敏感。不同排序规则在大小写、重音字符、语言比较规则等方面可能存在差异。2.3 查看数据库查看当前 MySQL Server 中的数据库showdatabases;查看某个数据库的创建语句showcreatedatabaseschool;show create database可以看到数据库当前使用的字符集和排序规则排查环境差异时非常有用。2.4 修改数据库修改数据库的基本语法如下alterdatabasedb_name[alter_option]...;alter_option:[default]charactersetcharset_name|[default]collatecollation_name示例alterdatabaseschooldefaultcharactersetutf8mb4defaultcollateutf8mb4_0900_ai_ci;需要注意的是修改数据库默认字符集和排序规则主要影响后续新建的表和字段。已经存在的表或字段不会自动全部转换需要单独处理。2.5 删除数据库删除数据库的语法如下dropdatabase[ifexists]db_name;示例dropdatabaseifexistsschool;drop database会删除整个数据库包括数据库中的所有表和数据。这个操作不可轻易执行尤其是在生产环境中执行前必须确认数据库名称、备份状态和影响范围。3. 表的操作3.1 创建表创建表的基本语法如下createtabletable_name(column_name data_type[column_option],column_name data_type[column_option],...)[table_option];常见表选项包括字符集、排序规则和存储引擎createtablestudent(idint,namevarchar(20),gendervarchar(10),ageint)charactersetutf8mb4collateutf8mb4_0900_ai_ciengineinnodb;说明student是表名。id、name、gender、age是字段名。int、varchar(20)是字段的数据类型。character set和collate用于指定表的默认字符集和排序规则。engine innodb指定表使用innodb存储引擎。实际开发中表结构通常还会包含主键、非空约束、默认值和字段注释。例如createtablestudent(idbigintprimarykeyauto_incrementcomment学生ID,namevarchar(64)notnullcomment学生姓名,gendervarchar(10)defaultnullcomment性别,ageintdefaultnullcomment年龄,created_atdatetimenotnulldefaultcurrent_timestampcomment创建时间)engineinnodbdefaultcharactersetutf8mb4defaultcollateutf8mb4_0900_ai_cicomment学生表;这个示例更接近日常业务表的写法primary key表示主键。auto_increment表示自增。not null表示字段不能为空。default表示默认值。comment用于添加注释方便后续维护。3.2 查看表查看当前数据库中的所有表showtables;查看表结构descstudent;查看表的完整创建语句showcreatetablestudent;3.3 修改表表创建后如果业务需求发生变化可以使用alter table修改表结构。添加字段语法示例altertabletable_nameaddcolumn_name data_type[column_option];例如在student表中添加一个字段用于保存图片路径altertablestudentaddassetsvarchar(100)comment图片路径aftergender;after gender表示将新字段添加到gender字段后面。如果不指定位置MySQL 通常会把字段添加到表的最后。修改字段类型语法示例altertabletable_namemodifycolumn_name data_type[column_option];例如将name字段长度修改为 64altertablestudentmodifynamevarchar(64)notnullcomment学生姓名;使用modify时要注意字段原有的约束和注释可能需要在语句中重新声明否则可能出现定义变化。修改字段名如果需要修改字段名称可以使用changealtertablestudent change assets avatar_pathvarchar(100)comment头像路径;change同时包含旧字段名、新字段名和字段定义。删除字段删除字段的语法如下altertabletable_namedropcolumn_name;例如altertablestudentdropgender;删除字段会同时删除该字段下保存的所有数据。执行前应确认字段是否还被业务代码、查询语句、索引或报表使用。重命名表可以使用rename to修改表名altertablestudentrenametostu;表重命名后所有依赖旧表名的 SQL、程序代码和运维脚本都需要同步调整。3.4 删除表删除表的语法如下droptable[ifexists]table_name;也可以一次删除多张表droptableifexistsstudent,course;drop table会删除表结构以及表中的全部数据。与删除数据库类似这也是高风险操作。生产环境执行前应先确认备份、依赖关系和执行环境。4. 小结MySQL 的基础模型可以概括为客户端通过 SQL 连接并操作 MySQL Server。一个 MySQL Server 可以管理多个数据库。一个数据库可以包含多张表。表由字段和记录组成字段定义结构记录保存数据。DDL 语句用于管理数据库对象结构常见操作包括create、alter和drop。