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 分页

posted @ 2026-08-20 14:40  零伍柒  阅读(3)  评论(0)    收藏  举报