就像写别的代码一样,写SELECT的时候出错是很正常的。哪怕是很有经验的开发者,SQL查询有时候也会带bug。今天我们来聊聊用SELECT时常见的错误、它们的原因,以及怎么避免这些坑。
SQL是个对语法要求很严格的语言。漏了逗号、多了逗号、漏了关键字或者单词顺序错了——数据库马上就会给你“红灯警告”。
漏写关键字
最常见的错误就是——直接忘了写某个必须的关键字。比如,试试下面这个命令:
SELECT name age FROM students;
是不是少了点啥?这里name和age之间漏了个,。改正一下:
SELECT name, age FROM students;
这种错误其实很好理解:要么你刚开始学写SQL,要么就是太着急了。SQL可不喜欢你着急!
列名和表名拼错
SQL命令对列名和表名的拼写很敏感。比如试试这个查询:
SELECT naem, agge FROM studnts;
数据库看到这个会一脸懵:naem和agge这俩列,还有studnts这张表,根本不存在。改正一下:
SELECT name, age FROM students;
小建议:如果你不确定名字,可以用\d table_name(在psql里)或者用pgAdmin的界面查一下表结构。
忘记加引号
如果列名或表名里有空格或者特殊字符,记得要用双引号括起来。比如:
SELECT "first name", age FROM students;
要是忘了加引号,SQL就不知道你想干嘛,直接报错。
逻辑错误:一切都能跑,但结果不对劲
有时候查询能跑出来,但结果看着“怪怪的”。这就是逻辑错误。它们更难发现,因为数据库不会告诉你哪里不对。
- 比较符号用错了。比如你想查所有大于18岁的学生:
SELECT * FROM students WHERE age > 18;
再来一个用别的符号的例子:
SELECT * FROM students WHERE age = 18;
这个查询只会返回正好18岁的学生。如果你本来想查大于18岁的,这就是逻辑错误啦。
小建议:这种细节要多留意。如果不确定,先查个小样本(比如加个LIMIT)。
组合条件时的错误
来看个例子:
SELECT * FROM students WHERE age > 18 OR grade = 'A' AND city = 'New York';
这个查询可能会把不在纽约的学生也查出来。为啥?因为SQL的逻辑运算顺序是先AND,再OR。加个括号重写一下:
SELECT * FROM students WHERE (age > 18 OR grade = 'A') AND city = 'New York';
这样就对了。
没加过滤条件
有时候像SELECT * FROM students;这样的查询会返回一大堆数据,其实你只想查某个城市的学生。解决办法?用WHERE加个过滤条件:
SELECT * FROM students WHERE city = 'New York';
性能问题
当查询数据量很大时,优化就变得特别重要了。我们来看看常见的影响性能的错误。
像SELECT *这种查询,开发时用着方便,但实际用会拖慢性能。如果你只需要某些列,就直接写出来。
-- 不推荐:
SELECT * FROM students;
-- 推荐:
SELECT name, age FROM students;
为啥这么重要?SELECT *会把所有列都查出来,哪怕你根本用不到。这会让数据传输量变大。
实用建议:怎么避免出错
只要注意几个小点,SQL查询就能写得更靠谱:
- 执行前检查语法:用IDE或者
pgAdmin的提示功能,能提前发现错误。 - 先查小样本。加
LIMIT 5或LIMIT 10试试。 - 写注释,方便以后看懂查询在干嘛:
-- 查所有大于18岁的学生 SELECT name, age FROM students WHERE age > 18; - 用不同数据测试,看看逻辑是不是对的。
- 别乱用
SELECT *,尤其是大表。
面试常见陷阱
SQL面试经常会让你找查询里的错误。比如:
SELECT name FROM employees WHERE salary > 50000 ORDER BY department;
想想:这个查询逻辑上对吗?如果用了ORDER BY,大概率是想按工资排序:
SELECT name FROM employees WHERE salary > 50000 ORDER BY salary DESC;
用SELECT是SQL的基础,刚开始肯定会犯错。但慢慢地,你会写查询就像发微信一样顺手。毕竟,真程序员不光撸猫,还得撸数据库。😉
GO TO FULL VERSION