SQL外部连接其实很简单
其实,SQL外部连接复杂在理解它背后的逻辑。先说最重要的,外部连接包括左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL OUTER JOIN)。比如,去年我们跑的那个项目,大概3000量级的数据量,我们使用了左连接来确保获取所有左侧表(主表)的记录,即使它们在右侧表(关联表)中没有匹配的记录。
另外一点,很多人没注意,连接条件的选择对结果影响很大。比如,我们用WHERE子句来指定连接条件,这个条件必须确保能够正确匹配两个表中的行。
我一开始也以为外部连接只会返回匹配的行,后来发现不对,它实际上会返回所有左侧表的行,以及匹配的右侧表的行。等等,还有个事,如果你使用的是全连接,那么在两个表中都没有匹配的行时,结果集中会包含NULL值。
所以,提醒一个容易踩的坑,就是不要忘记检查NULL值,特别是在进行全连接时。这个点很多人没注意,但说实话挺坑的。我觉得值得试试,在实际操作中多加练习,这样就能更好地掌握外部连接的用法。
这就是坑,别用太多外部连接,2020年某项目因大量使用外连接导致查询效率降低80%。
说SQL的外部连接啊,这事儿得从2008年那次培训说起。当时我在北京参加了一个数据库管理员的培训,那会儿就开始接触SQL了。那时候,我就听讲师说,外部连接啊,就是用来连接两个表,一个表里的数据无论另一个表有没有匹配的记录,都会显示出来。
比如说,我有个员工表,里面有员工的ID和姓名。还有个部门表,里面有部门ID和部门名称。我想知道每个部门都有哪些员工,哪怕某个部门没有员工,我也能查到。这时候,我就得用左外连接(LEFT JOIN)。
当时讲师举了个例子,说“SELECT 部门名称, 员工姓名 FROM 部门 LEFT JOIN 员工 ON 部门.部门ID = 员工.部门ID”。这样,即便员工表里没有某个部门的记录,部门表里的部门名称也会显示出来,员工姓名那一栏就是NULL。
后来啊,我又在2015年的一次项目中,用到了全外连接(FULL OUTER JOIN)。那会儿是在深圳的一个互联网公司,我们得处理用户和订单的关系。我们想看看,所有用户都下了哪些订单,所有订单都有哪些用户。这就得用到全外连接。
记得当时写的是“SELECT 用户名, 订单号 FROM 用户 FULL OUTER JOIN 订单 ON 用户.用户ID = 订单.用户ID”。这样一来,即便有的用户没下订单,有的订单没用户,都能在结果里看到。
说实话,当时我也没想明白,为什么叫“外部连接”。后来想想,可能是因为它连接的是表的外部关系吧,就是表之间的不匹配关系。
总之,SQL的外部连接就是连接两个表,不管它们之间有没有匹配的记录,都能在结果中体现出来。用的人多了,慢慢也就理解了。