我很好奇为什么需要使用,LEFT JOIN
因为我们可以使用逗号选择多个表。
LEFT JOIN
和使用逗号选择多个表之间有何区别?
哪一个更快?
这是我的代码:
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT no as nonvs,
owner,
owner_no,
vocab_no,
correct
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
…和:
SELECT *
FROM vocab_stats vs,
mst_words mw
WHERE mw.no = vs.vocab_no
AND vs.correct > 0
AND mw.level = 1
AND vs.owner = 1111
首先,要完全等同,应该已经编写了第一个查询
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT *
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
这样mw。和nvs。一起产生与第二个查询的单数*相同的集合。您编写的查询可以使用INNER JOIN,因为它包括对nvs.correct的过滤器。
一般形式
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
查找基于条件的TableB记录。如果失败,将保留来自TABLEA的结果,并将来自TableB的所有列都设置为NULL。相比之下
TABLEA INNER JOIN TABLEB ON <CONDITION>
还 attempts
可以根据条件查找TableB记录。 但是 ,如果失败,则将TableA中的特定记录从输出结果集中删除。
CROSS
JOIN的ANSI标准在两个表之间产生笛卡尔乘积。
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
语法的意图是将TABLEA中的EACH行与TABLEB中的EACH行连接在一起。因此,A中的4行和B中的3行会产生12行输出。与WHERE子句中的条件配对时,有时会产生INNER
JOIN相同的行为,因为它们表达的是相同的东西(A和B之间的条件=>保持或不保持)。但是,在阅读有关使用INNER
JOIN而不是逗号的意图时,它要清晰得多。
在性能方面,大多数DBMS处理LEFT联接的速度要比INNER JOIN更快。逗号表示法可能导致数据库系统误解其意图并产生错误的查询计划-
SQL92表示法的另一优点。
为什么我们需要左加入? 如果上面对LEFT
JOIN的解释仍然不够(保留A中的记录而B中没有匹配项),则认为要达到相同的效果,您将需要使用旧的逗号将两组之间的UNION复杂化以达到相同的效果。
但是,如前所述 ,这不适用于您的示例,它实际上是一个隐藏在LEFT JOIN后面的INNER JOIN。
html" target="_blank">笔记:
LEFT OUTER JOIN
。所以我正在使用PHP和MySQL制作一个简单的电影数据库。我有两张桌子: 电影 电影类型
问题内容: 我有两个表,和。 在表中我有一列。该列由电影适合的类别组成。这些类别是用逗号分隔的ID。 这是一个例子: 现在是一个实际的问题:是否可以执行一个查询,从电影表中排除类别列,而是从类别表中选择匹配的类别并以数组形式返回它们?像联接一样,但问题是存在多个用逗号分隔的类别,是否可以进行某种正则表达式? 问题答案: 在数据库字段中使用逗号分隔的列表是一种反模式,应不惜一切代价避免使用。 因为在
问题内容: 我有2张桌子如下 笔记表 职位表 我想查询我的Notes表并将’forDepts’列与Positions表中的值相关联。 输出应为: 我知道数据库应该规范化,但是我不能更改此项目的数据库结构。 这将用于使用以下代码导出excel文件。 此代码仅输出“ forDepts”的第一个值 考试:执行人员(而不是执行人员,公司行政人员,Art) 可以通过CONCAT或FIND_IN_SET完成吗
我想添加表示来自其他表的计数的列。 我有三张桌子。 消息 主题 STARS_GIVED 我想以: 主题回顾 所以基本上,我想附上3列唯一值的计数(每个主题中给出的星数,在主题中有消息的唯一用户,以及每个主题中唯一消息的数量)。 我希望最终能够对类别进行筛选(看看两列)。 此外,我希望最终按我加入的计数排序。例如,我将有一个按钮,按“星星的数目”按升序排序,或按“用户的数目”按降序排序,等等。 我试
我有一个表,需要离开外部连接两个不同的表。当我将表放入查询中两次,并将其与where子句中的self连接时(如下面的句子),它就可以工作了。我认为这不应该是正确的做法。如何编写select语句并将表与多个不同的表进行外部联接?
问题内容: 我用多个(包括一个)编写了这个SQL请求。 它给了我预期的结果 。 但是,“ Id就像此请求的Linq等效项一样,将其放在应用程序的数据访问层中。 我尝试了类似的东西: 我试图适应这个问题,但我无法弄清楚。我对分组子请求的内部迷失了。 谁能解释我哪里错了? 专家提示:如果有人可以用lambda表达式编写等效项,则可获赠积分 问题答案: 要将SQL转换为LINQ查询理解: 将子选择转换为