怎样才能写出高质量的SQL语句?

说白了,写好SQL就像开车,懂路况(数据库)、方向盘(结构)、油门(性能)、避开坑(陷阱),还得不断学新技巧(持续学习)。

先说最重要的两点:结构要清晰,性能要优先。
比如去年我们跑那个千万级电商项目,直接用SELECT 的查询拖慢了全链路,改用SELECT u.id, u.name后响应快了5 0%。
另外一点是索引,去年某个同事写了个WHERE YEAR(date) = 2 02 3 的查询,硬生生被数据库当全表扫描处理,换成WHERE date >= '2 02 3 -01 -01 ' AND date < '2 02 3 -02 -01 '后速度直接翻倍。
还有个细节挺关键的:JOIN顺序不能乱,去年我们重构一个报表SQL时,把大表提前JOIN导致内存溢出,调换顺序后问题全解决。

我一开始也以为注释是形式主义,后来发现不写注释的SQL团队能在凌晨3 点因为WHERE条件写错而吵起来,真的挺坑的。
等等,还有个事:LIKE前加通配符(LIKE '%abc')会失效索引,这点很多人没注意。

最后提醒个坑:用UNION代替OR是好事,但有个同事写UNION ALL时忘了去重,结果报表里北京用户被计算了两次,这个点值得试试动态调试工具。

sql查询更新语句怎么写

我记得有一次,我在公司的小型数据库里,负责更新员工的联系方式。
当时,我需要把所有名叫“李明”的员工的电话号码从原来的“1 3 8 001 3 8 000”更改为“1 3 8 001 3 8 001 ”。
我坐在办公室的电脑前,键盘敲击声和屏幕上闪烁的命令行交织成一幅日常工作的画面。

我打开数据库管理工具,输入了这样的SQL语句:
UPDATE employees SET phone_number = '1 3 8 001 3 8 001 ' WHERE name = '李明';
我按下回车键,命令行瞬间变得活跃起来,几秒钟后,屏幕上出现了更新成功的提示。
我看了看时间,刚好是下午2 点1 5 分。

等等,我突然想到,如果我没有WHERE子句,那岂不是会把所有人的电话号码都更新了?那可就尴尬了。
所以我每次执行更新操作时,都会仔细检查WHERE子句,确保只更新目标记录。

那如果有一天,公司决定合并两个部门,我需要同时更新两个表里的信息,那该怎么做呢?