一、基础查询(核心必用)
1. 查询指定列
sql
-- 查询姓名、年龄
SELECT name, age FROM user;
2. 查询所有列
sql
SELECT * FROM user;
3. 去重查询(DISTINCT)
sql
-- 查询所有不重复的年龄
SELECT DISTINCT age FROM user;
4. 列 / 表别名(AS,可省略)
sql
-- 列别名:简化结果展示
SELECT name AS 姓名, salary 工资 FROM user;
-- 表别名:联表时必备
SELECT u.name FROM user u;
二、条件查询(WHERE 筛选数据)
WHERE 用于过滤行,在分组前执行
1. 基础比较运算符
sql
-- 等于=、大于>、小于<、不等于!=/<>
SELECT * FROM user WHERE age > 18;
SELECT * FROM user WHERE gender != '男';
2. 范围查询
sql
-- BETWEEN 起始值 AND 结束值(包含边界)
SELECT * FROM user WHERE salary BETWEEN 5000 AND 10000;
3. 枚举匹配
sql
-- IN(值1,值2):匹配多个固定值
SELECT * FROM user WHERE dept_id IN (1,2,3);
4. 空值判断
sql
-- 空值:IS NULL;非空:IS NOT NULL
SELECT * FROM user WHERE dept_id IS NULL;
5. 逻辑运算符
sql
-- AND(且)、OR(或)、NOT(非)
SELECT * FROM user WHERE age > 18 AND gender = '男';
三、模糊查询(LIKE,字符串匹配)
通配符:
%:匹配任意长度字符(包含 0 个)_:匹配1 个任意字符
sql
-- 1. 查询姓"张"的用户
SELECT * FROM user WHERE name LIKE '张%';
-- 2. 查询名字包含"明"的用户
SELECT * FROM user WHERE name LIKE '%明%';
-- 3. 查询名字为2个字的用户
SELECT * FROM user WHERE name LIKE '__';
四、排序查询(ORDER BY)
ASC:升序(默认,可省略)DESC:降序
sql
-- 按工资降序,年龄升序
SELECT * FROM user ORDER BY salary DESC, age ASC;
五、分页查询(LIMIT,分页必备)
语法 :LIMIT 起始索引, 每页条数👉 MySQL 起始索引从 0 开始
sql
-- 查询第1页,每页10条数据
SELECT * FROM user LIMIT 0,10;
-- 查询第2页
SELECT * FROM user LIMIT 10,10;
六、聚合函数(统计数据)
常用:COUNT/SUM/AVG/MAX/MIN
sql
-- 统计总人数
SELECT COUNT(*) FROM user;
-- 统计平均工资
SELECT AVG(salary) FROM user;
-- 统计最高工资
SELECT MAX(salary) FROM user;
-- 统计工资总和
SELECT SUM(salary) FROM user;
七、分组查询(GROUP BY + HAVING)
GROUP BY:按指定列分组HAVING:过滤分组后的数据(必须配合 GROUP BY 使用)
sql
-- 按部门分组,统计每个部门的人数
SELECT dept_id, COUNT(*) AS 人数
FROM user
GROUP BY dept_id;
-- 统计人数>5的部门(HAVING过滤分组)
SELECT dept_id, COUNT(*) AS 人数
FROM user
GROUP BY dept_id
HAVING COUNT(*) > 5;
八、多表联查(高频核心)
1. 内连接(INNER JOIN)
查询两张表的交集数据(匹配不上的数据不显示)
sql
-- 查询用户+所属部门名称
SELECT u.name, d.dept_name
FROM user u
INNER JOIN dept d ON u.dept_id = d.id;
2. 左连接(LEFT JOIN)
左表数据全部显示,右表匹配不到则为 NULL(最常用)
sql
-- 所有用户都显示,无部门的用户部门名为NULL
SELECT u.name, d.dept_name
FROM user u
LEFT JOIN dept d ON u.dept_id = d.id;
3. 右连接(RIGHT JOIN)
右表数据全部显示,左表匹配不到则为 NULL
sql
SELECT u.name, d.dept_name
FROM user u
RIGHT JOIN dept d ON u.dept_id = d.id;
九、子查询(嵌套查询)
将一个查询结果作为另一个查询的条件 / 数据源
sql
-- 1. 标量子查询(返回单个值):查询"技术部"的所有员工
SELECT * FROM user
WHERE dept_id = (SELECT id FROM dept WHERE dept_name = '技术部');
-- 2. 列子查询(返回一列):查询在1、2部门的员工
SELECT * FROM user
WHERE dept_id IN (SELECT id FROM dept WHERE id IN (1,2));
十、配套常用:增 / 删 / 改语句
1. 插入数据(INSERT)
sql
-- 插入单条
INSERT INTO user(name, age) VALUES ('张三', 20);
-- 插入多条
INSERT INTO user(name, age) VALUES ('李四',21),('王五',22);
2. 更新数据(UPDATE)
⚠️ 必须加 WHERE 条件,否则会更新全表!
sql
UPDATE user SET salary = 8000 WHERE id = 1;
3. 删除数据(DELETE)
⚠️ 必须加 WHERE 条件,否则会删除全表数据!
sql
DELETE FROM user WHERE id = 1;
十一、高频实用函数
1. 空值处理(IFNULL)
sql
-- 工资为NULL时,显示0
SELECT name, IFNULL(salary, 0) FROM user;
2. 字符串拼接(CONCAT)
sql
SELECT CONCAT(name, '-', age) AS 信息 FROM user;
3. 日期格式化(DATE_FORMAT)
sql
-- 格式化创建时间:2025-01-01
SELECT DATE_FORMAT(create_time, '%Y-%m-%d') FROM user;
4. 获取当前时间
sql
SELECT NOW(); -- 年月日时分秒
SELECT CURDATE(); -- 年月日
总结
- 基础流程 :
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT - 高频优先级:条件查询 > 排序分页 > 分组统计 > 左连接联查
- 安全提醒 :
UPDATE/DELETE必须加WHERE条件,避免误操作全表