我有一个困境,我有一位老师,基本上认为我内心联合是地狱(他责备我因为我错过了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;
那么哪一个更有效率?
答案 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可以工作 - 类似于子查询 - 但也可以返回额外的行或从输出中删除行。