news 2026/5/1 7:17:17

MYSQL的学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MYSQL的学习

mysql的分类

mysql在其内部根据功能的不同分为不同的语言

一、数据查询语言(DQL, Data Query Language)

核心作用:从数据库中查询 / 检索数据(仅读取,不修改数据),是最常用的 SQL 类别。

核心关键字SELECT(核心)、FROMWHEREGROUP BYHAVINGORDER BYLIMITJOIN等。

-- 查询年龄大于20的用户姓名和手机号,按年龄降序排列 SELECT name, phone FROM users WHERE age > 20 ORDER BY age DESC -- LIMIT 10;

二、数据操作语言(DML, Data Manipulation Language)

核心作用:操作(增 / 删 / 改)数据库中的数据(仅修改数据内容,不改变表结构)。

核心关键字INSERT(新增)、UPDATE(修改)、DELETE(删除)、MERGE(合并,部分数据库支持)。

-- 新增一条用户记录 INSERT INTO users (name, age, phone) VALUES ('张三', 25, '13800138000'); ​ -- 修改用户手机号 UPDATE users SET phone = '13900139000' WHERE id = 1; ​ -- 删除年龄小于18的用户 DELETE FROM users WHERE age < 18;

三、数据定义语言(DDL, Data Definition Language)

核心作用:定义 / 修改 / 删除数据库对象(表、索引、视图、触发器、数据库等)的结构,操作会直接生效(无需事务提交)。

核心关键字CREATE(创建)、ALTER(修改)、DROP(删除)、TRUNCATE(清空表,属于 DDL 而非 DML)、RENAME(重命名)。

执行后通常需要COMMIT(提交)确认修改,或ROLLBACK(回滚)撤销修改(事务控制)。

-- 创建用户表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, phone VARCHAR(20) UNIQUE ); ​ -- 给用户表新增email字段 ALTER TABLE users ADD COLUMN email VARCHAR(100); ​ -- 删除用户表 DROP TABLE users; ​ -- 清空用户表(删除所有数据且不可回滚) -- TRUNCATE TABLE users;

四、数据控制语言(DCL, Data Control Language)

核心作用:管理数据库的权限和事务,控制用户对数据库的访问权限、事务提交 / 回滚等。

核心关键字GRANT(授权)、REVOKE(撤销权限)、COMMIT(提交事务)、ROLLBACK(回滚事务)、SAVEPOINT(保存点)、SET TRANSACTION(设置事务属性)。

-- 授予用户test对users表的查询/插入权限 GRANT SELECT, INSERT ON users TO 'test'@'localhost'; ​ -- 撤销test用户的插入权限 REVOKE INSERT ON users FROM 'test'@'localhost'; ​ -- 提交事务(确认DML操作) COMMIT; ​ -- 回滚事务(撤销未提交的DML操作) ROLLBACK;

五、事务控制语言(TCL, Transaction Control Language)

补充说明:部分分类体系中,TCL 会从 DCL 中独立出来,专门聚焦事务管理(本质是 DCL 的子集)。

核心关键字COMMITROLLBACKSAVEPOINT

-- 开启事务(部分数据库需显式声明) START TRANSACTION; UPDATE users SET age = 26 WHERE id = 1; -- 设置保存点 SAVEPOINT sp1; DELETE FROM users WHERE id = 2; -- 回滚到保存点(仅撤销删除操作,修改操作保留) ROLLBACK TO sp1; -- 提交最终修改 COMMIT;

核心总结表

分类核心作用核心关键字典型操作
DQL查询数据SELECT、FROM、WHERE多表查询、统计
DML增删改数据INSERT、UPDATE、DELETE新增记录、改值
DDL定义 / 修改数据库结构CREATE、ALTER、DROP建表、删索引
DCL权限 / 事务控制(广义)GRANT、REVOKE、COMMIT授权、提交事务
TCL事务控制(狭义)COMMIT、ROLLBACK、SAVEPOINT回滚、保存点

表的创建

在mysql中一切数据都是基于表存在的,我们需要搭建框架才能将数据容纳进去。

