繁体   English   中英

SQL优化(内部联接或选择)

[英]SQL optimization (inner join or selects)

我有一个难题,我有一个老师,我基本上以为内部连接是地狱(他责备我,因为我错过了3分钟内最后一个proyect的交付...),现在我有另一个告诉我,仅使用selects效率低下,所以我不知道什么是白色或黑色...有人可以用他们的知识启发我吗?

加入

SELECT
    NombreP AS Nombre, 
    Nota 
FROM Lleva 
    INNER JOIN Estudiante ON CedEstudiante = Estudiante.Cedula 
WHERE
    Lleva.SiglaCurso='CI1312';

没有加入

SELECT
    NombreP AS Nombre, 
    Nota 
FROM (
    SELECT 
        Nota, 
        CedEstudiante 
    FROM Lleva 
    WHERE
        SiglaCurso='CI1312'
) AS Lleva, (
SELECT
    NombreP, 
    Cedula 
FROM Estudiante
) AS Estudiante 
WHERE
    CedEstudiante = Estudiante.Cedula;

那么哪一个更有效?

让我们重新编写代码,以便于理解:

SELECT E.NombreP AS Nombre 
      ,L.Nota 
FROM Lleva L INNER JOIN Estudiante E ON L.CedEstudiante = E.Cedula 
WHERE
    L.SiglaCurso='CI1312';

使用子查询的表可能如下所示:

SELECT L.Nota  
      ,(SELECT E.Nombre 
          FROM Estudiante E 
         WHERE E.Cedula = L.CedEstudiante
       )
FROM Lleva L 
WHERE
    L.SiglaCurso='CI1312'

您在原始查询中实际执行的操作是隐式联接。 这类似于内部联接,但未声明确切的联接条件。 隐式连接将尝试在表之间的名称相似的列上进行连接。 大多数程序员不建议也不使用隐式连接。

至于联接还是子查询,它们适用于不同的情况。

它们不相等。 注意下面我用粗体显示的内容:

子查询将保证1个返回值或返回NULL 如果子查询中返回了多个值,则返回一个以上的值时会出错,并且可能必须通过聚合来解决问题(最大值,前1个值)。 不返回匹配项的子查询将返回NULL,而不会影响该行的其余部分。

JOIN(INNER JOIN)的操作方式不同。 它可以匹配行并获得您要查找的单个值,就像子查询一样。 但是,如果联接条件不同(奇异/非重复),则联接可以使返回的行相乘 这就是为什么通常在主键(PK)上进行联接的原因。 根据定义,PK是不同的。 如果表之间没有出现联接条件,则INNER JOIN也会删除行 这可能是您的第一位教授试图解释的内容-INNER JOIN在许多情况下都可以工作-类似于子查询-但也可以返回其他行或从输出中删除行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM