数据库教程FGMT35‑MySQL数据类型与SQL增删改查实战
2026/9/14 23:27:16 网站建设 项目流程

数据库教程FGMT35‑MySQL数据类型与SQL增删改查实战

前言

风哥教程本文面向MySQL数据库运维与开发技术人员,围绕数据类型选型、数据库对象管理、DML数据操作、DQL查询语法、事务控制开展完整技术阐述。在企业生产环境中,数据库的性能隐患、业务逻辑异常、数据损坏,很多根源并非复杂架构故障,而是字段数据类型选择不合理、SQL语句书写不规范、事务使用不当造成。

风哥教程本文实验环境规划两套完全独立的MySQL实例环境,两套环境业务互不关联,不属于同一台物理主机。第一套实验主机名称为fgedu‑net‑cn1,第二套实验主机名称为fgedu‑net‑cn2,硬件规格统一为64G内存、8CPU,数据库实例名统一为fgedudb,业务操作用户为fgedu,软件根目录统一为/fgedudb。两套环境可以分别用来完成对比测试,一套执行基础语法验证,另一套用于复现故障场景,避免测试数据互相干扰。

风哥教程本文内容分为理论知识与实操演练两大板块,理论部分讲解MySQL各类数据类型、字符集、存储引擎、事务隔离级别底层原理;实操部分包含大量可直接执行的SQL命令、操作系统层面操作步骤,所有命令适配/fgedudb路径、fgedudb实例、fgedu业务用户。风哥针对本文总结部分放在文档末尾,用于梳理关键风险点与生产落地注意事项。

风哥教程本文覆盖主要知识模块:SQL语言基础与数据类型;数据库命名规范、字符集与数据库设计规范;数值、日期、字符、JSON数据类型;存储引擎管理;数据库与表对象DDL操作;INSERT、UPDATE、DELETE、REPLACE DML操作;DELETE/TRUNCATE/DROP三者区别;事务基础与隔离级别;SELECT查询、多表各类JOIN连接;子查询语法。

网上搜索风哥教程可以学习全套数据库教程

一、MySQL数据类型与SQL语言基础理论知识

1.1 SQL语言基础理论

SQL结构化查询语言分为DDL数据定义语言、DML数据操纵语言、DQL数据查询语言、TCL事务控制语言、DCL数据控制语言。DDL负责库、表、索引等对象结构定义;DML负责表内部数据的插入、修改、删除;DQL负责数据查询检索;TCL完成事务提交、回滚的事务生命周期管控;DCL用于权限账号管理。

DDL语句执行会触发元数据锁MDL,在生产大并发业务中,长时间运行的DDL会阻塞业务DML语句,这是MySQL运维中非常经典的风险点。DML语句仅操作行数据,不会直接修改表结构,InnoDB存储引擎下DML操作会被事务包裹,可以执行回滚操作;DDL属于非事务语句,一旦执行成功,无法通过事务回滚撤销,生产执行DDL操作需要充分评估业务业务流量窗口。

1.2 数据库命名规范理论

数据库、数据表、字段对象命名遵循生产通用规范,对象名称尽量使用英文语义词汇,禁止使用MySQL保留关键字作为库名、表名、字段名;库、表名称区分大小写受操作系统底层文件系统影响,Linux环境数据库目录对应操作系统文件夹,因此库名表名大小写敏感;Windows环境文件系统不区分大小写。为保证跨平台兼容性,统一全部使用小写命名,下划线_作为分隔符,不使用中文对象名。对象名称长度控制在64字符以内,禁止特殊符号。

1.3 字符集与排序规则理论

字符集决定数据字节存储编码,排序规则collation定义字符串比较、排序逻辑。MySQL历史版本utf8字符集只支持最多3字节,无法完整存储emoji表情;utf8mb4完整支持4字节unicode字符,是生产环境标准推荐字符集。排序规则后缀_ci代表大小写不敏感,_cs大小写敏感,_bin二进制字节比较。

字符集分为实例级别、数据库级别、表级别、字段级别,层级优先级:字段 > 表 > 数据库 > 实例。如果建库没有显式指定字符集,则继承实例全局字符集;建表没有指定字符集,继承数据库字符集。生产环境建议实例my.cnf配置文件中直接设置全局character‑set‑server=utf8mb4,从源头避免中文乱码问题。

上51CTO搜索风哥可以学习全套数据库教程

1.4 MySQL各类数据类型底层原理

1.4.1 数值类型

