跳到主要内容
MySQL 基础 CRUD 与查询操作 | 极客日志
SQL
MySQL 基础 CRUD 与查询操作 综述由AI生成 MySQL 基础教程涵盖增删改查(CRUD)、条件查询、排序分页、聚合分组及内置函数。内容包括 INSERT 单行多行插入、SELECT 查询别名去重、WHERE 逻辑运算模糊匹配、UPDATE 更新限制、DELETE 与 TRUNCATE 区别。此外讲解了 ORDER BY 排序规则、LIMIT 分页实现、GROUP BY 配合 HAVING 过滤以及常用日期、字符串、数学函数。适合初学者掌握数据库基本操作。
修罗 发布于 2026/3/23 更新于 2026/5/7 9.7K 浏览1. Create 新增
INSERT INTO name (field1, field2...) VALUES (value1, value2...);
INSERT INTO 是插入关键字
INTO 一般都要写,也可以省略
name 为表名字
field 是要插入的列
value 是要插入的值
1.1 单行数据全列插入
值的数量必须和定义表的列的数量及顺序一致
CREATE TABLE IF NOT EXISTS users (
id BIGINT ,
`name` VARCHAR (20 ) COMMENT '用户名称'
);
INSERT INTO users VALUES (1 , '张三' );
INSERT INTO users VALUES (2 , '李四' );
1.2 单行数据指定列插入
INSERT INTO users (id, `name`) VALUES (3 , '艾米' );
1.3 多行数据指定列插入
INSERT INTO users (id, `name`) VALUES (5 , '孙悟空' ), (6 , '猪八戒' ), (7 , '唐僧' );
2. Retrieve 检索
SELECT 列名 1 , 列名 2 FROM 表名;
列名处是 * 的时候是查询所有列(一般不建议,数据过多时会很慢)
2.1 全列查询
2.2 指定列查询
2.3 查询字段为表达式 SELECT Chinese + 10 FROM 表名;
SELECT chinese + math + english FROM 表名;
2.4 为查询结果指定别名 SELECT 列名 1 + 列名 2 AS 别名 FROM 表名;
AS 可以省略,别名如果包含空格必须用单引号包裹。
2.5 结果去重查询 SELECT DISTINCT 列名 1 , 列名 2 FROM 表名;
使用 DISTINCT 去重时,只有查询列表中所有列的值都相同才会判定为重复。
3. WHERE 条件查询 SELECT 列名 1 , 列名 2 FROM 表名 WHERE 条件……;
3.1 基本查询 SELECT id, name, english FROM exam WHERE english < 60 ;
SELECT id, name, chinese, math FROM exam WHERE chinese > math;
SELECT id, name, chinese + math + english FROM exam WHERE chinese + math + english < 200 ;
3.2 AND 和 OR
查询语文成绩大于 80 分且英语成绩大于 80 分的同学
SELECT id, name FROM exam WHERE chinese > 80 AND english > 80 ;
查询语文成绩大于 80 分或英语成绩大于 80 分的同学
SELECT * FROM exam WHERE chinese > 80 OR english > 80 ;
3.3 AND 和 OR 的优先级 SELECT * FROM exam WHERE chinese > 80 OR math > 70 AND english > 70 ;
SELECT * FROM exam WHERE (chinese > 80 OR math > 70 ) AND english > 70 ;
注意:AND 的优先级高于 OR,括号的优先级高于 AND 和 OR。
3.4 范围查询 SELECT name, chinese FROM exam WHERE chinese >= 80 AND chinese <= 90 ;
SELECT name, chinese FROM exam WHERE chinese BETWEEN 80 AND 90 ;
数学成绩是 78 或者 79 或者 98 或者 99 分的同学及数学成绩
SELECT name, math FROM exam WHERE math = 78 OR math = 79 OR math = 98 OR math = 99 ;
SELECT name, math FROM exam WHERE math IN (78 , 79 , 98 , 99 );
3.5 模糊查询 SELECT * FROM exam WHERE name LIKE '孙%' ;
SELECT * FROM exam WHERE name LIKE '孙_' ;
3.6 NULL 的查询 SELECT * FROM exam WHERE english IS NULL ;
SELECT * FROM exam WHERE english IS NOT NULL ;
WHERE 条件中可以使用表达式,但不能使用别名
AND 的优先级高于 OR,在同时使用时,建议使用小括号 () 包裹优先执行的部分
过滤 NULL 时不要使用等于号 (=) 与不等于号 (!= , <>)
NULL 与任何值运算结果都为 NULL
3.7 ORDER BY 排序
SELECT 列名 1 , 列名 2 FROM 表名 WHERE 条件 ORDER BY 列名 DESC / ASC ;
SELECT * FROM exam ORDER BY math ASC ;
查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
SELECT * FROM exam ORDER BY math DESC , english ASC , chinese ASC ;
查询同学及总分,由高到低排序,可以使用列的别名进行排序
SELECT math + english + chinese AS 总分 FROM exam ORDER BY 总分 DESC ;
所有英语成绩不为 NULL 的同学,按语文成绩从高到低排序
SELECT * FROM exam WHERE english IS NOT NULL ORDER BY chinese DESC ;
查询中没有 ORDER BY 子句,返回的顺序是未定义的,永远不要依赖这个顺序
ORDER BY 子句中可以使用列的别名进行排序
NULL 进行排序时,视为比任何值都小,升序出现在最上面,降序出现在最下面
3.8 分页查询
SELECT 列名 FROM 表名 ((WHERE 条件) (ORDER BY 列名 ASC / DESC ) LIMIT num;
SELECT 列名 FROM 表名 (WHERE 条件) (ORDER BY 列名 ASC / DESC ) LIMIT start , num;
SELECT 列名 FROM 表名 (WHERE 条件) (ORDER BY 列名 ASC / DESC ) LIMIT num OFFSET start ;
总页数 = 数据的总条数 / 每页要展示的数量,如果有余数则 + 1.
start = (当前页号 - 1)* 每页要展示的数量
4. Update 修改 UPDATE 表名 SET 修改值 (WHERE 条件) (ORDER BY 列名 ASC / DESC ) (LIMIT num);
UPDATE exam SET math = 80 WHERE name = '孙悟空' ;
将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
UPDATE exam SET math = 60 , chinese = 70 WHERE name = '曹孟德' ;
将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
UPDATE exam SET math = math + 30 WHERE chinese + math + english IS NOT NULL ORDER BY chinese + math + english ASC LIMIT 0 , 3 ;
UPDATE exam SET Chinese = Chinese * 2 ;
以原值的基础上做变更时,不能使用 math += 30 这样的语法
不加 where 条件时,会导致全表数据被列新,谨慎操作
5. Delete 删除
5.1 普通 Delete 删除 DELETE FROM 表名 [WHERE 条件] [ORDER BY...] [LIMIT count];
DELETE FROM exam WHERE name = '孙悟空' ;
执行 Delete 时不加条件会删除整张表的数据,谨慎操作
5.2 截断表
CREATE TABLE t_truncate (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR (20 )
);
INSERT INTO t_truncate (name) VALUES ('A' ), ('B' ), ('C' );
TRUNCATE TABLE t_truncate;
只能对整表操作,不能像 DELETE 一样针对部分数据
不对数据操作所以比 DELETE 更快,TRUNCATE 在删除数据的时候,不经过真正的事物
会重置 AUTO_INCREMENT 项,而 DELETE 不会
5.3 插入查询结果 实现思路:原始表中的数据一般不会主动删除,但是真正查询时不需要重复的数据,如果每次查询都使用 DISTINCT 进行去重操作,会严重效率。可以创建一张与 t_record 表结构相同的表,把去重的记录写入到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时又能保证查询效率
CREATE TABLE t_record (id int , name varchar (20 ));
INSERT INTO t_record VALUES (100 , 'aaa' ), (100 , 'aaa' ), (200 , 'bbb' ), (200 , 'bbb' ), (200 , 'bbb' ), (300 , 'ccc' );
CREATE TABLE t_record_new LIKE t_record;
INSERT INTO t_record_new SELECT DISTINCT * FROM t_record;
6. 聚合函数
7. Group by 分组查询 GROUP BY 子句的作用是通过一定的规则将一个数据集划分成若干个小的分组,然后针对若干个分组进行数据处理,比如使用聚合函数对分组进行统计。
SELECT 列名 FROM 表名 GROUP BY 列名 HAVING 条件;
SELECT role, COUNT (* ) FROM emp GROUP BY role;
7.1 HAVING 子句 使用 GROUP BY 对结果进行分组处理之后,对分组的结果进行过滤时,不能使用 WHERE 子句,而要使用 HAVING 子句
SELECT role, AVG (salary) FROM emp GROUP BY role HAVING AVG (salary) < 1500 ;
Having 用于对分组结果的条件过滤
Where 用于对表中真实数据的条件过滤
8. 内置函数
8.1 日期函数
8.2 字符串处理函数
8.3 数学函数
8.4 其他常用函数 相关免费在线工具 SQL 美化和格式化 在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
SQL转CSV/JSON/XML 解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 工具包 CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online