资讯详情

【Mysql】增删查改操作

📅 2026/10/26 18:15:59 | 华诺云谱 👁 阅读
【Mysql】增删查改操作
creat 新增INSERT 新增语句INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... -- value_list: value [, value] ...INTO 可以省略写上可读性更好表create table users ( id bigint, name varchar(20) comment 用户名 );三种插入方式单行全列插入insert into users values (1, 张三); insert into users values (2, 李四);不写列名值的数量、顺序必须和表定义的列完全一致单行指定列插入insert into users(id, name) values (3, 王五);括号里写明要插入哪些列值和指定的列一一对应、顺序匹配多行指定列插入insert into users(id, name) values (4, 赵六), (5, 钱七);一条 SQL 写多组 (值)逗号隔开一次性插入多条查询验证select * from users;总结全列插入省略列列表值要和表所有列对齐指定列插入只给部分字段赋值值和写出来的列对齐多行插入一条 INSERT 多个 (value_list)减少数据库交互性能优于多次单行insert字符串类型的值要用单引号包裹数字不需要引号-- 创建users表 create table users ( id bigint, name varchar(20) comment 姓名 ); -- 单行全列插入 insert into users values (1, 张三); insert into users values (2, 李四); select * from users; -- 单行指定列插入 写id name, 值跟指定列匹配 insert into users(id, name) values (3, 王五); -- 多行指定列插入 insert into users(id, name) values (4, 赵六), (5, 钱七);Retrieve检索SELECT 检索语句语法SELECT [DISTINCT] select_expr [, select_expr ...] [FROM table_references] [WHERE where_condition] [GROUP BY {col_name | expr}, ...] [HAVING where_condition] [ORDER BY {col_name | expr} [ASC | DESC], ... ] [LIMIT {[offset,] row_count | row_count OFFSET offset}]执行顺序FROM→WHERE→GROUP BY→HAVING→SELECT(DISTINCT)→ORDER BY→LIMIT常用 Select 查询示例-- 创建学生成绩表 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);1查询全部列SELECT * FROM exam;2查询指定列姓名、语文、数学SELECT name, chinese, math FROM exam;3DISTINCT 去重示例查询不重复的数学分数SELECT DISTINCT math FROM exam;4WHERE 条件过滤-- 查询语文大于80分的学生 SELECT * FROM exam WHERE chinese 80;5计算总分、别名ASSELECT name, chinese math english AS total_score FROM exam;6ORDER BY 排序-- 按总分降序排序 SELECT name, chinese math english AS total_score FROM exam ORDER BY total_score DESC;7LIMIT 分页-- 从第0条开始取3条前3条数据 SELECT * FROM exam LIMIT 0,3;8GROUP BY HAVING 分组过滤-- 按数学成绩分组只展示分组后平均分大于85的组 SELECT math, AVG(chinese) avg_chinese FROM exam GROUP BY math HAVING avg_chinese 85;WHERE 和 HAVING 核心区别1WHERE分组之前筛原始行不能写AVG、SUM、COUNT这类聚合函数2HAVING分组统计完之后筛分组结果可以使用聚合函数select全列查询select * from exam;指定列查询1查询编号、姓名、语文成绩select id, name, chinese from exam;查询字段为表达式1常量表达式select id, name, 10 from exam;2常量运算select id, name, 10 1 from exam;3语文成绩全部 10 分select id, name, chinese 10 from exam;4计算三科总分select id, name, chinese math english from exam;给查询列起别名 ASselect id, name, chinese math english as 总分 from exam;如果别名有空格要用引号包裹as 总 分DISTINCT 去重1不去重直接查数学会出现两个 9 select math from exam;2去重重复的分数只保留一条select distinct math from exam;3重点distinct 是对select 后面所有字段组合整体去重不是只对紧跟它的那一列比如select distinct math,name from exam只有 math 和 name 全都一样才算重复总结1*代表所有列推荐开发时尽量不写*明确写出需要的字段2select 后面不光可以写字段名还可以写计算式加减、固定常量3as别名给计算出来的新列起一个好看的表头名字4distinct去掉结果里完全重复的行WHERE 条件查询语法SELECT select_expr [, select_expr] ... [FROM table_references] WHERE where_condition;WHERE用来过滤行只取出满足where_condition条件的数据注意WHERE写在FROM之后GROUP BY之前比较运算符重点易错1判断空值IS NULL不要写 NULL2BETWEEN是左右都包含闭区间3LIKE通配符%多个_一个逻辑运算符优先级NOT AND OR不确定优先级建议加括号()常见坑总结where col null永远查不到数据where col IS NULLNULL NULL返回 1只有支持 NULL 相等比较LIKE如果不带通配符效果等价于IN里面如果有 NULLNOT IN容易出现查询异常BETWEEN ... AND ...顺序不能反小值在前、大值在后WHERE 查询示例基本比较查询查询英语不及格60的同学及英语成绩select name, english from exam where english 60;查询语文成绩高于英语成绩的同学select name, chinese, english from exam where chinese english;总分在 200 分以下的同学select name, chinese math english as 总分 from exam where chinese math english 200;重点坑WHERE 里不能用别名-- 错误写法where不能识别select里定义的别名【总分】 select name, chinese math english as 总分 from exam where 总分 200;AND 和 OR逻辑运算符优先级AND OR不确定优先级一定要加 ()语文 80并且英语 80select * from exam where chinese 80 and english 80;语文 80 或者 英语 80select * from exam where chinese 80 OR english 80;优先级对比-- 等价于chinese80 OR (math70 AND english70) select * from exam where chinese 80 or math 70 and english 70; -- 加括号改变顺序(chinese80 OR math70) AND english70 select * from exam where (chinese 80 or math 70) and english 70;范围查询 BETWEEN / IN语文分数 [80,90]闭区间包含两端-- BETWEEN AND select name, chinese from exam where chinese between 80 and 90; -- AND 比较符 select name, chinese from exam where chinese 80 and chinese 90;BETWEEN 前面小值后面大值写反查不到数学是 78、79、98、99-- IN写法简洁推荐 select name, math from exam where math in (78, 79, 98, 99); -- OR写法 select name, math from exam where math 78 or math 79 or math 98 or math 99;模糊查询 LIKE通配符1%任意多个字符0 个、1 个、多个都行2_单个任意字符查询所有姓孙的同学查询姓孙名字一共两个字孙 XNULL 空值查询1不能用 NULL/! NULL永远查不到2判断空IS NULL非空IS NOT NULL插入一条英语为 NULL 的数据insert into exam values (8, 张飞, 27, 0, NULL);查询英语成绩是 NULL查询英语成绩不是 NULL重要特性NULL 和任何数字运算结果都是 NULLselect name, chinese math english as 总分 from exam;1张飞那一行总分会是 NULL因为 english 是 NULL总结WHERE 在 FROM 之后WHERE不能使用 select 中定义的别名AND 优先级高于 OR复杂条件建议括号NULL 判断只用IS NULL / IS NOT NULL禁止NULLBETWEEN a AND ba value b左右都包含LIKE%匹配任意长度_只匹配 1 个字符NULL 参与算术运算结果直接为 NULLORDER BY 排序语法SELECT ... FROM table_name [WHERE ...] ORDER BY {列名 | 表达式} [ASC | DESC], ... ;ASC升序从小到大默认就是 ASC可以省略不写DESC降序从大到小可以写多个排序字段先按第一个字段排序第一个字段值相同再按第二个字段排序以此类推示例单字段升序数学成绩从低到高select name, math from exam order by math asc;select name, math from exam order by math;二者等价单字段降序语文成绩从高到低select name, chinese from exam order by chinese desc;NULL 排序规则select name, english from exam order by english desc;NULL 在排序时视作比任何值都小多字段排序select name, math, english, chinese from exam order by math desc, english asc, chinese asc;需求数学降序数学相同则英语升序英语相同则语文升序执行优先级先排 math → math 相等才比较 english → english 相等再比较 chinese表达式排序总分排序select name, chinese math english from exam order by chinese math english desc;注意只要任意一科是 NULL相加结果就是 NULL使用别名排序select name, chinese math english as 总分 from exam order by 总分 desc;WHERE ORDER BY 组合select * from exam where english is not null order by chinese desc;先过滤再排序查询英语不为 NULL 的同学语文降序顺序WHERE 写在 ORDER BY 前面注意事项1如果没有写ORDER BY数据库返回行的顺序是不确定、未定义的绝对不能依赖这个默认顺序2ORDER BY支持列名、计算表达式、列别名3NULL 排序比所有正常值都小ASC时在最上方DESC时在最下方4多字段排序每个字段可以单独指定ASC/DESC不是写一个 desc 后面全部生效。分页查询 LIMIT核心MySQL 分页是用LIMIT起始下标从 0 开始公式start (页码 - 1) * 每页条数三种语法LIMIT num从下标 0 开始取 num 条SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;LIMIT start, num从下标start开始取num条逗号写法SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;LIMIT num OFFSET start从下标start开始取num条推荐可读性更好SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;注意LIMIT 3 OFFSET 6等价于LIMIT 6,3例子第 1 页limit 0,3 → start(1-1)*30select * from exam order by id asc limit 0, 3;取出 id1、2、3第 2 页limit 3,3→ start(2-1)*33select * from exam order by id asc limit 3, 3;取出 id4、5、6第 3 页limit 6,3→ start(3-1)*36select * from exam order by id asc limit 6, 3;取出 id7、8不足 3 条有多少返回多少不会报错分页通用公式已知页码 page每页条数 pageSizeLIMIT (page-1)*pageSize , pageSize例子每页 5 条第 4 页 → limit 15,5偏移量 start (当前页码 - 1) * 每页条数LIMIT start, pageSize比如第 4 页每页 3 条 → start(4-1)*39 →limit 9,3注意事项分页一般搭配ORDER BY否则每次分页数据顺序不稳定LIMIT是 MySQL 方言Oracle、SQL Server 分页语法不一样数据量大的时候offset很大时查询会变慢深分页问题
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