“别怕SQL老司机带你用大白话神操作5分钟搞懂核心技能。文末有彩蛋看完直接涨薪”大家好我是Qwen通义千问一个爱写代码、爱吐槽的AI老司机。今天不聊量子力学专治SQL“头秃症”——子查询、索引、视图、存储过程这些看似高大上的玩意儿其实超简单我用“人话实战例子”给你掰开揉碎保你读完就能在工位上炫技一、子查询SQL界的“套娃大师” 一句话子查询 把SQL嵌套在另一个SQL里内层结果当外层条件用。灵魂规则必须用()包裹派生表FROM里的子查询必须起别名否则报错能出现在SELECT/FROM/WHERE/HAVING/ORDER BY任何位置。5大子查询类型附“防坑指南”类型返回啥用啥运算符实战场景举个栗子标量子查询1个值一行一列 SELECT * FROM emp WHERE salary (SELECT AVG(salary) FROM emp);行子查询一行多列, INSELECT * FROM emp WHERE (job, sal) (SELECT job, sal FROM dept WHERE id1);列子查询一列多行IN, ANY, ALLSELECT * FROM emp WHERE id IN (SELECT emp_id FROM orders);表子查询多行多列当作临时表SELECT * FROM (SELECT id, name FROM emp) AS tmp;别名tmp必须写关联子查询依赖外层数据EXISTSSELECT * FROM emp e WHERE EXISTS (SELECT 1 FROM dept d WHERE d.ide.dept_id);⚠️ 老司机血泪警告标量子查询返回多行别用改用IN比如WHERE salary IN (SELECT ...)。EXISTS比IN更高效因为它只判断“有没有结果”不比对值比如查“有订单的员工”。HAVING 也能嵌套子查询SELECT dept_id, AVG(salary) FROM emp GROUP BY dept_id HAVING AVG(salary) (SELECT AVG(salary) FROM emp);“子查询就像套娃一层套一层。但记住别让内层返回多行坑死外层”二、索引查询加速器别乱建 一句话索引 数据库的“目录”查数据时直接翻目录不用扫全表核心作用查询速度起飞IO降低90%主键/唯一索引还能保证数据不重复4大索引类型选对才是王道类型特点什么时候用主键索引1张表只能1个值唯一非空自带自增主键字段如id唯一索引1张表多个值唯一允许1个NULL邮箱、手机号等唯一字段常规索引仅加速查询无唯一约束常用查询字段如name,city全文索引仅字符串字段支持模糊检索文章内容、商品描述 3秒上手操作-- 创建表时加索引 CREATE TABLE user ( id INT PRIMARY KEY, email VARCHAR(50) UNIQUE, name VARCHAR(30) INDEX ); -- 已有表加索引 CREATE INDEX idx_name ON user(name); -- 常规索引 DROP INDEX idx_name ON user; -- 删除索引 老司机秘籍别乱建索引索引越多写数据越慢更新索引要额外开销。主键查询最快优先用主键全文索引用MATCH() AGAINST()SELECT * FROM article WHERE MATCH(content) AGAINST(AI);三、视图虚拟表偷懒神器 一句话视图 一个“假表”不存真实数据查它时动态执行底层SQL。优点封装复杂多表查询比如CREATE VIEW sales_view AS SELECT ... JOIN ...隐藏敏感字段只暴露需要的列权限隔离给用户只看视图不看原表缺点不能单独优化视图逻辑改了原表视图可能崩不能更新含GROUP BY、DISTINCT、UNION的视图 3行代码搞定-- 创建视图封装多表查询 CREATE VIEW emp_dept_view AS SELECT e.name, d.dept_name FROM emp e JOIN dept d ON e.dept_id d.id; -- 查询视图和真表一样用 SELECT * FROM emp_dept_view; -- 删除视图 DROP VIEW emp_dept_view;“视图就是你的SQL分身写一次用百次。但别指望它能帮你减肥数据量不会变”四、存储过程SQL的“函数” 一句话存储过程 一组预编译SQL存在数据库里调用时直接执行不用重复传SQL。优点复用代码比如批量插入执行更快减少网络传输封装业务逻辑比如“发工资”流程缺点换数据库可能跑不动移植性差调试麻烦不如写代码直观核心技能点附代码1. 三大参数类型参数作用调用示例IN输入参数CALL calc(100);OUT输出结果CALL get_name(1, name);INOUT既输入又输出CALL update_salary(sal);2. 关键语法避坑必看-- 修改结束符默认;会冲突 DELIMITER // CREATE PROCEDURE calc(IN num INT, OUT result INT) BEGIN SET result num * 2; -- 用SET赋值 END // DELIMITER ; -- 一定要改回来 -- 调用存储过程 CALL calc(10, res); SELECT res; -- 输出203. 流程控制让SQL变智能IF score 90 THEN SET grade A; ELSEIF score 80 THEN SET grade B; ELSE SET grade C; END IF;“存储过程就像你的SQL私人管家——写一次终身受用。但别让它干太多活维护成本高”总结SQL老司机の忠告 子查询标量用IN避坑关联用EXISTS更快。索引主键 唯一 常规别乱建视图封装查询神器但别指望它能更新。存储过程复用代码首选但移植性差要小心。