数值类型分为整数类型、定点小数、浮点类型。整数包含TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,不同类型占用存储空间不一样,存储范围固定,可以增加UNSIGNED修饰符去掉负数区间,扩大正数存储上限。定点数DECIMAL用于金额、账务等需要精确计算的业务,内部使用二进制字符串存储,不会产生浮点精度丢失;FLOAT、DOUBLE二进制浮点数,存在精度丢失,财务业务严禁使用。

类型占用字节带符号范围
TINYINT1-128 ~127
SMALLINT2-32768~32767
MEDIUMINT3-8388608~8388607
INT4-2147483648~2147483647
BIGINT8-9223372036854775808 ~9223372036854775807
1.4.2 日期时间类型

DATE仅存储年月日;TIME存储时分秒;DATETIME存储完整年月日时分秒,时间范围大,不受2038时间溢出限制;TIMESTAMP底层存储为时间戳,受时区影响,存在2038上限风险。生产业务优先选用DATETIME记录业务时间。

1.4.3 字符字符串类型

CHAR为定长字符串,定义多少字符,物理存储就占用对应空间,不足长度会在尾部填充空格,读取的时候自动去除尾部空格,适合长度固定字段,例如身份证号码、手机号。VARCHAR可变长度字符串,实际占用存储空间跟随真实数据大小,额外增加1‑2字节记录字符串实际长度,适合长短变化大的业务文本。TEXT大文本类型,存储超长文本,TEXT字段不会放在行数据主存储区,使用溢出页存放,大量使用TEXT会降低表扫描性能,大文本业务尽量拆分子表。

风哥 itpux‑com

1.4.4 JSON数据类型

MySQL5.7开始原生支持JSON字段,专门存储JSON结构化文档,不再使用TEXT/VARCHAR直接存放JSON字符串。JSON字段拥有专用校验机制,写入非法JSON文档直接报错;提供大量内置JSON函数用于解析、修改、查询JSON内部key;8.0版本支持JSON部分原地更新,不需要重写完整文档。JSON适合半结构化业务数据,但不建议把全部业务都塞进JSON,核心过滤条件字段仍然需要设计为独立普通字段,JSON适合扩展属性。

1.5 MySQL存储引擎理论

存储引擎是MySQL底层数据读写组件,一张表只能选择一种存储引擎。InnoDB是MySQL8.x版本默认存储引擎,完整支持事务ACID、MVCC多版本并发控制、行级锁、外键约束、崩溃恢复,是在线业务标准选择。MyISAM不支持事务,使用表级锁,崩溃后无法保证数据安全,现在线上业务已经很少使用。

存储引擎可以数据库级别设置默认引擎,也可以单张表单独指定ENGINE参数。修改表存储引擎会触发表重建,大数据量表执行ALTER修改存储引擎会产生大量IO,业务高峰严禁操作。

1.6 事务原理与隔离级别理论

事务ACID:原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。InnoDB依靠undo回滚日志实现原子性,redo重做日志保证持久性,MVCC多版本实现隔离性。MySQL InnoDB默认隔离级别是REPEATABLE‑READ可重复读。四个隔离级别分别是READ UNCOMMITTED读未提交、READ COMMITTED读已提交、REPEATABLE READ可重复读、SERIALIZABLE串行化。隔离级别越低,并发性能越好,会出现越多脏读、不可重复读、幻读现象;隔离级别越高,并发性能下降。

风哥教程 113257174

二、实验环境基础准备(两套独立环境 fgedu‑net‑cn1、fgedu‑net‑cn2)

两套主机硬件均为64G内存,8CPU,MySQL软件部署路径/fgedudb,实例名fgedudb。下面给出my.cnf核心配置,两套主机配置参数保持一致。

[mysqld] basedir=/fgedudb/mysql-base datadir=/fgedudb/mysql-data socket=/fgedudb/mysql.sock pid‑file=/fgedudb/fgedudb.pid port=3306 server‑id=1 user=mysql character‑set‑server=utf8mb4 collation‑server=utf8mb4_0900_ai_ci #64G内存8CPU参数配置 innodb_buffer_pool_size=32G innodb_buffer_pool_instances=16 innodb_log_file_size=4G innodb_log_files_in_group=2 innodb_flush_log_at_trx_commit=1 sync_binlog=1 max_connections=800 max_connect_errors=10000 max_allowed_packet=64M tmp_table_size=2G max_heap_table_size=2G log_error=/fgedudb/log/fgedudb‑error.log slow_query_log=ON slow_query_log_file=/fgedudb/log/fgedudb‑slow.log

2.1 fgedu业务用户创建,两套主机分别执行

登录mysql客户端,分别在fgedu‑net‑cn1与fgedu‑net‑cn2执行,两套环境账号互相独立:

CREATEUSER'fgedu'@'%'IDENTIFIED'FgEdu@2026';GRANTALLPRIVILEGESON*.*TO'fgedu'@'%';FLUSHPRIVILEGES;

风哥数据库教程 itpux‑com

登录数据库示例命令,主机分别替换主机名:

#主机 fgedu‑net‑cn1/fgedudb/mysql-base/bin/mysql-ufgedu-p-S/fgedudb/mysql.sock#主机 fgedu‑net‑cn2/fgedudb/mysql-base/bin/mysql-ufgedu-p-S/fgedudb/mysql.sock

三、数据库与数据表DDL实操演练

本章节全部操作优先在主机fgedu‑net‑cn1执行;fgedu‑net‑cn2主机可以重复同样操作,用于做对比测试。

3.1 数据库的创建、查看、切换、删除

创建业务数据库fgedudb,显式指定字符集与排序规则:

CREATEDATABASEIFNOTEXISTSfgedudbDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_0900_ai_ci;

查看实例全部数据库:

SHOWDATABASES;

切换当前会话使用的数据库:

USEfgedudb;

查看当前所在数据库:

SELECTDATABASE();

查看数据库建库完整语句:

SHOWCREATEDATABASEfgedudb;

安全删除数据库(IF EXISTS避免库不存在时报错),谨慎执行,会删除库下面全部表与数据:

DROPDATABASEIFEXISTSfgedudb;

3.2 存储引擎查看与修改实操

查看当前实例支持的全部存储引擎:

SHOWENGINES;

查看全局默认存储引擎:

SHOWVARIABLESLIKE'default_storage_engine';

修改会话级别默认存储引擎,当前会话生效:

SETSESSIONdefault_storage_engine=InnoDB;

创建测试业务表,指定ENGINE存储引擎,演示各类数据类型:

CREATETABLEfgedu_business(idBIGINTAUTO_INCREMENTPRIMARYKEYCOMMENT'主键ID',ageTINYINTUNSIGNEDCOMMENT'年龄,无符号整数',salaryDECIMAL(12,2)COMMENT'薪资,定点高精度小数',birthDATECOMMENT'出生日期',create_timeDATETIMECOMMENT'记录创建时间',phoneCHAR(11)COMMENT'手机号定长字符',usernameVARCHAR(64)COMMENT'用户姓名变长字符',remarkTEXTCOMMENT'备注大文本',ext_info JSONCOMMENT'扩展JSON属性')ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='风哥教程业务测试表';

网上搜索风哥教程可以学习全套数据库教程

查看数据库下面全部数据表:

SHOWTABLES;

查看表结构字段详情:

DESCfgedu_business;

查看建表完整DDL语句:

SHOWCREATETABLEfgedu_business;

修改表的存储引擎,生产大表禁止业务高峰运行:

ALTERTABLEfgedu_businessENGINE=InnoDB;

表重命名操作:

ALTERTABLEfgedu_businessRENAMETOfgedu_bak_business;ALTERTABLEfgedu_bak_businessRENAMETOfgedu_business;

截断表TRUNCATE,清空全部行数据,保留表结构,DDL操作,不能回滚:

TRUNCATETABLEfgedu_business;

删除整张数据表,元数据和数据全部清除,DDL,不可回滚:

DROPTABLEIFEXISTSfgedu_business;

修改字段定义,修改username字段长度:

ALTERTABLEfgedu_businessMODIFYCOLUMNusernameVARCHAR(128);

新增字段:

ALTERTABLEfgedu_businessADDCOLUMNemailVARCHAR(128);

删除字段:

ALTERTABLEfgedu_businessDROPCOLUMNemail;

四、DML增删改replace实战操作

4.1 INSERT插入数据

插入单行完整字段数据:

INSERTINTOfgedu_business(age,salary,birth,create_time,phone,username,remark,ext_info)VALUES(28,15800.50,'1998‑05‑12',NOW(),'13800138000','zhangsan','普通业务用户','{"level":"normal","tag":["member"]}');

插入多条记录,一次values多组括号,减少网络交互:

INSERTINTOfgedu_business(age,salary,birth,create_time,phone,username,remark,ext_info)VALUES(32,22000.00,'1994‑03‑22',NOW(),'13900139000','lisi','高级付费用户','{"level":"vip","tag":["vip","member"]}'),(24,9200.00,'2000‑11‑05',NOW(),'13700137000','wangwu','新注册用户','{"level":"new","tag":["new"]}');

不写字段列表,按表字段顺序赋值,生产不推荐,表结构变更语句直接报错:

INSERTINTOfgedu_businessVALUES(NULL,26,11000,'1999‑07‑01',NOW(),'13600136000','zhaoliu','测试用户','{"level":"test"}');

