如何在SQL中使用联接(JOIN)操作

那天,在咖啡馆里,透过窗户看着人来人往,我突然想起几年前的一个项目经历。
当时我负责一个电商平台的订单管理系统,涉及到多个表之间的复杂查询。
记得有一次,为了查询所有有订单的客户信息,我使用了INNER JOIN。
代码是:
选择clients.customer_id、clients.name、orders.order_id、orders.amount 客户 INNER JOIN 订单 oncustomers.customer_id =orders.customer_id;
那天,我站在工作站前,长时间看着数据库查询结果。
数据显示,只有1 00个客户有订单,而我们的客户总数是2 000多个,这意味着还有近2 000个客户没有下订单。
这个数字对我们来说非常重要,因为它与我们的营销策略直接相关。

想到这里,我突然想到,如果我使用LEFT JOIN,我可以找到更多有趣的商业信息。
所以我改变了查询语句:
选择clients.customer_id、clients.name、orders.order_id、orders.amount 客户 LEFT JOIN 订单 ONclients.customer_id =orders.customer_id;
我对该查询的结果感到惊喜,因为我们现在可以看到所有客户的详细信息,包括那些没有订单的客户。
这样,我可以更全面地了解我们的客户群,并为他们提供更个性化的服务。

那天下午,我花了很多时间分析数据,发现一个趋势:大部分没有订单的客户都是新注册用户,他们可能需要更多时间来熟悉我们的产品。
这个发现对我们来说至关重要,因为它帮助我们调整营销策略,提高新用户的转化率。

等等,还有一件事,我突然想到,如果我们能够根据客户的购买行为来细分市场,那就太好了。
也许我可以尝试使用 CROSS JOIN 来分析客户和订单之间的交叉关系。

一张图看懂 SQL 的各种 join 用法

INNER JOIN 用于匹配行,LEFT JOIN 用于返回左表的所有行,RIGHT JOIN 用于返回右表的所有行,FULL OUTER JOIN 用于返回所有行,LEFT EXCLUDED INNER JOIN 用于返回左表的奇数行,RIGHT JOIN 用于返回右表的所有行。
INNER SUPP 返回唯一的行。
请记住,选择真正的 JOIN 类型可以避免全表扫描并减少数据量。

sql如何将两个table的字段怎么合并到一张表?

说实话,我是一边看文档一边练习SQL JOIN的。
您描述的场景特别典型——学生表和班级表只是数据库JOIN操作的入门级示例。

我第一次做这个功能时,在INNER JOIN中犯了一个错误。
结果呢?只有拥有这两个表的学生才会显示他们的分数。
未参加考试或遗漏信息的,将直接筛选掉。
说实话,我当时很困惑。
我跑去问老师。
导师指着白板,画了一张图,说道:“你看,INNER JOIN就是求两张表的交集,就好像报考的学生在试卷中同时提交了一样。
”后来,我切换到 LEFT JOIN,突然我意识到 - 学生表是父实体。
即使班级表中没有对应的记录,也必须列出学生,并且班级列将为空。

有趣的是,在实践中,发现数据量不相等的情况是很常见的。
例如,在我们的学校系统中,有些学生在转专业后可能会有较旧的记录数据;或者即使他们毕业了他们的分数没有被及时删除。
这时候,使用RIGHT JOIN就非常重要了。
至少您知道谁获取了这些结果(即使名称字段为空)。
我记得有一个项目整理了一份临时成绩表,发现还有很多匿名的成绩记录。
当时,一位数据分析师使用了 RIGHT JOIN 并说道:“反正发论文的老师忘记了,留空也比丢失数据好。

对我来说最头疼的是处理 NULL 值。
学生使用LEFT JOIN加入后成绩为NULL。
整个查询结果被分解。
之后,对于分数表中没有分数的,默认填NULL。
但SQL在JOIN时将NULL视为特殊值。
当时我直接在SQL中添加了COALESCE函数,并将NULL替换为“无结果”,最终解决了。
我自己没有做过,但请注意,数据在 X 左右,但我建议检查一下。

归根结底,JOIN操作的要点是了解两个表之间的关系。
逐个?内部直接连接。
一对多?学生表不是 LEFT JOIN。
很多?然后就看需求了。
学生或是根据成绩吗?左连接或右连接都可以。
有时 INNER JOIN 的效果与 LEFT JOIN 的原因相同,这在当时并不被理解。
后来我发现表中的数据是完全匹配的,所以并没有太大的差别。

虽然这个操作很简单,但是在实际使用中,你会遇到奇怪的情况。
例如,学生转专业后;或者行表包含行数据,然后对数据进行分区。
在这种情况下,仅仅使用 JOIN 是不够的;必须与 WHERE 子句或 GROUP BY 结合使用。