SQL详细用法
适用:MySQL / MariaDB 通用,99% 企业开发、数据分析、日志排查、工单问题查询通用。
[TOC]
一、SQL 基础规范
1.1 书写规范
-
关键字大写:SELECT、FROM、WHERE、GROUP BY(规范、易读)
-
表名、字段名小写,下划线分隔
-
字符串单引号:'张三'
-
SQL 语句结尾必须加 ;
1.2 注释
-- 单行注释
/*
多行注释
*/
二、基础查询 SELECT(最常用)
2.1 查询所有字段
SELECT * FROM user;
2.2 查询指定字段
SELECT id, name, phone, create_time FROM user;
2.3 字段别名 AS
SELECT name AS 用户名, phone AS 手机号 FROM user;
2.4 去重 DISTINCT
SELECT DISTINCT status FROM order;
三、条件查询 WHERE(核心)
3.1 基础运算符
SELECT * FROM order
WHERE status = 1 AND total_price > 100;
运算符:=、>、<、>=、<=、!=、<>
3.2 范围查询 BETWEEN AND
SELECT * FROM order
WHERE create_time BETWEEN '2026-01-01' AND '2026-08-01';
3.3 包含查询 IN
SELECT * FROM order
WHERE status IN (1,2,3);
3.4 空值判断 IS NULL / IS NOT NULL
SELECT * FROM order WHERE address IS NULL;
SELECT * FROM order WHERE address IS NOT NULL;
注意:不能用 = NULL
3.5 模糊查询 LIKE
-- % 任意字符
SELECT * FROM user WHERE name LIKE '%张%';
-- 以张开头
SELECT * FROM user WHERE name LIKE '张%';
-- 以张结尾
SELECT * FROM user WHERE name LIKE '%张';
四、排序与分页(业务高频)
4.1 排序 ORDER BY
-- 升序 ASC(默认)
SELECT * FROM order ORDER BY create_time ASC;
-- 降序 DESC
SELECT * FROM order ORDER BY create_time DESC;
4.2 分页 LIMIT
-- 第1页,10条数据
SELECT * FROM order LIMIT 0,10;
-- 第2页
SELECT * FROM order LIMIT 10,10;
公式:LIMIT (页数-1)*条数, 条数
五、聚合函数(统计必备)
-- 总数
SELECT COUNT(*) FROM order;
-- 求和
SELECT SUM(total_price) FROM order;
-- 平均值
SELECT AVG(total_price) FROM order;
-- 最大值、最小值
SELECT MAX(total_price), MIN(total_price) FROM order;
六、分组查询 GROUP BY(报表常用)
6.1 基础分组
-- 按订单状态统计数量
SELECT status, COUNT(*) AS count
FROM order
GROUP BY status;
6.2 分组条件 HAVING
SELECT status, COUNT(*) AS count
FROM order
GROUP BY status
HAVING count > 10;
WHERE:分组前过滤;HAVING:分组后过滤
七、多表联查 JOIN(开发核心)
7.1 内连接 INNER JOIN(只查匹配数据)
SELECT o.id, o.total_price, u.name
FROM `order` o
INNER JOIN user u
ON o.user_id = u.id;
7.2 左连接 LEFT JOIN(左表全部保留)
工作最常用:查订单+用户信息,无用户也保留订单
SELECT o.*, u.name
FROM `order` o
LEFT JOIN user u ON o.user_id = u.id;
7.3 右连接 RIGHT JOIN
SELECT o.*, u.name
FROM `order` o
RIGHT JOIN user u ON o.user_id = u.id;
八、子查询
8.1 WHERE 子查询
SELECT * FROM user
WHERE id IN (SELECT user_id FROM order WHERE status=1);
8.2 FROM 行内视图子查询
SELECT * FROM (
SELECT id, name FROM user WHERE status=1
) t;
九、增删改语句(DML)
9.1 插入数据 INSERT
INSERT INTO user (name, phone, create_time)
VALUES ('张三','13800138000',NOW());
9.2 更新数据 UPDATE
UPDATE user SET name='李四' WHERE id=1;
⚠️ 务必加 WHERE,否则全表更新!
9.3 删除数据 DELETE
DELETE FROM user WHERE id=1;
⚠️ 务必加 WHERE!
十、常用函数(工作超级高频)
10.1 时间函数
SELECT NOW(); -- 当前时间
SELECT CURDATE(); -- 当前日期
SELECT UNIX_TIMESTAMP(); -- 时间戳
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
10.2 字符串函数
SELECT CONCAT(name,phone) FROM user; -- 拼接
SELECT SUBSTR(phone,1,3) FROM user; -- 截取
SELECT REPLACE(name,'张','李'); -- 替换
10.3 判断函数 IF
SELECT name, IF(status=1,'正常','禁用') AS state FROM user;
十一、去重、查重、找重复数据(工单常用)
11.1 查询重复数据
SELECT phone,COUNT(*) AS cnt
FROM user
GROUP BY phone
HAVING cnt > 1;
十二、数据库、表结构操作
12.1 查看数据库、表
SHOW DATABASES;
USE test_db;
SHOW TABLES;
DESC user; -- 查看表结构
12.2 创建/删除表
CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
DROP TABLE test;
十三、工作高频万能SQL(直接复制排查问题)
13.1 时间段日志查询
SELECT * FROM order_log
WHERE create_time BETWEEN '2026-08-01 00:00:00' AND '2026-08-20 23:59:59'
ORDER BY create_time DESC;
13.2 统计每日数据量
SELECT DATE(create_time) AS day, COUNT(*) AS count
FROM order
GROUP BY day
ORDER BY day DESC;
13.3 模糊搜索报错日志
SELECT * FROM system_log
WHERE content LIKE '%Exception%' OR content LIKE '%报错%';
十四、SQL 执行顺序(面试+排错必懂)
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
十五、开发必须记住的禁忌
-
禁止
SELECT *线上大表查询 -
禁止不带 WHERE 的 UPDATE / DELETE
-
大表禁止模糊查询
%xxx%前置百分号不走索引 -
分页越深越慢,避免大 offset 分页
浙公网安备 33010602011771号