注意,学习或者工作时要创建新的数据库,不要放在默认数据库内。

Navicat中创建(逐行创建表头,包含了名称,数据类型等)
CREATE TABLE `students` ( `stu_id` bigint(10) DEFAULT NULL COMMENT '学生学号', `stu_name` varchar(255) DEFAULT NULL COMMENT '学生姓名', `gender` varchar(255) DEFAULT NULL COMMENT '学生性别', `age` int(10) DEFAULT NULL COMMENT '学生年龄', `major` varchar(255) DEFAULT NULL COMMENT '学生专业', `clazz` varchar(255) DEFAULT NULL COMMENT '学生班级', `year` bigint(20) DEFAULT NULL COMMENT '入学年份' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
命令行中创建
CREATE TABLE `scores` ( `stu_id` bigint(10) DEFAULT NULL COMMENT '学生学号', `subject_id` int(10) DEFAULT NULL COMMENT '科目编号', `score` int(10) DEFAULT NULL COMMENT '考试分数', `type` varchar(255) DEFAULT NULL COMMENT '考试类型' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `scores` ( `stu_id` bigint(10) DEFAULT NULL COMMENT '学生学号', `subject_id` int(10) DEFAULT NULL COMMENT '科目编号', `score` int(10) DEFAULT NULL COMMENT '考试分数', `type` varchar(255) DEFAULT NULL COMMENT '考试类型' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

导入数据

Navicat导入向导

插入单条数据

insert into students values(20250101,'张三','男',20,'计算机科学与技术','计科2501',2025);
多行数据插入
insert into students(id,name,gender,age,major,clazz,year) values(20250101,'张三','男',20,'计算机科学与技术','计科2501',2025) ,(20250102,'李四','女',20,'计算机科学与技术','计科2501',2025) ,(20250103,'王五','男',19,'计算机科学与技术','计科2501',2025) ,(20250201,'赵六','女',20,'软件工程','软工2502',2025) ,(20250202,'孙七','男',20,'软件工程','软工2502',2025) ,(20250301,'周八','女',20,'大数据技术','大数据2501',2025) ,(20250302,'吴九','男',19,'大数据技术','大数据2501',2025) ,(20250401,'郑十','女',20,'人工智能','智能2501',2025) ,(20250104,'钱十','男',20,'计算机科学与技术','计科2501',20) ,(20250203,'孙十','女',20,'软件工程','软工2502',2025);

load data local infile 'D:\\Desktop\\mysqlmd\\data\\students.txt' into table students fields terminated by ',';

导出数据

Navicat导出向导
命令导出
# 不建议加密码,不安全 mysqldump -uroot -p stu students > /root/data/students.sql

xshell导入导出数据

不是在mysql中运行 是在shell中执行 即终端

  • 导入数据

load data local infile '路径' into table 表名 fields terminated by '分隔符';
  • 导出数据

# 数据库stu 表students 路径 mysqldump -uroot -p stu students > /root/data/mydb.sql ​ # 可以加到.bashrc中 alias db_backup='mysqldump -uroot -p stu students > /root/data/mydb_$(date +%Y%m%d).sql' ​ # 备份并压缩(生成 .sql.gz,节省空间) alias db_backup='mysqldump -uroot -p --single-transaction stu students | gzip > /root/data/mydb_$(date +%Y%m%d).sql.gz'

查看DDL & 查看当前数据库

-- 查看DDL语句 show crete table students; -- 查看当前数据库 select database();

限制查询

  • limit 关键字

select * from students limit 10;

表修改

ALTER语句

使用 ALTER TABLE 语句追加, 修改, 或删除列的语法

  • add

-- 增加字段 alter table students add [column] dateT date; ​ -- 设置默认值 alter table students add dateT date DEFAULT "2025-12-12";
  • modify

MODIFY后必须明确指定「字段类型」(哪怕只是修改注释,也要重新声明类型)

-- 修改字段类型,属性 alter table students modify dataT datetime; alter table students modify dateT date comment "日期"; ​ -- 修改字段默认不为空 alter table students modify stu_id int not null; ​ -- 修改字段默认可以为空 alter table students modify stu_id int default null;
  • drop

-- 删除字段 alter table students drop length; -- 另外写法 drop table table_name
  • change

-- 修改字段名称 alter table students change stu_id sid varchar(255);
  • character set

-- 修改表的字符集 alter table students character set utf8;
  • rename to

-- 修改表名 alter table students rename to student; -- 另外一种写法 rename table students to student;

表删除

-- 删除表
drop table [if not exist] students;

mysql基本语句

SQL基础语句

select语句
SELECT column1, column2, ... FROM table_name WHERE condition;

其中,SELECT关键字用于指定要查询的列,可以使用*代表所有列;FROM关键字用于指定要查询的表;WHERE关键字用于指定查询的条件。

select * from student where sex=’男’;
insert语句
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

其中,table_name是要插入数据的表名,column1、column2等是表中的列名,value1、value2等是要插入的值。

update语句
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE some_column = some_value;

其中,table_name是要更新数据的表名,column1、column2等是要修改的列名,value1、value2等是要修改的值,WHERE子句是用于指定要更新的行的条件。

delete语句
DELETE FROM table_name WHERE some_column = some_value;

其中,table_name是要删除数据的表名,WHERE子句是用于指定要删除的行的条件。

注意:如果不指定条件相当于删除表中所有数据

SQL基本查询

where子句

WHERE子句是结构化查询语言(SQL)中用于筛选数据的关键字。通过WHERE子句,您可以指定一个或多个条件来限制从数据库中检索的数据行。以下是WHERE子句的使用方式:

SELECT * FROM table_name WHERE some_column = some_value;
  • 操作符:

    WHERE子句可以使用以下比较运算符:

    =(等于)

    <(小于)

    >(大于)

    <=(小于或等于)

    >=(大于或等于)

    <>或!=(不等于)

还可以使用逻辑运算符(AND、OR和NOT)来组合多个条件。例如:

SELECT * FROM students WHERE sex = ‘男’ and age > 23;
  • 模糊搜索

-- 多字符匹配 SELECT * FROM students WHERE clazz like 'xx%' -- 单字符匹配 SELECT * FROM students WHERE stu_name LIKE '张_'; ​ -- 多关键词匹配:找姓名含“张”或“李”或“王”的学生 SELECT * FROM students WHERE name RLIKE '张|李|王' -- 范围匹配:找姓名含“张”且后面跟1-2个字符的学生(如“张三”“张三丰”) SELECT * FROM students WHERE name RLIKE '张.{1,2}';
  • in

返回选项中的内容

select * from students where clazz in ('xx','xx','xx');
  • BETWEEN AND

返回年龄在22到24的学生

select * from students where age BETWEEN 22 AND 24;
order by子句

ORDER BY子句用于对查询结果按照一个或多个列进行排序。它接受一个或多个列名或表达式作为参数,并可指定每个列的排序方式(ASC:升序,DESC:降序)。语法如下:

SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...
group by子句

GROUP BY子句用于将查询结果按照一个或多个列进行分组,并对每个组进行聚合计算(如COUNT、SUM、AVG等)。语法如下:

SELECT column1, column2, ..., avg(column_name) FROM table_name GROUP BY column1, column2, ... -- 嵌套where select * from (SELECT column1, column2, ..., aggregate_function(column_name) f FROM table_name GROUP BY column1, column2, ...) as t1 where t1.f > xxx;
having子句

HAVING子句用于对分组后的结果进行过滤,只返回符合条件的分组。它接受一个或多个聚合函数作为参数,并可指定每个函数的过滤条件。语法如下:

SELECT column1, column2, ..., aggregate_function(column_name) FROM table_name GROUP BY column1, column2, ... HAVING condition;
limit子句

LIMIT用于限制查询结果集的行数,其中,number是你想要返回的行数。其语法如下:

SELECT column1, column2, ... FROM table_name LIMIT number;
-- 多行查询 从number1起 limit number2个 SELECT column1, column2, ... FROM table_name LIMIT number1,number2;
offsite子句

OFFSET用于指定查询结果集的偏移量。

其中,number是你想要返回的行数,offset_num是从查询结果集的起始位置偏移的行数。

SELECT column1, column2, ... FROM table_name LIMIT number OFFSET offset;

数据连接

外连接 内连接
内连接 join | inner join
SELECT s.*, sc.subject_id, su.subject_name FROM ( students s JOIN scores sc JOIN subjects su ON s.stu_id = sc.stu_id and sc.subject_id = su.subject_id );
外连接 left join / right join / full join
# 在score末行添加一个假数据 # 2000 1 100 期末 SELECT * FROM( students as s RIGHT JOIN scores as sc ON s.stu_id = sc.stu_id );
union 操作

先拼接,再去重(删除重复行)

-- 合并“成绩≥90”和“成绩≤60”的学生信息(UNION 自动去重) SELECT s.stu_id, s.stu_name, sc.score, su.subject_name FROM students s JOIN scores sc ON s.stu_id = sc.stu_id JOIN subjects su ON sc.subject_id = su.subject_id WHERE sc.score >= 90 UNION SELECT s.stu_id, s.stu_name, sc.score, su.subject_name FROM students s JOIN scores sc ON s.stu_id = sc.stu_id JOIN subjects su ON sc.subject_id = su.subject_id WHERE sc.score <= 60 ORDER BY score DESC;
union all操作

直接拼接结果,不做任何去重 / 排序

-- 添加一个student 张三 19 SELECT name FROM students WHERE age = 20 UNION ALL SELECT name FROM students WHERE age = 19;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 14:56:00

14、深入理解内存屏障与设备驱动开发

深入理解内存屏障与设备驱动开发 在现代计算机系统中,为了提高性能,处理器常常会对读写指令进行重排序。然而,这种优化可能会对执行可编程内存输入输出(PMIO)和内存映射输入输出(MMIO)的驱动程序造成干扰。为了防止指令重排序,我们需要使用内存屏障。 1. 内存屏障的概…

作者头像 李华
网站建设 2026/5/1 8:47:44

15、IPMI驱动与直接内存访问(DMA)技术详解

IPMI驱动与直接内存访问(DMA)技术详解 1. IPMI驱动案例分析 IPMI(Intelligent Platform Management Interface)驱动在系统管理中扮演着重要角色。下面将详细介绍IPMI相关的两个关键函数: ipmi2_pci_probe 和 ipmi2_pci_attach 。 1.1 ipmi2_pci_probe函数 该函数用…

作者头像 李华
网站建设 2026/5/1 8:57:17

22、网络驱动:数据结构与数据包处理解析

网络驱动:数据结构与数据包处理解析 1. 以太网设备的初始化与卸载 以太网设备的设置和管理涉及到多个关键函数和数据结构。 ether_ifattach 函数用于为以太网设备设置 ifnet 结构,以下是其部分代码示例: #ifdef VIMAGEifp->if_reassign = ether_reassign; #endif…

作者头像 李华
网站建设 2026/4/29 18:55:38

基于SpringBoot的东方红食品公司采购管理系统的设计与实现_usr5txay

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/4/18 13:00:58

嵌入式项目之温湿度闹钟

在个人职业发展的经济模型中&#xff0c;薪资水平本质上是对个人“不可替代性”和“价值创造范围”的定价。许多人长期困在低薪的“基础项目”中&#xff0c;并非不努力&#xff0c;而是因为他们始终停留在“螺丝钉”的角色——精通单一技能&#xff0c;但对整个系统的商业价值…

作者头像 李华
网站建设 2026/5/1 3:44:53

Flutter:跨平台开发的未来之选——从入门到进阶全攻略

Flutter&#xff1a;跨平台开发的未来之选——从入门到进阶全攻略 一、引言&#xff1a;为什么Flutter是跨平台开发的最佳选择&#xff1f; 在移动开发领域&#xff0c;跨平台框架的竞争从未停歇。React Native、Xamarin等方案虽各有优势&#xff0c;但Flutter凭借其独特的自…

作者头像 李华