mysql查询语句大全
mysql查询语句大全
MySQL的询语查询语句,说到底是询语围绕SELECT展开的一场数据博弈。我见过太多人把时间耗在背语法上,询语却忽略了查询的询语本质——你是在跟一张张二维表对话,问它要什么,询语它就给什么,询语但问法不同,询语效率天差地别。询语
先看最基础的询语骨架。SELECT后面跟你要的询语列,FROM指定表,询语WHERE做条件过滤。询语比如查用户表里所有注册超过一年的询语名字:SELECT name FROM users WHERE created_at < NOW() - INTERVAL 1 YEAR。这一句能跑通,询语你就已经跨过了门槛。询语但别急着高兴,真实业务里,你很快会遇到第一个坑:NULL值。WHERE age > 18不会返回age为NULL的行,因为NULL不是0,它代表“未知”。你得写成WHERE age IS NOT NULL AND age > 18,或者用COALESCE(age, 0) > 18来兜底。这个细节,新手十有八九要栽一次。
接着是JOIN。内连接INNER JOIN只留两边都匹配的行,左连接LEFT JOIN把左表全留下,右表没匹配就补NULL。我调试过一个慢查询,两张表各十万行,用LEFT JOIN跑了三秒,改成INNER JOIN后瞬间变0.02秒——因为内连接能利用索引跳过不匹配的行,而左连接必须扫描左表全部。所以别盲目用LEFT JOIN,先问业务逻辑是否真的需要保留左表的孤行。JOIN的顺序也有讲究,MySQL优化器会重排,但如果你用STRAIGHT_JOIN强制指定顺序,就得自己保证小表驱动大表,否则性能会崩。
聚合函数GROUP BY是另一座分水岭。COUNT、SUM、AVG、MAX、MIN,配合GROUP BY按某列分组统计。比如按月份统计订单总额:SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(amount) FROM orders GROUP BY month。这里有个易错点:SELECT里出现的非聚合列,必须出现在GROUP BY里,否则MySQL在ONLY_FULL_GROUP_BY模式下直接报错,不报错的老版本则可能返回随机值。我见过生产环境因为这条规则没遵守,同一份报表两次跑出不同数字,吓得运维连夜回滚。
HAVING和WHERE长得像,但作用时机完全不同。WHERE在分组前过滤行,HAVING在分组后过滤组。查订单数超过100的客户:SELECT customer_id, COUNT(*) FROM orders GROUP BY customer_id HAVING COUNT(*) > 100。记住,HAVING里用别名是MySQL的方言,标准SQL不允许,但MySQL支持,所以你可以写HAVING cnt > 100配合SELECT COUNT(*) AS cnt,省事不少。
排序ORDER BY看似简单,但混合方向时要注意:ORDER BY price DESC, created_at ASC意思是先按价格降序,价格相同再按时间升序。还有别对TEXT或BLOB类型排序,性能惨不忍睹,业务上也没意义。
子查询分两种:FROM子句里的派生表,和WHERE里的标量子查询。派生表必须起别名,比如SELECT * FROM (SELECT id, name FROM users WHERE age > 30) AS u。标量子查询返回单值,可以跟比较运算符连用:WHERE salary > (SELECT AVG(salary) FROM employees)。但子查询嵌套太深,阅读性会急剧下降,能拆开就别硬揉在一起。MySQL 8.0支持了WITH子句(公用表表达式),WITH top_customers AS (SELECT ...) SELECT * FROM top_customers——这玩意儿比多层子查询清晰得多,建议能用就用。
LIMIT分页是日常操作,但深分页有坑。LIMIT 100000, 20会先扫描10万行再丢弃,越往后越慢。优化方案是记录上一页的最大ID,用WHERE id > last_id ORDER BY id LIMIT 20,或者用延迟关联:先查主键再回表。我处理过一个后台报表,原来翻到第500页要等8秒,改成延迟关联后直接变0.1秒,用户再也没骂过。
最后说下索引对查询的影响。你写WHERE、JOIN、ORDER BY的列,最好都有索引。但索引不是万能的,对列做函数运算就会让索引失效,比如WHERE YEAR(created_at) = 2024,应该改成WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'。还有LIKE查询,前缀通配符LIKE '%abc'用不上索引,后缀LIKE 'abc%'可以。
查询语句的终极技巧不是背全所有函数,而是学会用EXPLAIN看执行计划。输出结果里type列从ALL到const,性能依次变好,看到ALL就该警觉全表扫描了。我习惯每写一条复杂查询就EXPLAIN一遍,花十秒检查,省下的是未来几小时的排查时间。
MySQL的查询就这点家底——SELECT、JOIN、GROUP BY、HAVING、子查询、LIMIT、索引配合。剩下的是函数库,用到再查文档不迟。真正拉开差距的,是你对数据分布的理解和写查询时对性能的直觉。这种直觉没有捷径,多写、多EXPLAIN、多观察实际耗时,慢慢就有了。
本文地址:http://www.79wt.cn/news/361c0599633.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。