多表查询
给表起别名后,只能用别名表示表,不能用原名
连接
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 '刘%';
标签:salary,JOIN,employees,查询,job,MySQL,多表,id,SELECT
From: https://blog.csdn.net/yumiao0220/article/details/137012012