4.2 UPDATE更新数据

⚠️重要风险:不带WHERE条件UPDATE会更新全表所有行,生产环境执行UPDATE前,建议先用SELECT校验WHERE条件返回的行数。
带条件更新单行部分字段:

UPDATEfgedu_businessSETsalary=16800.50,remark='薪资调整后普通用户'WHEREid=1;

多字段同时更新:

UPDATEfgedu_businessSETage=33,salary=23500WHEREusername='lisi';

表达式运算更新,薪资上浮500:

UPDATEfgedu_businessSETsalary=salary+500WHEREid=2;

4.3 DELETE删除行数据

DELETE删除满足where条件的行记录,属于DML,InnoDB支持事务回滚,会生成undo日志与binlog。
删除指定id行:

DELETEFROMfgedu_businessWHEREid=4;

⚠️不带WHERE条件会删除全部表数据,不会删除表结构。

-- 危险语句,禁止直接执行-- DELETE FROM fgedu_business;

4.4 REPLACE语法实操

REPLACE逻辑:根据主键或者唯一索引,如果记录已经存在,先DELETE旧行,再INSERT新行;不存在则直接INSERT。依赖主键/唯一键,没有唯一约束,REPLACE等价INSERT。

REPLACEINTOfgedu_business(id,age,salary,username)VALUES(1,29,17200,'zhangsan_update');

4.5 DELETE / TRUNCATE / DROP三者对比实操验证

  1. DELETE:DML,删除行,保留表结构;可以事务回滚;会记录binlog;数据量大删除速度慢;释放空间不一定还给操作系统。
  2. TRUNCATE:DDL,清空全部行,保留表结构;无法回滚;重置自增主键;速度很快;直接回收数据页。
  3. DROP TABLE:DDL,删除表定义+全部数据,释放全部磁盘空间;不可回滚。

实操验证步骤(fgedu‑net‑cn2主机执行,隔离测试环境)

USEfgedudb;CREATETABLEtest_trunc(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(32));INSERTINTOtest_trunc(name)VALUES('a'),('b'),('c');BEGIN;DELETEFROMtest_truncWHEREid=1;SELECT*FROMtest_trunc;ROLLBACK;SELECT*FROMtest_trunc;-- DELETE支持回滚,数据恢复

再测试TRUNCATE,TRUNCATE不受事务回滚保护:

BEGIN;TRUNCATETABLEtest_trunc;ROLLBACK;SELECT*FROMtest_trunc;

执行DROP TABLE:

DROPTABLEtest_trunc;SHOWTABLES;

五、MySQL事务控制实操演练

InnoDB引擎支持完整事务,MyISAM不支持事务。事务关键字BEGIN / START TRANSACTION开启事务;COMMIT提交;ROLLBACK回滚。

USEfgedudb;BEGIN;UPDATEfgedu_businessSETsalary=salary‑1000WHEREid=1;UPDATEfgedu_businessSETsalary=salary+1000WHEREid=2;-- 此时只在当前会话可见,其他会话看不到修改结果SELECT*FROMfgedu_businessWHEREidIN(1,2);ROLLBACK;-- 回滚撤销全部修改SELECT*FROMfgedu_businessWHEREidIN(1,2);

提交事务案例:

STARTTRANSACTION;INSERTINTOfgedu_business(age,username)VALUES(27,'chenqi');COMMIT;SELECT*FROMfgedu_businessWHEREusername='chenqi';

查看当前会话事务隔离级别:

SELECT@@transaction_isolation;

修改当前会话隔离级别为READ‑COMMITTED:

SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;SELECT@@transaction_isolation;

六、DQL SELECT查询语言完整实操

6.1 SELECT基础查询语法

USEfgedudb;-- 查询全部列SELECT*FROMfgedu_business;-- 查询指定列SELECTid,username,salary,create_timeFROMfgedu_business;-- 列别名SELECTidAS用户ID,usernameAS用户姓名FROMfgedu_business;-- where条件过滤SELECT*FROMfgedu_businessWHEREage>=25ANDsalary>10000;-- order by排序SELECTid,username,salaryFROMfgedu_businessORDERBYsalaryDESC;-- group by分组统计SELECTage,COUNT(id)ASuser_countFROMfgedu_businessGROUPBYage;-- limit分页SELECT*FROMfgedu_businessLIMIT0,2;

6.2 准备多表用于JOIN连接演示

创建部门表fgedu_dept,用于多表关联查询:

