首页 > 数据库 >MySQL的多表查询

MySQL的多表查询

时间:2024-03-25 14:01:47浏览次数:23  
标签:salary JOIN employees 查询 job MySQL 多表 id SELECT

多表查询

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

连接

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 '刘%';

标签:salary,JOIN,employees,查询,job,MySQL,多表,id,SELECT
From: https://blog.csdn.net/yumiao0220/article/details/137012012

相关文章

  • 查询你的网络适配器是否支持虚拟 Wi-Fi 热点功能,Hosted network"(托管网络),
    "Hostednetwork"(托管网络)是一种Windows操作系统中的功能,它允许你将计算机或设备转换为一个虚拟的Wi-Fi热点,使其他设备可以连接到该热点来共享网络连接。这项功能通常用于无线网络共享、临时网络搭建或者将有线网络连接转换为无线网络连接的情况。为什么托管网络功能会被设计......
  • MySQL学习必备SQL_DDL_DQL
    1.学生表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyin......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • MySQL 学习必备SQL_DDL_DML_DQL
    mySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排列规则【utf8_general_ci】,21、学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`creatDate`datetimeDEFAULTNULL,`userName`varchar(20)D......
  • Java项目:小程序公交信息在线查询系统(java+SSM+Vue+ElementUI+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SSM+Vue的小程序公交信息在线查询系统小程序角色:管理员、用户两种角色,分为小程序端和后台管理两部分;用户:用户通过小程序登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、线路信息、站......
  • Java项目:汽车租赁管理系统(java+SpringBoot+Vue+ElementUI+Mybaits+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于SpringbootVue汽车租赁管理系统角色:管理员、用户、普通管理员三种角色,分为前后台;用户:用户通过用户登录页面可以填写用户名和密码等信息进行登录操作,登录成功后,进入首页可以查看首页、汽车信息、汽车资讯、汽车论坛、公......
  • MySQL学习必备SQL_DDL_DML_DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf-8】,排序规则【utf8_general_ci】。1、学习表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,......
  • MySQL学习必备
    1.学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENT,`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`tinyint(3)DEFAULTNULL,......
  • MySQL学习必备SQL_DDL_DML_DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDB】,字符集【utf8】,排序规则【utf8_general_ci】1、学生表DDLCREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEF......
  • MySQL学习必备SQL_DDL_DML+DQL
    MySQL创建数据库需要自行创建,数据库名称可以为【schoolDb】,字符集【utf8】,【utf8_general_ci】1.学生表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,......