MySQL自连接技术问询:必须声明INNER JOIN吗?
关于SQL自连接是否必须显式声明INNER JOIN的问题
首先给你明确结论:自连接完全不需要强制声明INNER,标准SQL里JOIN本身就是INNER JOIN的简写,不管是自连接还是普通表连接都适用。SQL肯定是存在JOIN语法的,你遇到报错绝对不是因为这个原因。
那为什么去掉INNER会报错呢?大概率是下面几个情况:
- 数据库方言的兼容性限制:虽然标准SQL支持
JOIN等价于INNER JOIN,但有些小众数据库或者旧版本的数据库系统,可能要求必须显式写出INNER关键字才能识别内连接。比如某些旧版的Access数据库,或者特定配置下的数据库实例。 - 语句存在其他隐性语法问题:有时候报错不一定是因为去掉了
INNER,可能是语句里有其他容易忽略的问题——比如表名有没有特殊字符(比如空格)没加反引号?或者你的SQL客户端/编辑器有语法检查的bug,误判了合法的语句? - 数据库的严格模式设置:部分数据库(比如MySQL)有
sql_mode配置,如果开启了某些严格模式参数,可能会对语法的严谨性有更高要求,不过这种情况比较少见,一般还是支持简写的。
举个例子,你原来的语句:
SELECT p1.country_code, p1.size AS size2010, p2.size AS size2015 FROM populations AS p1 INNER JOIN populations AS p2 ON p1.country_code = p2.country_code;
去掉INNER后的版本在标准SQL里是完全合法的:
SELECT p1.country_code, p1.size AS size2010, p2.size AS size2015 FROM populations AS p1 JOIN populations AS p2 ON p1.country_code = p2.country_code;
另外补充一点:自连接的连接类型选择,完全取决于你想要的结果集,和“自连接”这个操作本身无关。比如:
- 用
INNER JOIN(或JOIN)只会保留两张表中匹配ON条件的行; - 如果想保留左边表(p1)的所有行,哪怕右边表(p2)没有匹配项,就用
LEFT JOIN; - 反之用
RIGHT JOIN。
你可以先确认下自己使用的数据库类型,再检查语句里有没有其他拼写或格式问题,应该就能解决报错的问题了。
内容的提问来源于stack exchange,提问作者Rosellx
相关产品推荐
相关产品推荐