CREATETABLEfgedu_dept(dept_idINTPRIMARYKEYAUTO_INCREMENT,dept_nameVARCHAR(64)NOTNULLCOMMENT'部门名称')ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;INSERTINTOfgedu_dept(dept_name)VALUES('研发部'),('市场部'),('运维部');ALTERTABLEfgedu_businessADDCOLUMNdept_idINT;UPDATEfgedu_businessSETdept_id=1WHEREidIN(1,2);UPDATEfgedu_businessSETdept_id=2WHEREid=3;
6.2.1 内连接 INNER JOIN

只返回两边匹配上的数据行

SELECTb.id,b.username,d.dept_nameFROMfgedu_business bINNERJOINfgedu_dept dONb.dept_id=d.dept_id;
6.2.2 左外连接 LEFT JOIN

左边表全部输出,右边没有匹配字段填充NULL

SELECTb.id,b.username,d.dept_nameFROMfgedu_business bLEFTJOINfgedu_dept dONb.dept_id=d.dept_id;
6.2.3 右外连接 RIGHT JOIN

右边表全部输出,左边无匹配填充NULL

SELECTb.id,b.username,d.dept_nameFROMfgedu_business bRIGHTJOINfgedu_dept dONb.dept_id=d.dept_id;
6.2.4 交叉连接 CROSS JOIN 笛卡尔积

不写on条件,返回两张表行数乘积,业务尽量避免

SELECT*FROMfgedu_businessCROSSJOINfgedu_dept;
6.2.5 自连接SELF JOIN

一张表别名两份,自己关联自己,适合组织层级、上下级场景。

CREATETABLEfgedu_emp(emp_idINTPRIMARYKEYAUTO_INCREMENT,emp_nameVARCHAR(32),mgr_idINTNULL);INSERTINTOfgedu_emp(emp_name,mgr_id)VALUES('boss',NULL),('emp_a',1),('emp_b',1);SELECTe1.emp_nameASemp_name,e2.emp_nameASmanager_nameFROMfgedu_emp e1LEFTJOINfgedu_emp e2ONe1.mgr_id=e2.emp_id;

6.3 子查询实操

简单WHERE标量子查询

SELECT*FROMfgedu_businessWHEREdept_id=(SELECTdept_idFROMfgedu_deptWHEREdept_name='研发部');

多行IN子查询

SELECT*FROMfgedu_businessWHEREdept_idIN(SELECTdept_idFROMfgedu_deptWHEREdept_id<=2);

EXISTS半连接子查询

SELECT*FROMfgedu_business bWHEREEXISTS(SELECT1FROMfgedu_dept dWHEREd.dept_id=b.dept_idANDd.dept_name='研发部');

NOT EXISTS反连接

SELECT*FROMfgedu_business bWHERENOTEXISTS(SELECT1FROMfgedu_dept dWHEREd.dept_id=b.dept_id);

风哥针对本文总结

风哥教程本文完整覆盖MySQL数据类型选型、DDL对象管理、DML增删改REPLACE、事务控制、多表JOIN、子查询全部基础知识点,两套独立实验主机fgedu‑net‑cn1、fgedu‑net‑cn2,硬件规格统一64G内存8CPU,配置文件参数按照生产数据库实例调优。

生产环境实践的关键风险要点总结如下:

  1. 字符集统一使用utf8mb4,禁止旧版utf8,防止4字节字符存储异常;库表字段命名全部小写,规避操作系统大小写兼容问题。
  2. 数据类型选择遵循够用原则,数值不要全部无脑选择BIGINT;金额账务业务必须使用DECIMAL,拒绝FLOAT/DOUBLE;固定长度字段优先CHAR,变长业务选择VARCHAR;大文本尽量避免频繁使用TEXT;JSON字段适合扩展属性,核心过滤条件拆为普通字段。
  3. InnoDB为业务标准存储引擎;DDL属于非事务语句,不可回滚,业务高峰期禁止执行ALTER、TRUNCATE、DROP;执行UPDATE、DELETE操作前,先用SELECT验证WHERE条件,杜绝不带WHERE条件的DML。
  4. DELETE可以回滚,TRUNCATE、DROP无法事务回滚,高危操作务必确认环境,测试环境与生产环境严格隔离。
  5. 事务优先掌握BEGIN、COMMIT、ROLLBACK,理解四个隔离级别差异,业务根据并发与数据一致性选择合适隔离级别。
  6. JOIN多表查询尽量写显式INNER JOIN / LEFT JOIN语法,不使用隐式逗号写法;尽量避免笛卡尔积;EXISTS半连接、NOT EXISTS反连接适合大数据量过滤场景。
  7. 所有测试操作优先在独立测试环境完成,不要直接在生产数据库执行陌生SQL命令。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询