资讯动态

常用200sql

发布时间:2026/10/21 4:06:04 来源:尧图企业网站定制
1 一、基础查询语句-- 查询表中所有记录 SELECT * FROM 表名; -- 查询指定列 SELECT 列1, 列2 FROM 表名; -- 去重查询 SELECT DISTINCT 列名 FROM 表名; -- 列别名查询 SELECT 列名 AS 别名 FROM 表名; -- 列运算查询 SELECT 列1列2 AS 总和 FROM 表名; -- 带条件查询 SELECT * FROM 表名 WHERE 条件; -- 等于条件 SELECT * FROM 表名 WHERE 列名值; -- 不等于条件 SELECT * FROM 表名 WHERE 列名值; -- 大于条件 SELECT * FROM 表名 WHERE 列名数值; -- 范围查询 SELECT * FROM 表名 WHERE 列名 BETWEEN 最小值 AND 最大值; -- IN子句查询 SELECT * FROM 表名 WHERE 列名 IN(值1, 值2); -- NOT IN子句 SELECT * FROM 表名 WHERE 列名 NOT IN(值1, 值2); -- 模糊查询以“张”开头 SELECT * FROM 表名 WHERE 列名 LIKE 张%; -- 模糊查询以“三”结尾 SELECT * FROM 表名 WHERE 列名 LIKE %三; -- 模糊查询包含“李” SELECT * FROM 表名 WHERE 列名 LIKE %李%; -- 查询空值 SELECT * FROM 表名 WHERE 列名 IS NULL; -- 查询非空值 SELECT * FROM 表名 WHERE 列名 IS NOT NULL; -- 多条件AND同时满足 SELECT * FROM 表名 WHERE 条件1 AND 条件2; -- 多条件OR满足其一 SELECT * FROM 表名 WHERE 条件1 OR 条件2; -- 否定条件 SELECT * FROM 表名 WHERE NOT 条件;02 二、排序与限制语句-- 升序排序ASC默认可以省略不写 SELECT * FROM 表名 ORDER BY 列名 ASC; -- 降序排序 SELECT * FROM 表名 ORDER BY 列名 DESC; -- 多列排序列1升序列2降序 SELECT * FROM 表名 ORDER BY 列1 ASC,列2 DESC; -- MySQL限制返回10条记录 SELECT * FROM 表名 LIMIT 10; -- SQL Server限制返回10条记录 SELECT TOP 10 * FROM 表名; -- MySQL从第10条之后开始取5条OFFSET 10跳过前面10行 SELECT * FROM 表名 LIMIT 5 OFFSET 10; -- 取排序后的第1条记录常用取最大/最小一条 SELECT * FROM 表名 ORDER BY 列名 LIMIT 1;✏️ 修正说明原图里有一处小笔误SELECT * FROM 表名 WHERE 列名 LIKE 张%原图写为张%是正确的原图注释写的没问题IS NULL不能写成 NULLnull不能用等号判断这个是高频易错点LIMIT是 MySQL 语法TOP是 SQL ServerOracle 用ROWNUM不同数据库分页语法不一样BETWEEN AND是闭区间包含最小值和最大值LIKE里%是通配符匹配任意多个字符_匹配单个字符。03 三、聚合函数与分组语句提取 修正 SQL-- 统计总记录数包含null行 SELECT COUNT(*) FROM 表名; -- 统计该列非空值的数量列值为NULL不会被统计 SELECT COUNT(列名) FROM 表名; -- 统计该列去重之后的数量 SELECT COUNT(DISTINCT 列名) FROM 表名; -- 求和只对数值类型生效忽略NULL SELECT SUM(列名) FROM 表名; -- 求平均值忽略NULL SELECT AVG(列名) FROM 表名; -- 求最大值 SELECT MAX(列名) FROM 表名; -- 求最小值 SELECT MIN(列名) FROM 表名; -- 按列分组统计 SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名; -- 多列分组列1、列2组合相同算作一组 SELECT 列1, 列2, SUM(列3) FROM 表名 GROUP BY 列1, 列2; -- HAVING分组之后过滤结果HAVING里可以使用聚合函数 SELECT 列名, AVG(数值列) FROM 表名 GROUP BY 列名 HAVING AVG(数值列) 100; -- WHERE先过滤原始数据再分组WHERE不能写聚合函数 SELECT 列名, COUNT(*) AS 数量 FROM 表名 WHERE 条件 GROUP BY 列名; -- 按年份分组MySQL SELECT YEAR(日期列), COUNT(*) FROM 表名 GROUP BY YEAR(日期列); -- 分组计算差值最大值减最小值 SELECT 列名, MAX(数值列)-MIN(数值列) AS 差值 FROM 表名 GROUP BY 列名; -- 聚合窗口函数全表总计不合并行每一行都会带上总合计 SELECT 列名, SUM(数值列) OVER() AS 总计 FROM 表名; -- 分组窗口合计PARTITION BY 窗口分组不会合并多行 SELECT 列名, SUM(数值列) OVER(PARTITION BY 列名) AS 分组合计 FROM 表名; -- 行号窗口函数ROW_NUMBER()序号连续相同值序号不同 SELECT 列名, ROW_NUMBER() OVER(ORDER BY 数值列) AS 序号 FROM 表名; -- RANK()排名允许并列并列后序号会跳号1,1,3 SELECT 列名, RANK() OVER(ORDER BY 数值列) AS 排名 FROM 表名; -- DENSE_RANK()密集排名允许并列不跳号1,1,2 SELECT 列名, DENSE_RANK() OVER(ORDER BY 数值列) AS 密集排名 FROM 表名; -- NTILE(4)把有序数据尽量平均分成4组返回组编号 SELECT 列名, NTILE(4) OVER(ORDER BY 数值列) AS 分组 FROM 表名;✏️ 重点易错点总结WHERE 和 HAVING 区别面试高频WHERE分组前过滤原始数据不能使用聚合函数HAVINGGROUP BY 分组之后对分组结果过滤可以写聚合函数执行顺序WHERE → GROUP BY → HAVINGGROUP BY规则SELECT后面非聚合字段必须全部写在 GROUP BY 里MySQL 默认严格模式下强制要求聚合函数SUM/AVG/MAX/MIN/COUNT(列)自动忽略 NULL只有COUNT(*)会统计全部行包含 NULL 行窗口函数OVER()不会合并多行GROUP BY 会把多行压缩成一行这是二者最大区别ROW_NUMBER()同值不同号序号永不重复RANK()并列会跳号1,1,3DENSE_RANK()并列不跳号1,1,25 五、插入数据语句 06 六、更新数据语句提取 修正 SQL-- 五、插入 INSERT -- 插入指定列只给部分字段赋值 INSERT INTO 表名 (列1, 列2) VALUES(值1, 值2); -- 插入所有列值顺序必须和表字段顺序完全一致 INSERT INTO 表名 VALUES(值1, 值2, 值3); -- 批量插入多条记录 INSERT INTO 表名 (列1, 列2) VALUES(值1, 值2), (值3, 值4); -- 从另一张表查询结果直接插入本表 INSERT INTO 表名 (列1, 列2) SELECT 列1, 列2 FROM 另一表名; -- 带条件从另一张表筛选数据插入本表 INSERT INTO 表名 (列1, 列2) SELECT 列A,列B FROM 另一表名 WHERE 条件; -- MySQL主键冲突时忽略这条插入不报错 INSERT IGNORE INTO 表名 (列1) VALUES(值1); -- MySQL唯一键冲突时执行更新存在就更新不存在就插入俗称存在即更新 INSERT INTO 表名 (列1) VALUES(值1) ON DUPLICATE KEY UPDATE 列1新值1; -- 所有字段都有默认值时直接插入全部默认值 INSERT INTO 表名 DEFAULT VALUES; -- 插入当前日期到日期列 INSERT INTO 表名 (日期列) VALUES(CURRENT_DATE); -- 自增列使用 DEFAULT数据库自动生成自增ID INSERT INTO 表名 (自增列, 其他列) VALUES(DEFAULT, 值); -- 六、更新 UPDATE -- ⚠️高危不带WHERE更新表内**所有记录**生产禁止随便执行 UPDATE 表名 SET 列名新值; -- 带条件更新多个字段推荐写法一定要加WHERE UPDATE 表名 SET 列1值1, 列2值2 WHERE 条件; -- 在原有数值基础上做增量更新 UPDATE 表名 SET 数值列数值列10 WHERE 条件; -- 更新为当前日期 UPDATE 表名 SET 日期列CURRENT_DATE WHERE 条件; -- 将字段更新为NULL空值 UPDATE 表名 SET 列名NULL WHERE 条件; -- CASE WHEN 条件分支更新 UPDATE 表名 SET 列名CASE WHEN 条件1 THEN 值1 WHEN 条件2 THEN 值2 ELSE 默认值 END; -- 去除字符串前后空格 UPDATE 表名 SET 列名TRIM(列名); -- 字母转为大写 UPDATE 表名 SET 列名UPPER(列名); -- 字符串替换把旧字符替换成新字符 UPDATE 表名 SET 列名REPLACE(列名,旧字符,新字符); -- 字符串拼接追加内容 UPDATE 表名 SET 列名CONCAT(列名,追加内容) WHERE 条件; -- 注意原图写 列名列名追加内容 是mysql坑是数字相加字符串拼接要用CONCAT() -- 交换两列的值 UPDATE 表名 SET 列1列2, 列2列1; -- 版本号自增乐观锁常用 UPDATE 表名 SET 版本列版本列1 WHERE 条件;✏️ 修正 重点易错点UPDATE 最重要警告不带WHERE条件的UPDATE会修改整张表全部数据生产环境严禁执行前务必先SELECT验证 where 条件。字符串拼接坑MySQL 中是算术加法不能拼接字符串要用CONCAT()。原图列名列名追加内容属于错误写法已修正。ON DUPLICATE KEY UPDATE生效前提该列必须有主键 / 唯一索引否则无法识别冲突。INSERT IGNORE遇到主键重复、字段校验失败等错误时直接跳过该行不抛出异常。自增列插入写DEFAULT即可数据库自动生成自增 ID不要手动传 ID。07 七、删除数据语句 08 八、表操作语句提取 修正 SQL-- 七、删除 DELETE -- ⚠️高危不带WHERE删除整张表全部记录生产慎用 DELETE FROM 表名; -- 带条件删除推荐一定要加WHERE DELETE FROM 表名 WHERE 条件; -- 子查询条件删除删除本表中id存在于另一张表结果集中的数据 DELETE FROM 表名 WHERE 列名 IN (SELECT 列 FROM 另一表 WHERE 条件); -- MySQL联表删除别名a是要删除数据的表关联表b做过滤 DELETE a FROM 表1 a JOIN 表2 b ON a.id b.a_id WHERE b.条件; -- EXISTS条件删除满足子查询存在匹配记录则删除 DELETE FROM 表1 WHERE EXISTS(SELECT 1 FROM 表2 WHERE 表2.id 表1.id AND 表2.条件); -- 清空整张表速度快不可事务回滚自增主键重置 TRUNCATE TABLE 表名; -- SQL Server 删除前10条 DELETE TOP(10) FROM 表名; -- 模糊条件删除 DELETE FROM 表名 WHERE 列名 LIKE %删除条件%; -- 日期条件删除删除2020-01-01之前的数据 DELETE FROM 表名 WHERE 日期列 2020-01-01; -- MySQL按排序规则删除前5条 DELETE FROM 表名 WHERE 条件 ORDER BY 列名 LIMIT 5; -- 八、表操作语句 DDL -- MySQL仅复制表结构不复制数据 CREATE TABLE 表名 LIKE 另一表名; -- 复制表结构 复制表数据 CREATE TABLE 表名 AS SELECT * FROM 另一表名; -- 删除整张表表结构数据全部删掉 DROP TABLE 表名; -- 安全删除表如果表存在才删除不存在不会报错 DROP TABLE IF EXISTS 表名; -- 新增一列 ALTER TABLE 表名 ADD 列名 数据类型; -- 删除一列 ALTER TABLE 表名 DROP COLUMN 列名; -- MySQL 修改字段数据类型 ALTER TABLE 表名 MODIFY 列名 新数据类型; -- 重命名字段MySQL8.0/Mysql5.7不支持 ALTER TABLE 表名 RENAME COLUMN 旧列名 TO 新列名; -- 重命名整张表 ALTER TABLE 表名 RENAME TO 新表名; -- 删除主键约束 ALTER TABLE 表名 DROP PRIMARY KEY; -- 添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 主表(主表列); -- 删除外键约束 ALTER TABLE 表名 DROP FOREIGN KEY 约束名;✏️ 重点易错 修正说明1. DELETE 和 TRUNCATE 面试高频对比表格项目DELETETRUNCATE类型DML数据操作语言DDL数据定义语言事务支持事务可以 ROLLBACK 回滚不支持事务无法回滚自增主键不会重置自增 ID重置自增计数器新数据从 1 开始触发器会触发 delete 触发器不会触发触发器速度慢逐行记录日志极快直接销毁数据页WHERE支持条件只删部分行不能加 WHERE一次性清空全表⚠️生产环境DELETE/TRUNCATE执行前先用 SELECT 校验 WHERE 条件2. 其他注意点CREATE TABLE ... AS SELECTCTAS不会复制主键、索引、约束只会复制字段类型和数据。CREATE TABLE ... LIKE只复制表结构、索引、约束不带数据。外键删除删除外键时写的是外键约束名不是字段名。联表删除DELETE a FROM 表1 a JOIN ...是 MySQL 特有语法Oracle、SQL Server 写法不一样。RENAME COLUMN是 MySQL8.0 新增语法低版本 5.7 不支持。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