当前位置: 首页 > news >正文

【MySQL全面教学】MySQL基础SQL语句Day3(2026年)

欢迎来到MySQL系列教程的第3天!今天我们将学习SQL语句的基础操作,包括DDL(数据定义语言)、DML(数据操作语言)和DQL(数据查询语言)。这些将是日后最常用的SQL命令,务必熟练掌握。

文章目录

    • 一、写在前面
    • 二、DDL语句:数据库和表的操作
      • 2.1 数据库操作
      • 2.2 表操作:CREATE TABLE
      • 2.3 表操作:ALTER TABLE
      • 2.4 删除表
    • 三、DML语句:数据的增删改
      • 3.1 INSERT语句的多种写法
      • 3.2 UPDATE的安全写法
      • 3.3 DELETE和TRUNCATE的区别
    • 四、DQL基础:SELECT查询
      • 4.1 SELECT * 的坑
      • 4.2 别名和去重
    • 五、实战:创建电商订单系统相关表
      • 5.1 完整的电商表结构设计
      • 5.2 插入测试数据
    • 六、踩坑提醒
      • 6.1 UPDATE忘记WHERE的悲剧
      • 6.2 DELETE忘记WHERE的悲剧
    • 七、面试高频考点
      • 考点1:DELETE和TRUNCATE的区别?
      • 考点2:DROP和DELETE的区别?
      • 考点3:INSERT的几种写法?
      • 考点4:如何防止UPDATE/DELETE误操作?
    • 八、总结
    • 九、下一步预告
    • 十、参考资料
    • 互动话题

一、写在前面

SQL语句分为以下几类:

分类全称主要语句用途
DDLData Definition LanguageCREATE, DROP, ALTER定义数据库结构
DMLData Manipulation LanguageINSERT, UPDATE, DELETE操作数据
DQLData Query LanguageSELECT查询数据
DCLData Control LanguageGRANT, REVOKE权限控制
TCLTransaction Control LanguageCOMMIT, ROLLBACK事务控制

今天我们重点学习DDL、DML和DQL的基础用法。


二、DDL语句:数据库和表的操作

2.1 数据库操作

-- 创建数据库CREATEDATABASEIFNOTEXISTSecommerceDEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;-- 使用数据库USEecommerce;-- 查看所有数据库SHOWDATABASES;-- 查看当前数据库SELECTDATABASE();-- 删除数据库(危险操作!)DROPDATABASEIFEXISTSecommerce;-- 修改数据库字符集ALTERDATABASEecommerceCHARACTERSETutf8mb4;

经验之谈:创建数据库时务必指定utf8mb4字符集,支持完整的Unicode(包括emoji)。

2.2 表操作:CREATE TABLE

