MySQL的多表查询

多表查询

给表起别名后,只能用别名表示表,不能用原名

连接

JOIN 是 MySQL 中常用的连接表的方式,通常不需要对 JOIN 进行细分。

"JOIN" 关键字在 SQL 查询中通常用来表示内连接(Inner Join)。

在 MySQL 中,JOIN 子句用于将两个或多个表连接在一起,以便在这些表之间共享数据。JOIN 子句包括 INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN 等关键字,这些关键字用于指定不同类型的连接。

以下是一些常见的连接类型:

  • INNER JOIN:也称为等值连接,它只返回两个表中匹配的行。

  • LEFT JOIN:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。如果右侧表中没有匹配的行,则返回 NULL 值。

  • RIGHT JOIN:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。如果左侧表中没有匹配的行,则返回 NULL 值。

  • FULL OUTER JOIN:返回左侧表和右侧表中的所有行,并将它们合并在一起。如果某个表中没有匹配的行,则返回 NULL 值。

在实践中,INNER JOINLEFT JOIN 最常用,因为它们已经能够满足大多数查询需求了。但是,当你需要特定的连接类型时,MySQL 提供了各种 JOIN 子句来满足你的需求。

请注意,无论使用哪种连接类型,都需要指定连接条件,以便将两个表之间的行进行匹配。连接条件通常是两个表之间的关联键。

复杂语句分析
  • update

  • set

  • 子查询

  • 别名

这是一个更新查询,将 ID 为 12 的员工的 job_idsalary 更新为 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_idsalary 值。

然后,这些值被嵌套在 SET 子句中,在更新 ID 为 12 的员工的记录时使用。也就是说,ID 为 12 的员工的 job_idsalary 列将被更新为 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 '刘%';

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值