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

时间:2017-10-20 03:07:45

标签: sql sql-server

我有一个困境,我有一位老师,基本上认为我内心联合是地狱(他责备我因为我错过了3分钟的最终项目交付......),现在我有另一个告诉我使用只是选择是低效的,所以我不知道什么是白色或黑色...有人可以用他们的知识启发我吗?

加入

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;

那么哪一个更有效率?

1 个答案:

答案 0 :(得分:0)

让我们重新编写代码,以便更容易理解:

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'

您在原始查询中实际执行的操作是隐式连接。这类似于内连接,没有声明确切的连接条件。隐式连接将尝试在表之间连接类似命名的列。大多数程序员不建议或使用隐式连接。

对于join和subquery,它们适用于不同的情况。

它们不等同。请注意我在下面加粗的内容:

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

JOIN(INNER JOIN)的运作方式不同。它可以匹配行并获得您正在寻找的单个值,就像子查询一样。但是,如果连接条件不明显(单数/非重复),连接可以乘以返回的行。这就是为什么连接通常在主键(PK)上完成的原因。根据定义,PK是不同的。如果表之间没有出现连接条件, INNER JOIN也将删除行。这可能是你的第一位教授试图解释的内容 - 在许多情况下INNER JOIN可以工作 - 类似于子查询 - 但也可以返回额外的行或从输出中删除行。