MySQL中JOIN的用法详解mysql中jion用法

2 02 2 年,我在某城市的一家小公司工作。
当时公司有一个项目需要使用MySQL数据库。
我记得那段时间我的任务是询问学生和他们的成绩。
这个需求需要使用JOIN操作。

当时我还是一头雾水,不太明白JOIN怎么用,于是就开始查找资料、看文档。
记得当时我发现了JOIN的语法,就是SELECT后面加列名,FROM后面加表名,JOIN后面加你要连接的表,然后是ON关键字,指定连接的条件,最后是WHERE条件。

当时先尝试了INNER JOIN,因为需求说要查询学生和成绩,所以根据文档写了一条查询语句,SELECTFROMstudentsINNERJOINscoresONstudents.id=scores.student_id。
我运行了这个查询,结果发布后,我意识到这件事很简单。

后来,我遇到了更复杂的查询,需要使用LEFT JOIN。
比如我想查询所有学生的信息,即使没有成绩,我也想看到。
这需要使用LEFT JOIN,SELECTFROMstudentsLEFTJOINscoresONstudents.id=scores.student_id。
运行此查询后,我发现在没有成绩的学生信息中,成绩列中显示为NULL。

后来我也用了RIGHT JOIN,因为有时候业务需求是倒退的,需要查询有成绩但没有信息的学生信息。
RIGHT JOIN 正好解决了这个问题。

最后,我还使用了FULL OUTER JOIN。
这种用法比较少见,但是可以返回两个表中的所有行,不匹配的行会用NULL填充。
有时项目需要这种完整的数据,FULL OUTER JOIN 就派上用场了。

通过这些JOIN操作,我学会了根据需要选择合适的JOIN类型,同时也提高了查询效率。
现在回想起来,当时的我可能有些偏激,认为JOIN操作很难,但实际操作起来确实很简单。

九道门丨MySQL七种JOIN类型,终于学明白了!

老实说,当我第一次开始理解 JOIN 时,我被符号的数量所淹没。
内连接没问题。
这是两个表之间的重叠。
例如,如果您检查用户及其购买的产品,您将仅看到用户购买的商品。
然而,LEFT JOIN 非常复杂。
记得有一次做项目的时候,左边的表是用户的,右边的表是订单的。
我需要列出所有用户。
即使您尚未下订单,也请保留空白。
当时老板说:“有空的话就可以了。
”我傻眼了好久,才发现这是一个很酷的 LEFT JOIN 操作。

有趣的是,RIGHT JOIN在MySQL中很少使用,但有一个特定的场景我记得很清楚。
客户希望看到所有产品及其对应的库存,但有些产品可能没有库存。
在这种情况下,您需要使用 RIGHT JOIN 列出所有产品,没有库存的产品将留空。
当时有同事对我说:“写这个SQL太繁琐了。
”结果当我尝试用UNION连接LEFT和RIGHT时,数据增加了一倍,但我居然能得到FULL JOIN的效果。

说到 FULL JOIN,如果 MySQL 直接支持它们那就太好了。
然而,有一个项目让我明白为什么有些人选择使用 UNION 自己做。
当时,所有员工及其部门都必须接受测试。
即使该员工没有部门或者该部门没有员工,仍然必须列出。
SQL 写得就像一个飞球。
最后我用UNION来组合LEFT和RIGHT。
虽然慢了点,但至少数据是完整的。

CROSS JOIN是最有趣的。
我记得我有一个测试环境,有两个表,每个表有 5 00 行。
当我做CROSS JOIN时,它爆炸了,行数变得可怕。
然后测试人员说:“这个SQL需要两个小时才能跑完。
”我很害怕,立即改变了条件。
然而,在某些情况下这确实很有用。
例如,要查看所有产品和所有类别,您需要查看每个产品属于哪个类别。
这就是 CROSS JOIN 派上用场的地方。

NATURAL JOIN 听起来像是一个奇特的名字,但过度使用可能会被证明是非常不可靠的。
我有一个系统,其中两个表具有太多同名列。
NATURAL JOIN 自动连接可能具有相同名称的所有列。
最终,你的数据将会变得混乱。
之后,可以安全地手动指定 ON 条件。

SELF JOIN 是最困难的,尤其是嵌套查询。
我记得在检查员工及其直接主管时两次使用同一张桌子,结果都秃了。
当时有个同事长期使用递归查询,最后最终使用了SELF JOIN我发现它更容易使用。

坦白说,JOIN是一个工具,用在合适的场景下它就变成了一个神奇的技能。
然而,我们在不断尝试中积累了经验,有时也会遇到问题。
例如,假设您忘记添加 ON 条件并且整个表都是相关的。
我真的惊呆了。

mysql 里面JOIN 和 INNER JOIN 区别是什么

JOIN 是跨表查询,INNERJOIN 是内部联接,仅返回匹配的行。
JOIN不要求字段名称相同,INNERJOIN要求字段类型和数据相同。
JOIN 返回所有匹配的行,INNERJOIN 仅返回匹配的行。