SQL server基本技能篇:关于SQL语句中的几个join

抱歉,今天我们要讨论 SQL 中的 JOIN。
首先,您需要了解 JOIN 的作用。
它允许我们关联两个表中的数据,看看它们是否有共同点。
让我们先从基础知识开始。

例如,我们有两张表,一张叫A,一张叫B。
A表可以包含A同学的成绩,B表可以包含B同学的成绩。
如果我们想查看哪个学生的成绩最好,我们可以使用JOIN。

我们先来说说这个INNER JOIN。
这就像一个内部工会。
仅显示两个表中的共同点。
就像两个集合的交集一样,只有同时具有 A 和 B 的值才会出现。
这个东西直接看结果就行了,这里我们不写代码了。

我们来谈谈LEFT JOIN,这个有点意思。
它基于左侧的表格。
无论右边是否有匹配,都会显示左边的数据。
如果右侧有匹配项,就会出现。
如果没有匹配,将使用 null 代替。
就像当你和朋友聚会时,你需要让他们知道你是否来。

Right JOIN 实际上与 LEFT JOIN 类似,只不过方向相反。
根据右表,无论匹配与否,都会显示左侧的数据。

另一个完整的外部连接,它会很棒。
它将显示两个表中的所有数据,就像连接两个集合一样,显示左边是什么,右边是什么。

还有Cross JOIN,更简单。
它是表A和表B的笛卡尔积,即所有可能的组合,就像两个集合的乘积一样。
返回的行数是A表的行数乘以B表的行数。

对了,我们需要讲一下null的概念。
null 不代表空白或空格,它代表“没有内容”。
例如,学生A没有参加考试,我们找不到他的成绩。
现在显示Null,表示没有分数。
学生A参加了考试,但成绩还没有出来。
这时候你也可以看到他参加了考试,但是分数为空,也就是说他有分数但是还没有确定。
A同学参加了考试,成绩出来了,但是分数是0分。
此时分数为 0 或空白,说明有分数但值为 0。

这些例子可能有点不精确,但希望可以帮助您大致了解这些概念之间的差异。
稍后我们需要使用更多的示例和代码来加深我们的理解。
说实话,当时我不太明白,但现在我觉得这些概念还蛮有趣的。

sql左连接与内连接的区别

那天我在整理旧电脑时,发现了一张十年前的工资单。
在电子表格中,我名下的行中的工资是 3 ,000 挪威克朗,下面注明“成为全职员工后”。
再往下是部门栏“技术部”。
我突然想到,如果HR自己建一个工资表和部门清单,用SQL查询转正后还在技术部门的人,哪种连接方式最合适?
内有链接,可能找不到。
例如,如果后来部门列表发生变化,或者有人换工作,工资表中的记录还在,但部门表中没有对应关系。
那条工资3 000的工作直接消失了。
这有问题,这显然是我的工作。

等一下,左连接似乎更正确。
工资表必须完整。
即使以后职位和薪资调整,原始记录也不能丢失。
部门表是匹配的,否则为空。
这样打勾就可以看到十年前的工资和部门。
即使以后这个部门消失了,你的工资仍然存在。
检查确定。

不过话说回来,如果当年的工资是按月结算的,表中的一项代表一个月的工资,部门表中的一项代表一个部门,那还需要用左连接吗?不然怎么能查到一个人全年的薪资变化,哪怕他中途换了部门?内连接会将同一个人不同月份的工资算作重复数据,这是肯定不可能的。

sql中join和where sql中join和innerjoin

哎,这个SQL JOIN和WHERE,我给大家讲讲我当年踩到的陷阱吧。

假设一年前,我在上海做一个项目,遇到了一个愚蠢的请求。
老板说他想查看所有用户都买了什么,把用户信息和订单信息放在一起。
当我开始编写 WHERE 时,我写了类似 WHERE users.id =orders.user_id 的内容。
然而跑了半天,数据不符,让我怀疑人生。
旁边的小伙子稍后会告诉我,为什么不使用JOIN呢?我当时就疑惑了,WHERE不也行吗?那家伙说,当你写WHERE时,数据库必须先运行用户表,然后运行订单表,如果匹配的话就给你。
加入是不同的。
它直接根据users.id和orders.user_id两个字段进行联表,效率高很多。

所以你看,JOIN主要是将表与表关联起来。
和前面的场景一样,用户表和订单表通过用户ID关联起来。
如果只用WHERE来写连接条件,数据库实现会比较尴尬,效率会很低。
至于JOIN,它就是专门为此而设计的,而且编写起来也很简单。

加入,我知道这一点。
它只是为您提供两个表中的匹配数据。
例如,如果您使用 INNER JOIN 检查用户和订单,则结果中只会出现同时具有用户信息和订单信息的用户。
如果你使用LEFT JOIN,即使用户没有订单,只要用户信息有,就会给你拉出来。
一年前我有一个项目,要查询离职员工的信息。
我不小心使用了 RIGHT JOIN 并拉出了所有没有订单的工人。
老板有问题,问为什么辞职的员工还有订单?然后我切换到 INNER JOIN。

关于WHERE,这个很好说。
无论您想要过滤什么条件,都可以使用 WHERE。
例如,如果要查看年龄超过3 0岁的用户,或者订单总数超过1 000个,则需要使用WHERE。
但如果你用WHERE来写连接条件,数据库优化器可能会很困惑,不知道你是要过滤还是连接,执行效率会很差。
我有一个朋友写了一个复杂的查询,用WHERE来写连接状态,但是运行了一个小时还没有结果。
然后,我切换到 JOIN,几秒钟之内就出来了。
你生气不生气?
所以总结一下,我踩过的陷阱是:
1 使用JOIN连接表,不要使用WHERE写连接条件,效率较差。
2 . INNER JOIN 只给你匹配的数据,LEFT JOIN 给你左表中的所有数据,也给你不匹配的数据。
3 .使用WHERE进行过滤条件,不要将其与连接混淆。

这都是真的。
某些年份、某些地方的某些项目我会告诉大家清楚。
如果你还有不明白的地方,不要问我。
我以前没接触过这个,不敢乱说。