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

MySQL数据表操作与CRUD详解:从建表、插入到查询的全流程

哈喽大家好!我是你们的大二学长。最近在复习《数据库原理》这门课,刚好把老师上课讲的内容整理成了笔记,想着发到博客上和大家分享一下,希望能帮到同样在学 SQL 的同学们。

今天的博客主要分为两部分:前一课的复习新增(Insert)操作和查询(Retrieve)的详解


一、 前一课复习:MySQL 数据表操作

首先,我们来快速回顾一下上一节课关于数据表的基础操作。这部分主要是掌握如何对“表”这个层面进行管理,而不是表里的具体数据。

1. 查看所有表

如果你已经选中了当前的数据库(记得先用use 数据库名;指定哦),可以使用这条命令来查看里面所有的表:

show tables

2. 创建表

创建表的时候,需要指定表名以及每一列的名字和数据类型。语法很简单:

create table 表名 (列名 类型, 列名 类型, 列名 类型....)

这里要注意的是数据类型。常用的类型有:int,bigint,double,decimal,varchar,text,datetime等等。不同的业务场景要选对合适的类型,比如存年龄用int,存名字用varchar

3. 查看表结构

建完表或者想看表里有哪些字段,可以用这个命令:

desc 表名;

4. 修改表

如果表建错了,需要改表结构(比如加一列、删一列),可以用:

alter table 表名 选项

5. 删除表

如果不需要这个表了,直接删掉(注意:删表是不可逆的,要小心使用!):

drop table 表名;

二、 核心内容:增删改查(CRUD)

接下来就是今天的重点啦!作为 Java 后端开发,以后工作中最核心的任务之一就是进行CRUD​ 操作。

CRUD 是对数据库记录的基本操作,分别是:

  • Create (创建) —— 也就是我们这节课要讲的INSERT

  • Retrieve (读取) —— 也就是SELECT

  • Update (更新) —— 也就是UPDATE

  • Delete (删除) —— 也就是DELETE

今天我们重点攻克第一步:Create(插入数据)


三、 Insert 语句进行新增

1. 基本语法与示例

插入数据的基本语法是这样的:

INSERT [INTO] table_name [(column_list)] VALUES (value_list), (value_list) ...

举一个非常经典的例子,我们先创建一个student表:

create table student( id int, name varchar(20), gender int); -- 可以使用 1 表示男性 0 表示女性

然后插入一条数据:

insert into student values (1, '张三', 1);

这里有几个点需要注意:

  • 这一行数据里的三个值(1, '张三', 1)分别对应表里的id,name,gender

  • 值的数量和顺序必须跟表的列数匹配。

  • 关于引号:SQL 里表示字符串常量,可以用单引号'张三',也可以用双引号"张三"。这和 C++/Java 不一样,它们区分字符和字符串;但在 SQL 里,单双引号都表示字符串。

2. 指定列插入

有时候我们可能不想一次性把所有列的数据都插进去,或者想调整插入的顺序,就可以指定列来插入:

-- 指定列插入 insert into student (id, name) values(1, '张三'); insert into student (name, id) values('张三', 1);

注意:虽然我们可以调整列的顺序,但括号里写的列名必须是表里真实存在的,而且后面给的值要和前面的列一一对应。

3. 命名规范的小提示

在创建表指定列名时,如果列名有多个单词,该怎么写呢?

  • studentName(驼峰命名,Java 里很普遍)

  • student_name(蛇形命名,C/Python 里很普遍)

在数据库里,蛇形命名是更常见的习惯。而且后续我们学 JavaEE 进阶,讲到 MyBatis 这样的框架时,它默认就会把数据库表的蛇形命名和 Java 代码的驼峰命名自动关联起来,所以养成用student_name的习惯会更好。

4. 一次插入多行数据

如果我们要插入很多条数据,一条条写是不是太累了?其实可以一次插入多行:

-- 一次插入多行数据 insert into student values(5, '赵六', 0), (6, '田七', 1), (7, '周八', 0);

或者分开写三条:

insert into student values(5, '赵六', 0); insert into student values(6, '田七', 1); insert into student values(7, '周八', 0);

为什么推荐第一种一次插入多行的方式呢?

因为数据库是客户端-服务器结构的程序。你每发一条 SQL 命令,客户端都要和服务器通信一次。一次插入多行,只需要通信一次,速度更快!而且数据库服务器有一个非常重要的功能叫“事务”,每个 SQL 也会开启一个事务(本身也是有开销的),合并操作能减少这种开销。

最后,我们怎么确认数据插进去了呢?当然是用查询语句:

-- 通过 select 语句查询表的内容。 select * from student;

四、Retrieve 检索(查询)操作

作为 CRUD 里的 “R”,查询(Retrieve)​ 是我们从数据库里“拿数据”的核心操作。老师课上重点讲了select语句的几种用法:

1. 全列查询

最基础的查询方式,就是把一张表的所有行、所有列都查出来:

select * from 表名;

这里的*叫做通配符,代指“所有列”。比如查询student表的所有内容:

select * from student;

⚠️危险操作警告

“这也是数据库的危险操作!!!”。为啥呢?因为数据库是客户端-服务器结构的程序(就像你用电脑连公司服务器办公一样)。如果是自己学习用的小表,select *无所谓;但在公司的生产环境(线上环境,用户正在用的那种)里,表可能非常大(比如百万级数据),select *会一次性把所有数据从服务器传到客户端,直接把服务器的硬盘、网卡带宽“吃满”,导致系统卡顿甚至崩溃!

2. 指定列查询

