多表查询
给表起别名后,只能用别名表示表,不能用原名
连接

JOIN 是 MySQL 中常用的连接表的方式,通常不需要对 JOIN 进行细分。
"JOIN" 关键字在 SQL 查询中通常用来表示内连接(Inner Join)。
在 MySQL 中,JOIN 子句用于将两个或多个表连接在一起,以便在这些表之间共享数据。JOIN 子句包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 等关键字,这些关键字用于指定不同类型的连接。
以下是一些常见的连接类型:
-
INNER JOIN:也称为等值连接,它只返回两个表中匹配的行。 -
LEFT JOIN:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。如果右侧表中没有匹配的行,则返回NULL值。 -
RIGHT JOIN:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。如果左侧表中没有匹配的行,则返回NULL值。 -
FULL OUTER JOIN:返回左侧表和右侧表中的所有行,并将它们合并在一起。如果某个表中没有匹配的行,则返回NULL值。
在实践中,INNER JOIN 和 LEFT JOIN 最常用,因为它们已经能够满足大多数查询需求了。但是,当你需要特定的连接类型时,MySQL 提供了各种 JOIN 子句来满足你的需求。
请注意,无论使用哪种连接类型,都需要指定连接条件,以便将两个表之间的行进行匹配。连接条件通常是两个表之间的关联键。
复杂语句分析
-
update
-
set
-
子查询
-
别名
这是一个更新查询,将 ID 为 12 的员工的 job_id 和 salary 更新为 ID 为 3 的员工相应的值。具体分析如下:
UPDATE employees
SET job_id = (SELECT e1.job_id FROM (SELECT job_id FROM employees WHERE employees_id = 3) e1),
salary = (SELECT e2.salary FROM (SELECT salary FROM employees WHERE employees_id = 3) e2)
WHERE employees_id = 12;
首先,两个子查询 (SELECT job_id FROM employees WHERE employees_id = 3) 和 (SELECT salary FROM employees WHERE employees_id = 3) 分别获取了 ID 为 3 的员工的 job_id 和 salary 值。
然后,这些值被嵌套在 SET 子句中,在更新 ID 为 12 的员工的记录时使用。也就是说,ID 为 12 的员工的 job_id 和 salary 列将被更新为 ID 为 3 的员工对应的值。
最后,WHERE 子句指定了要更新的行,即 employees_id = 12。
需要注意的是,如果子查询中返回的结果集超过一行,将会导致 MySQL 错误代码 1242。因此,这里假设 employees_id 是主键或者具有唯一性约束,以保证子查询只返回一行结果。
1093 - You can't specify target table 'employees' for update in FROM clause
抱歉,你遇到的错误是由于 MySQL 不允许在子查询中直接引用正在进行 UPDATE 的目标表。为了解决这个问题,你可以使用临时表或者内联视图来绕过这个限制。
以下是修改后的查询示例,使用内联视图来更新目标表:
UPDATE employees
SET job_id = (SELECT job_id FROM (SELECT job_id FROM employees WHERE employees_id = 3) AS temp),
salary = (SELECT salary FROM (SELECT salary FROM employees WHERE employees_id = 3) AS temp)
WHERE employees_id = 12;
在这个查询中,我们将原本的子查询包装在一个内联视图(内层子查询)中,并赋予它一个别名 temp。然后,我们在外层的 SET 子句中引用这个内联视图来获取 job_id 和 salary 值,并将它们同时更新到 employees_id 为 12 的行中。
请注意,这种方式虽然能够解决上述错误,但是会引入额外的性能开销。如果可能的话,建议尝试其他更高效的查询方式来达到相同的结果。
查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况。
SELECT * FROM student
WHERE name LIKE '张%' OR name LIKE '李%' OR name LIKE '刘%';
本文详细解释了MySQL中的多表查询,包括JOIN的不同类型(INNERJOIN、LEFTJOIN等),如何在UPDATE语句中使用子查询,并介绍了如何使用LIKE条件筛选姓氏特定的学生。还提及了在更新查询中避免1242错误的方法,如使用内联视图。
3452

被折叠的 条评论
为什么被折叠?



