mysql的分类
mysql在其内部根据功能的不同分为不同的语言
一、数据查询语言(DQL, Data Query Language)
核心作用:从数据库中查询 / 检索数据(仅读取,不修改数据),是最常用的 SQL 类别。
核心关键字:SELECT(核心)、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、JOIN等。
-- 查询年龄大于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 的子集)。
核心关键字:COMMIT、ROLLBACK、SAVEPOINT。
-- 开启事务(部分数据库需显式声明) 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_namechange
-- 修改字段名称 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;