[SQL快速入门-38] SQL CROSS JOIN:交叉连接

嘿,当时我对这个 CROSSJOIN 的事情感到困惑和有点尴尬。
后来我意识到,这类似于数学中的“笛卡尔积”,两个表无论相同与否,都将它们组合起来。
2 02 2 年,我在一个城市看到了一个例子。
有两个表:CLIENTS 和 ORDERS。
一个有1 0000条数据,另一个也有1 0000条。
如果交叉的话,不是有一亿条数据吗?我当时就震惊了。
后来我意识到这样的用法,除非数据量很小,否则会导致服务器崩溃。
我只是说,我有偏见,这取决于具体情况。
例如,在那个例子中,出现了一堆组合,并且与每个客户匹配的每个订单都出来了,即使客户没有订单。
最后我意识到:如果用在正确的地方,CROSSJOIN 是非常有效的。

[SQL快速入门-36] SQL FULL JOIN:全连接

说实话,全连接这个东西用起来还是挺难的,但是有时候还是很有用的。
我之前正在做一个项目,我必须检查所有用户及其订单。
即使有人只注册但没有付款,我也必须把他踢出去。
即使订单为零。
这需要完全连接。

有趣的是,全连接的执行逻辑其实还是蛮有趣的。
如果您考虑一下,它首先需要运行 LEFT JOIN,提取左表(如 User 表)中的每条记录,并将所有匹配的记录合并到右表(Orders 表)中。
然后呢?您必须重新运行 RIGHT JOIN 以将 LEFT JOIN 未检索到的记录添加到右表中(例如没有订单的用户)。
所以效率肯定不如inner join,尤其是表特别大的时候。

我遇到过一个案例,公司使用的Oracle表数据量不大,但是运行全连接的时候就卡住了。
后来改写为UNION ALL,分别运行左连接和右连接,内存小了很多。
事实上,这就是为什么像 MySQL 这样的数据库没有完全连接的原因 - 他认为你应该有更好的方法来组合像 UNION ALL 这样的查询。

应特别注意连接条件。
上次我遇到麻烦时,两个表字段具有相同的名称,但是没有添加AS来替换。
结果,连接条件表面上写的是正确的,但结果集还是乱七八糟的。
这个东西不像INNER JOIN。
两侧的字段必须完全匹配。
完全连接可以一侧与 NULL 合并,另一侧与非 NULL 合并,但字段名称必须匹配。

最后,还有一个小窍门。
虽然全连接可以处理所有情况,但有时结果集太大,特别是当两个表中都有大量重复主键时。
我当时正在处理一个报告需求,使用全连接生成了数百MB的数据,这直接震撼了数据库。
后来,我改用 LEFT JOIN + UNION ALL + RIGHT JOIN 并添加 EXISTS 子句来过滤掉重复的主键。
结果,数据量直接减半。
所以,如果真的遇到问题,就不要拘泥于同一种写法。

如何自学SQL(从入门到精通)?

我记得去年冬天在一家咖啡馆里,看着邻桌的那个人皱着眉头看着他的笔记本电脑。
屏幕上全是乱码的SQL语句。
他时不时地翻阅厚厚的记事本,嘟囔道:“我还是不明白如何使用外键。
”当时我就想,如果能给他一个现成的学习方法就好了。

先说一个小场景。
我有一个朋友从零开始学习SQL,花了三个月的时间。
他没有学习理论,而是首先找到了一个公开的电子商务订单数据集,并使用 W3 Schools 教程来理解 SELECT 语句。
每天早上我起床跑步 1 0 分钟,然后花三个小时在 SQL 屏幕上打字。
第一个月的周末,我去图书馆拿起了《SQL基础学习指南》。
当我回来时,我使用 MySQL Workbench 来运行示例。
结果,我的电脑出现了蓝屏 - 因为我忘记先创建数据库。

第一阶段花费时间:约2 -3 个月,每天1 -1 .5 小时。
关键是掌握四个基本命令:SELECT、INSERT、UPDATE 和 DELETE。
具体建议您准备一个电子笔记本,使用Notion或OneNote来记录发生的错误。
例如,我曾经遇到一个查询错误,其中 AND 写成了 OR。
我花了半个小时才找到问题所在。
后来我保存了出现错误的场景的屏幕截图,现在看它让我觉得自己很愚蠢。

到了高级阶段,有一个关键点。
去年我参加了一个数据挖掘比赛,参赛者写了一个非常复杂的子查询。
结果由于JOIN条件写错,整个系统冻结了1 0分钟。
法官后来表示应该使用临时表进行批处理。
教训是,当你写超过1 0行SQL语句时,应该停下来,使用PostgreSQL EXPLAIN命令查看执行计划。

如果我们谈论实践,我推荐一个真实的案例。
去年,我帮助一家公司优化了一个报告请求。
原来的SQL需要3 0秒执行,修改后只需要3 秒。
秘密是添加三个索引,但重点是先分析数据表中NULL值的比例。
当时我用MySQL Workbench的EXPLAIN分析,发现WHERE子句中有一个字段9 0%为NULL,所以不需要添加索引。
这个细节在很多教程中都没有涉及,但在实际工作中尤为重要。

最后,我们来说说一些小事。
在阅读教程时,我发现 Oracle 数据库有一个其他数据库没有的功能,称为“隐式游标”。
当时的测试表明,使用隐式游标编写更新语句可以节省3 0%的内存,但它们比显式游标更难编写。
该功能由数据库厂商配置,仅出现在企业级项目中。
等等,我突然想到PostgreSQL有一个CTE(Common Table Expression),如果经常使用的话可以节省很多调试时间...
现在想想学习SQL最神奇的经历是什么?有一天我突然明白了一个道理:“JOIN是两个表之间的内部关系,ON子句不能包含WHERE子句。
”我感觉自己就像一个侦探在解谜。
但尽管如此,现在企业中使用的SQL和学校里教授的还是有很大的不同,比如JSON处理、窗口函数等等,你能理解这一切吗?

[SQL快速入门-38] SQL CROSS JOIN:交叉连接

哦,以前我们处理数据库的时候,有很深的印象,CROSS JOIN只是一把双刃剑。

我记得有一次我负责一个项目,需要列出用户表和订单表的每种可能的组合,因为经理觉得他必须确保每种组合都得到考虑。
当时,users 表中有 5 0,000 个条目,orders 表中有 8 ,000 个条目。
当我看到如此庞大的数据量时,我惊慌失措。

当时我没有多想就用了CROSS JOIN,反正数据库性能也不错。
你猜怎么着?查询结果一出现,我的服务器就差点崩溃了。
结果集中有4 0万条记录,服务器负载巨大。
最后的处理花了一整晚的时间。

从那时起我就避免了这种交叉连接。
就像吃自助餐一样。
虽然看起来很棒,但暴饮暴食也是一种负担。

即便如此,CROSS JOIN在某些场景下还是相当有用的。
例如,如果您正在进行简单的数据验证或进行少量数据的数据合并,这非常有用。

嘿,回来了,我必须提醒你,CROSS JOIN 并不是在所有情况下都是必要的。
必须根据实际数据量和系统性能来做出决定。
和我之前的项目一样,可以通过其他方式实现,比如先过滤数据,然后连接。

总之,CROSS JOIN 如果使用得当,是一个神奇的工具,但如果使用不当,则是一个陷阱。
这要根据实际情况来确定。