[英]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.