MYSQL8多表联查(联合查询)

发布时间:2026/7/21 16:02:05
MYSQL8多表联查(联合查询) MYSQL8多表联合查询多表联合查询常用连接查询多表查询--数据准备交叉连接查询内连接查询隐式内连接显示内连接内连接示例外连接左外连接右外连接:外连接使用using子句相互关联子查询WITH AS子句满外连接不加all会去重UNION all数据会重复自关联查询进行关联查询自关联查询示例多表联合查询通常情况下SQL多表查询Join比子查询效率高。这是因为在使用子查询时需要执行多个查询语句而在使用关联查询时只需要执行单个查询语句。当使用子查询时子查询语句将被执行一次并返回一个结果集这个结果集将用于主查询中的条件判断。如果主查询中有多个条件需要使用子查询返回的结果集进行比较那么就需要执行多个子查询语句这会大大降低查询效率。相比之下使用关联查询时所有的查询条件都包含在单个查询语句中。这样可以减少查询的次数提高查询效率。此外关联查询还可以利用索引来加速查询进一步提高查询效率。尽管关联查询通常比子查询效率更高但在某些特定情况下子查询可能会更加适合。例如当需要在查询结果中动态计算数据或者需要使用聚合函数来汇总数据时使用子查询会更加方便和灵活。常用连接查询多表查询–数据准备交叉连接查询会把左右表都for循环一遍数据冗余叫做笛卡尔积但我们实际需要的只是指定条件的值。内连接查询求两张表交集的部分.隐式内连接-- 隐式内连接-- 查询每个部门的所属员工SELECT*FROMdept3asa,emp3asbWHEREa.deptnob.dept_id;显示内连接-- 显示内连接SELECT*FROMdept3asaJOINemp3asbONa.deptnob.dept_id;-- 示例2SELECT*FROMa_tableINNERJOINb_tableONa_table.a_idb_table.b_id;内连接示例外连接左外连接-- 左连接,以左表为基础展示出左表全部数据和右表交集部分数据SELECT*FROMa_tableLEFTJOINb_tableONa_table.a_idb_table.b_id;右外连接:-- 右连接,以右表为基础展示出右全部数据和左表交集部分数据SELECT*FROMa_tableRIGHTJOINb_tableONa_table.a_idb_table.b_id 外连接载SQL99标准中两个表连接时仅返回匹配的记录是内连接如果两个表进行连接时返回的记录不仅有匹配的记录而且还有不匹配的记录这种连接被称为左外连接或右外连接如果两个表进行连接时返回的记录不仅有匹配的记录还有左连接和有连接的记录这种连接被称为全外连接或满外连接。左外连接把右表中没有但左表中有的数据进行显示右外连接把左表中没有但右表中有的数据进行显示使用using子句假设我们有两个表employees和departments。在employees表中我们有一个名为department_id的列它存储了每个员工所属的部门。在departments表中我们有一个名为department_id的列它存储了每个部门的唯一标识符。现在我们想要联接这两个表并且只返回那些在两个表中都存在的部门。我们可以使用以下查询SELECT*FROMemployeesINNERJOINdepartmentsUSING(department_id);在上面的查询中使用USING子句来指定要联接的列为department_id。这将只返回在两个表中都存在的部门。请注意USING子句只能用于联接相同名称的列。如果您要联接不同名称的列则需要使用ON子句来指定要联接的列。USING子句可以指定只匹配一列也可以指定匹配多个列。相互关联子查询相互关联子查询用于行–执行–行的处理主查询的每一行字查询都要执行一次。WITH AS子句注意MySQL5.7之前没有with as子句从5.7开始引入满外连接UNION合并表–full joinfull join是oracle数据库的独有指令mysql不兼容该指令可以通过UNION来合并左连接表和右连接表实现full join的功能。不加all会去重-- 不加all会去重SELECT*FROMstudent_copyUNIONSELECT*FROMstudent;UNION all数据会重复-- all数据会重复SELECT*FROMstudent_copyUNIONallSELECT*FROMstudent;自关联查询-- 创建表并建立自关联约束createtablet_sanguo(eitINTPRIMARYKEY,enameVARCHAR(20),manager_idINT,---外键列FOREIGNKEY(manager_id)REFERENCESt_sanguo(eid)--添加自关联约束);进行关联查询-- 进行关联查询-- 1. 查询每个三国人物及他的上级信息-- manage_id 是上级id-- eid是员工id上级也是员工所有上级也有eidSELECT*FROMt_sanguoasa,t_sanguoasbWHEREa.manager_idb.eid;自关联查询示例