-- 创建用户表CREATETABLEIFNOTEXISTSusers(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEYCOMMENT'用户ID',usernameVARCHAR(50)NOTNULLUNIQUECOMMENT'用户名',emailVARCHAR(100)NOTNULLUNIQUECOMMENT'邮箱',phoneCHAR(11)COMMENT'手机号',passwordVARCHAR(255)NOTNULLCOMMENT'密码(加密存储)',statusTINYINTUNSIGNEDDEFAULT1COMMENT'状态:0-禁用 1-启用',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',INDEXidx_email(email),INDEXidx_phone(phone))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户表';

CREATE TABLE要点:

  • 每个表建议有id主键
  • 常用查询字段加索引
  • 必须设置字符集为utf8mb4
  • 添加COMMENT注释,方便维护

2.3 表操作:ALTER TABLE

-- 添加列ALTERTABLEusersADDCOLUMNnicknameVARCHAR(50)COMMENT'昵称'AFTERusername;-- 修改列类型ALTERTABLEusersMODIFYCOLUMNphoneVARCHAR(20)COMMENT'手机号(支持国际号码)';-- 修改列名(MySQL 8.0+)ALTERTABLEusersRENAMECOLUMNnicknameTOdisplay_name;-- 删除列ALTERTABLEusersDROPCOLUMNdisplay_name;-- 添加索引ALTERTABLEusersADDINDEXidx_created_at(created_at);-- 删除索引ALTERTABLEusersDROPINDEXidx_created_at;-- 修改表名ALTERTABLEusersRENAMETOsys_users;RENAMETABLEsys_usersTOusers;

2.4 删除表

-- 删除表(会删除数据和结构)DROPTABLEIFEXISTStemp_table;-- 清空表数据(保留结构)TRUNCATETABLEtemp_table;

三、DML语句:数据的增删改

3.1 INSERT语句的多种写法

-- 方式1:标准插入(推荐,明确指定列)INSERTINTOusers(username,email,phone,password)VALUES('zhangsan','zhangsan@example.com','13800138000','encrypted_pwd');-- 方式2:插入多行(性能更好)INSERTINTOusers(username,email,password)VALUES('lisi','lisi@example.com','pwd1'),('wangwu','wangwu@example.com','pwd2'),('zhaoliu','zhaoliu@example.com','pwd3');-- 方式3:使用SET语法INSERTINTOusersSETusername='sunqi',email='sunqi@example.com',password='pwd4';-- 方式4:从其他表插入(数据迁移常用)INSERTINTOusers_backup(username,email)SELECTusername,emailFROMusersWHEREstatus=0;-- 方式5:存在则更新,不存在则插入(UPSERT)INSERTINTOusers(id,username,email)VALUES(1,'newname','new@example.com')ONDUPLICATEKEYUPDATEusername=VALUES(username),email=VALUES(email);-- MySQL 8.0.19+ 新语法INSERTINTOusers(id,username,email)VALUES(1,'newname','new@example.com')ASnewONDUPLICATEKEYUPDATEusername=new.username,email=new.email;

经验之谈:

  • 生产环境务必指定列名,不要依赖列顺序
  • 批量插入比单条插入性能高很多
  • 使用INSERT IGNORE忽略重复键错误

3.2 UPDATE的安全写法

-- 危险!忘记WHERE会更新所有行!UPDATEusersSETstatus=0;-- 所有用户都被禁用了!-- 安全的UPDATE写法(先查询确认)-- 步骤1:先SELECT确认要更新的数据SELECT*FROMusersWHEREid=1;-- 步骤2:执行UPDATE(必须带WHERE)UPDATEusersSETstatus=0,updated_at=NOW()WHEREid=1;-- 使用LIMIT限制更新数量(保险措施)UPDATEusersSETstatus=0WHEREstatus=1LIMIT10;-- 多表UPDATEUPDATEusers uJOINorders oONu.id=o.user_idSETu.order_count=u.order_count+1WHEREo.status='completed';

3.3 DELETE和TRUNCATE的区别

-- DELETE:删除指定行,可以回滚,记录日志DELETEFROMusersWHEREid=1;-- DELETE忘记WHERE的补救:使用LIMITDELETEFROMusersLIMIT1;-- 只删1条-- TRUNCATE:清空整个表,速度快,不可回滚TRUNCATETABLEtemp_logs;
特性DELETETRUNCATE
删除范围可指定条件全部数据
执行速度较慢(逐行删除)很快(删除表重建)
事务回滚支持不支持
触发器会触发不会触发
自增计数保留重置
日志记录记录每行最小日志

四、DQL基础:SELECT查询

4.1 SELECT * 的坑

-- 不推荐:SELECT * 会返回所有列SELECT*FROMusers;-- 推荐:明确指定需要的列SELECTid,username,email,created_atFROMusers;-- 原因:-- 1. 网络传输更多数据-- 2. 可能包含敏感字段(password)-- 3. 表结构变化会影响应用程序-- 4. 无法利用覆盖索引优化

4.2 别名和去重

-- 列别名(AS可省略)SELECTidASuser_id,usernameASname,created_atASregister_timeFROMusers;-- 表别名(多表查询常用)SELECTu.id,u.usernameFROMusers u;-- 去重DISTINCTSELECTDISTINCTstatusFROMusers;-- 查看有哪些状态值-- 多列去重(组合唯一)SELECTDISTINCTstatus,genderFROMusers;

五、实战:创建电商订单系统相关表

5.1 完整的电商表结构设计

-- 用户表CREATETABLEusers(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)NOTNULLUNIQUE,phoneCHAR(11),passwordVARCHAR(255)NOTNULL,statusTINYINTUNSIGNEDDEFAULT1,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_phone(phone))ENGINE=InnoDBCOMMENT='用户表';-- 商品表CREATETABLEproducts(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(200)NOTNULLCOMMENT'商品名称',descriptionTEXTCOMMENT'商品描述',priceDECIMAL(10,2)NOTNULLCOMMENT'售价',stockINTUNSIGNEDDEFAULT0COMMENT'库存',statusTINYINTUNSIGNEDDEFAULT1COMMENT'0-下架 1-上架',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,INDEXidx_status_price(status,price))ENGINE=InnoDBCOMMENT='商品表';-- 订单表CREATETABLEorders(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,order_noVARCHAR(32)NOTNULLUNIQUECOMMENT'订单编号',user_idINTUNSIGNEDNOTNULLCOMMENT'用户ID',total_amountDECIMAL(10,2)NOTNULLCOMMENT'订单总金额',statusTINYINTUNSIGNEDDEFAULT0COMMENT'0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,INDEXidx_user_id(user_id),INDEXidx_order_no(order_no),INDEXidx_created_at(created_at),FOREIGNKEY(user_id)REFERENCESusers(id))ENGINE=InnoDBCOMMENT='订单表';-- 订单商品表(订单明细)CREATETABLEorder_items(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,order_idINTUNSIGNEDNOTNULLCOMMENT'订单ID',product_idINTUNSIGNEDNOTNULLCOMMENT'商品ID',product_nameVARCHAR(200)NOTNULLCOMMENT'商品名称(快照)',priceDECIMAL(10,2)NOTNULLCOMMENT'下单时价格',quantityINTUNSIGNEDNOTNULLCOMMENT'数量',subtotalDECIMAL(10,2)NOTNULLCOMMENT'小计金额',INDEXidx_order_id(order_id),FOREIGNKEY(order_id)REFERENCESorders(id),FOREIGNKEY(product_id)REFERENCESproducts(id))ENGINE=InnoDBCOMMENT='订单商品表';

5.2 插入测试数据

-- 插入用户INSERTINTOusers(username,email,phone,password)VALUES('user001','user001@test.com','13800138001','pwd001'),('user002','user002@test.com','13800138002','pwd002'),('user003','user003@test.com','13800138003','pwd003');-- 插入商品INSERTINTOproducts(name,description,price,stock)VALUES('iPhone 15','苹果最新手机',5999.00,100),('MacBook Pro','苹果笔记本电脑',14999.00,50),('AirPods Pro','无线耳机',1999.00,200);-- 插入订单INSERTINTOorders(order_no,user_id,total_amount,status)VALUES('ORDER202401010001',1,5999.00,1),('ORDER202401010002',1,1999.00,0),('ORDER202401010003',2,14999.00,2);-- 插入订单明细INSERTINTOorder_items(order_id,product_id,product_name,price,quantity,subtotal)VALUES(1,1,'iPhone 15',5999.00,1,5999.00),(2,3,'AirPods Pro',1999.00,1,1999.00),(3,2,'MacBook Pro',14999.00,1,14999.00);

六、踩坑提醒

6.1 UPDATE忘记WHERE的悲剧

真实案例:某运营人员执行了以下SQL:

-- 本意:只禁用某个违规用户UPDATEusersSETstatus=0;-- 结果:所有用户都被禁用了!网站瘫痪!

防范措施:

  1. 执行UPDATE前先用SELECT确认
  2. 使用SET sql_safe_updates = 1;开启安全模式
  3. UPDATE必须带WHERE条件
-- 开启安全更新模式SETsql_safe_updates=1;-- 此时执行无WHERE的UPDATE会报错UPDATEusersSETstatus=0;-- ERROR 1175 (HY000): You are using safe update mode...

6.2 DELETE忘记WHERE的悲剧

-- 本意:删除测试数据DELETEFROMorders;-- 结果:所有订单都没了!

防范措施:

  1. 先用SELECT确认要删除的数据
  2. 使用事务,删除前可以回滚
  3. 重要数据先备份
-- 安全的删除流程STARTTRANSACTION;SELECT*FROMordersWHEREstatus=4;-- 确认要删除的已取消订单DELETEFROMordersWHEREstatus=4;-- 确认无误后提交COMMIT;-- 如果有问题回滚-- ROLLBACK;

七、面试高频考点

考点1:DELETE和TRUNCATE的区别?

答案:

  1. DELETE是DML语句,TRUNCATE是DDL语句
  2. DELETE可以带WHERE条件删除部分数据,TRUNCATE只能清空全部
  3. DELETE逐行删除,记录日志,可以回滚;TRUNCATE直接删除表重建,速度快,不可回滚
  4. DELETE会触发表上的触发器,TRUNCATE不会
  5. DELETE保留自增计数,TRUNCATE重置自增计数

考点2:DROP和DELETE的区别?

答案:

  • DROP是DDL语句,删除整个表(结构和数据)
  • DELETE是DML语句,只删除数据,保留表结构
  • DROP不可回滚,DELETE在事务中可以回滚

考点3:INSERT的几种写法?

答案:

  1. INSERT INTO table (cols) VALUES (...)- 标准插入
  2. INSERT INTO table VALUES (...)- 省略列名(不推荐)
  3. INSERT INTO table SET col1=val1, col2=val2- SET语法
  4. INSERT INTO table SELECT ...- 从其他表插入
  5. INSERT ... ON DUPLICATE KEY UPDATE- 存在更新,不存在插入

考点4:如何防止UPDATE/DELETE误操作?

答案:

  1. 开启sql_safe_updates安全模式
  2. 执行前先SELECT确认
  3. 使用事务,先执行后确认再提交
  4. 重要操作先在测试环境验证
  5. 定期备份数据

八、总结

今天我们学习了:

  1. DDL语句:CREATE/DROP/ALTER操作数据库和表结构
  2. DML语句:INSERT/UPDATE/DELETE操作数据
  3. DQL语句:SELECT基础查询
  4. 实战:创建了电商系统的核心表

核心要点:

  • 创建表要设置utf8mb4字符集
  • UPDATE/DELETE必须带WHERE条件
  • SELECT不要直接用*,指定需要的列
  • 重要操作前先备份,使用事务保护

九、下一步预告

Day4:MySQL条件查询与排序

我们将学习:

  • WHERE子句的各种条件写法
  • NULL值的处理
  • ORDER BY排序技巧
  • LIMIT分页实现
  • 电商系统的各种查询场景

十、参考资料

  1. MySQL 8.0官方文档 - SQL语句
  2. SQL必知必会(第5版)
  3. MySQL是怎样运行的:从根儿上理解MySQL

互动话题

  1. 你在工作中有没有遇到过UPDATE/DELETE忘记WHERE的惊险时刻?后来怎么解决的?
  2. 你们公司的数据库表设计规范有哪些?欢迎在评论区分享!
  3. 对于电商系统的表设计,你有什么优化建议?

如果觉得有帮助,请点赞+收藏+关注!我们Day4见!

http://www.cnnetsun.cn/news/2529707.html

相关文章:

  • Hurley开源工具:C#到C语言的语义级跨平台翻译
  • JustTrustMe与Frida协同构建Android可信动态分析基座
  • 大模型MoE架构揭秘:为何仅2%参数决定推理性能
  • 企业团队如何利用Taotoken统一管理多项目API密钥与用量
  • DownKyi终极指南:5个技巧让你成为B站视频下载专家
  • Unity Shader从GPU原理入门:顶点与片元着色器硬核解析
  • 观察在流量高峰时段通过Taotoken调用不同模型的响应时间表现
  • Win11Debloat:三步让你的Windows 11告别卡顿,重获新生
  • 【YOLO目标检测全栈实战】69 内存碎片化:量化模型在边缘设备上的隐形杀手
  • Unity手搓合并网格工具:从Draw Call优化到生产级鲁棒性
  • 企业级定制化条形码解析:突破ZXing框架限制的高性能解决方案
  • 3步搞定Spotify音乐永久保存:开源下载神器完全指南
  • CTF自动化实战指南:Web与逆向脚本设计+e春秋靶场API深度利用
  • Unity 2D基础:2D相机Orthographic的参数调节
  • Source Han Serif CN:终极免费字体解决方案快速上手指南
  • 企业AI使用政策设计:DeepSeek类大模型的合规落地七步法
  • ZXing条形码识别库的模块化架构演进与性能优化策略
  • Lovable ML平台搭建避坑清单(2020–2024年137个真实故障案例提炼的12个致命陷阱)
  • 在构建自动化工作流时集成稳定可靠的大模型API
  • 【AI Agent机器学习实战指南】:20年专家亲授5大落地陷阱与3步高效部署法
  • AI Agent赋能5G核心网自动化闭环(独家实测数据:OSS响应效率提升87%)
  • 从串口数据到实时波形:SerialPlot终极可视化指南
  • 从立案到执行全链路AI协同(某红圈所内部培训PPT首度流出:含12个不可商用的训练数据陷阱)
  • gibMacOS深度技术解析:跨平台macOS组件下载与构建系统
  • 攻克葫芦科转化难题:甜瓜高效遗传转化体系构建与服务实践
  • 别再硬扛了!书匠策AI把毕业论文拆成了“填空题“,2025届必看科普
  • 从SOPC Builder到Platform Designer:聊聊Intel FPGA里那个被低估的系统搭建工具Qsys进化史
  • 朱雀广告平台:模块化架构解析与高并发实时竞价实践指南
  • AI Agent在体脂管理中的临床级精度突破:基于3276名受试者的双盲对照试验(FDA Class II类器械预审中)
  • OpCore Simplify:3分钟搞定OpenCore EFI配置的终极解决方案