实际工作中,一张表可能有十几列、几十列,但我们往往只需要关注某几列。这时候就可以指定列名来查询,能大幅降低硬盘和网卡的 IO 开销(就像走“高速公路”,只取需要的车道):

select 列名, 列名..... from 表名

比如,我们只查student表的nameid

select name, id from student;

3. 带有表达式的查询

select不仅能查原始列,还能根据列进行计算(比如成绩求和、数值运算等)。语法是:

select 表达式 from 表名;

举个例子,用一个exam表(存了语文、数学、英语成绩),先建表+插数据:

CREATE TABLE exam ( id BIGINT, name VARCHAR(20) COMMENT '同学姓名', chinese float COMMENT '语文成绩', math float COMMENT '数学成绩', english float COMMENT '英语成绩' ); -- 插入测试数据 INSERT INTO exam (id, name, chinese, math, english) VALUES (1, '唐三藏', 67, 98, 56), (2, '孙悟空', 87, 78, 77), (3, '猪悟能', 88, 98, 90), (4, '曹孟德', 82, 84, 67), (5, '刘玄德', 55, 85, 45), (6, '孙权', 70, 73, 78), (7, '宋公明', 75, 65, 30);

现在,我们想给每个同学的语文成绩 +10,就可以用表达式查询:

select name, chinese + 10 from exam;

再比如,查询每个同学的总成绩(语文+数学+英语):

select name, chinese + math + english from exam;

⚠️ 注意:这种“复杂表达式”作为列名时,可读性会比较差(比如chinese + math + english看起来不够直观)。

4. 表达式查询时指定别名

为了解决“表达式列名可读性差”的问题,我们可以给表达式起一个别名(外号),语法:

select 表达式 as 别名 from 表名;

as可以省略,但不建议省略(写上能提高代码可读性)。比如,给总成绩列起别名total

select name, chinese + math + english as total from exam;

或者省略as(但不推荐,容易看错):

select name, chinese + math + english total from exam;

💡 额外小技巧:表也可以起别名!尤其是多表查询时,表别名很重要。比如:

select name, chinese + math + english from exam as e;

老师强调:写代码的核心原则是可读性!“可读性 > 代码执行效率”(只要不是特别夸张的低效,优先让代码好懂)。

最后碎碎念

今天复习了数据表操作,学习了insert插入,又学了select查询的几种操作。感觉 SQL 真的是“细节决定成败”,比如select *的危险、别名的必要性,这些都是实际工作中踩过坑才明白的点。

后续还要学update(更新)、delete(删除),以及多表查询、聚合函数这些进阶内容。慢慢来吧,先把基础打扎实~加油

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

相关文章:

  • 什么是驱动?
  • 多层建筑内部引导疏散路径优化与仿真多智能体建模【附代码】
  • 用贪心算法搞定多机调度:一个Python实现带你理解最长处理时间优先策略
  • Arm Fast Models硬件追踪组件在嵌入式调试中的应用
  • 实测避坑:ESP32 ADC采样率虚标?手把手教你用DMA模式获取真实数据(附IDF V4.4.2修复方案)
  • 大模型动态记忆管理:MemAct框架原理与实践
  • 沉淀仓核心配件(H 管)安装与作用
  • DDrawCompat解决方案:让Windows 11完美运行DirectX 1-7经典游戏
  • Hyprland窗口抖动插件开发:从原理到编译配置全解析
  • Python 3.15 WASM部署全链路踩坑手册,含Pyodide 0.26+、Emscripten 3.1.61兼容矩阵与内存泄漏修复补丁(仅限首批内测开发者)
  • Godot 3集成LuaJIT插件:原理、配置与高性能游戏脚本开发实践
  • 知网重复率过了,却卡在 AIGC 疑似率高?这 3 个降重工具能帮你一次搞定
  • StarRailCopilot:崩坏星穹铁道全自动脚本终极解决方案
  • 手把手教你用STM32F407软件模拟I2S驱动SIPEED麦克风阵列(附完整代码)
  • RoboMaster开发板C型嵌入式开发:从零到机器人控制的完整指南
  • 神经网络扰动下的局部高斯性与熵增现象研究
  • 揭秘Sentinel-2/Landsat自动解译流水线:如何用3行代码调用高精度AI模型完成农田/水体/城市变化检测?
  • LLM de skill 和tools 实现代码生成与命令行执行:LangGraph智能Agent实战
  • AUTOSAR CanNm实战:巧用‘降低总线负载’机制优化CAN网络性能
  • 别再让SonarQube成为代码泄露的源头:手把手教你配置API接口访问权限(附安全加固清单)
  • Xilinx Virtex II FPGA配置与PLD编程实战指南
  • 别再纠结了!嵌入式项目选I2C、SPI还是UART?一张图帮你搞定(附避坑指南)
  • FanControl终极指南:Windows风扇控制软件完整使用教程
  • 保姆级教程:用S32K SDK的FLEXCAN驱动实现按键控制LED的CAN通信(基于S32K118)
  • 2025届毕业生推荐的五大降重复率工具推荐
  • Jenkins Pipeline避坑指南:从‘Hello World’到实战,我踩过的那些Groovy语法和插件坑
  • 别再手动记日志了!用Python logging模块给你的PyTorch/TensorFlow训练过程做个‘自动秘书’
  • OpenClaw部署助手:零代码一键部署AI智能体网关的实践指南
  • 2026年研究生学位论文降AI攻略:硕士博士论文高标准降AI分章处理完整方案
  • YOLOv5损失函数调优笔记:用VariFocal Loss替代Focal Loss后,我的小目标检测项目发生了什么变化?