【MySQL】mysql left join 多个表

参考:mysql left join 多个表

SQL:

select * from t_a a left join t_b b on a.bid = b.bid left join t_c c on a.cid = c.cid

 

t_a表

t_b表 

 t_c表

总的结果:



 

==============================================================

t_a表



 

t_b表



 

t_c表



 

总的结果表:



 

第二次带数据的sql:

 

Java代码   收藏代码
  1. # MySQL-Front 3.2  (Build 14.3)  
  2.   
  3. /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;  
  4. /*!40103 SET TIME_ZONE=’SYSTEM’ */;  
  5. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;  
  6. /*!40101 SET SQL_MODE=’STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ */;  
  7. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;  
  8. /*!40103 SET SQL_NOTES=’ON’ */;  
  9.   
  10.   
  11. # Host: 127.0.0.1    Database: jointest  
  12. # ——————————————————  
  13. # Server version 5.0.22-community-nt  
  14.   
  15. DROP DATABASE IF EXISTS `jointest`;  
  16. CREATE DATABASE `jointest` /*!40100 DEFAULT CHARACTER SET utf8 */;  
  17. USE `jointest`;  
  18.   
  19. #  
  20. # Table structure for table t_a  
  21. #  
  22.   
  23. CREATE TABLE `t_a` (  
  24.   `aid` int(11) NOT NULL auto_increment,  
  25.   `aname` varchar(11default NULL,  
  26.   `bid` int(11default NULL COMMENT ‘引用自t_b的bid’,  
  27.   `cid` int(11default NULL COMMENT ‘引用自t_c的cid’,  
  28.   PRIMARY KEY  (`aid`)  
  29. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  30.   
  31. #  
  32. # Dumping data for table t_a  
  33. #  
  34.   
  35. INSERT INTO `t_a` VALUES (1,‘a名字1’,1,1);  
  36. INSERT INTO `t_a` VALUES (2,‘a名字2’,NULL,2);  
  37.   
  38. #  
  39. # Table structure for table t_b  
  40. #  
  41.   
  42. CREATE TABLE `t_b` (  
  43.   `bid` int(11) NOT NULL auto_increment,  
  44.   `bname` varchar(11default NULL,  
  45.   PRIMARY KEY  (`bid`)  
  46. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  47.   
  48. #  
  49. # Dumping data for table t_b  
  50. #  
  51.   
  52. INSERT INTO `t_b` VALUES (1,‘b名字’);  
  53.   
  54. #  
  55. # Table structure for table t_c  
  56. #  
  57.   
  58. CREATE TABLE `t_c` (  
  59.   `cid` int(11) NOT NULL auto_increment,  
  60.   `cname` varchar(11default NULL,  
  61.   PRIMARY KEY  (`cid`)  
  62. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  63.   
  64. #  
  65. # Dumping data for table t_c  
  66. #  
  67.   
  68. INSERT INTO `t_c` VALUES (1,‘c名字’);  
  69. INSERT INTO `t_c` VALUES (2,‘c名字2’);  
  70.   
  71. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;  
  72. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;  
  73. /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;  
 
MySQL 中,`LEFT JOIN` 是一种用于多连接查询的操作,它会返回左中的所有记录,即使右中没有匹配的行。当涉及多个 `LEFT JOIN` 操作时,执行顺序和逻辑对最终结果集有重要影响。 ### 多 LEFT JOIN 的执行顺序 MySQL 执行多 `LEFT JOIN` 查询时遵循从左到右的顺序进行连接[^1]。这意味着第一个(最左侧的)作为初始驱动,随后依次与后续的每个进行连接操作。每一步连接的结果都会作为下一次连接的左继续处理。 例如,在以下 SQL 语句中: ```sql SELECT * FROM table_a a LEFT JOIN table_b b ON a.id = b.a_id LEFT JOIN table_c c ON b.id = c.b_id; ``` - 首先,`table_a` 作为驱动,与 `table_b` 进行 `LEFT JOIN`,生成一个临时结果集。 - 然后,这个临时结果集再与 `table_c` 进行 `LEFT JOIN`。 在整个过程中,`table_a` 始终是主,不会因为后续连接而丢失其任何一行数据。如果某个连接条件不满足,则对应字段的值为 `NULL`。 ### LEFT JOIN 与 INNER JOIN 混合使用的影响 当在一个查询中混合使用 `LEFT JOIN` 和 `INNER JOIN` 时,执行顺序会影响整个结果集的内容。由于 `INNER JOIN` 只保留两个中都存在匹配的行,因此在 `LEFT JOIN` 后紧跟 `INNER JOIN` 可能会导致某些原本应保留在左中的行被过滤掉。 例如: ```sql SELECT * FROM table_a a LEFT JOIN table_b b ON a.id = b.a_id INNER JOIN table_c c ON b.id = c.b_id; ``` 在这个例子中,尽管 `table_a` 与 `table_b` 使用了 `LEFT JOIN`,但紧接着的 `INNER JOIN` 对 `table_c` 的连接可能会排除掉那些在 `table_b` 中没有匹配行的数据,从而抵消了 `LEFT JOIN` 的作用。 ### 优化器行为与实际执行顺序 虽然 SQL 语句书写顺序是从左到右,但 MySQL 查询优化器可能会根据统计信息重新安排的连接顺序以提高性能。这种重排通常基于成本模型,旨在最小化中间结果集的大小并减少 I/O 操作次数。然而,对于 `LEFT JOIN` 来说,左始终被视为驱动,优化器不会改变这一特性,因为它会影响最终结果的正确性。 ### 示例说明 假设三张结构如下: - `users(id, name)` - `orders(order_id, user_id, amount)` - `addresses(address_id, user_id, detail)` 要获取用户及其订单和地址信息: ```sql SELECT users.name, orders.amount, addresses.detail FROM users LEFT JOIN orders ON users.id = orders.user_id LEFT JOIN addresses ON users.id = addresses.user_id; ``` 此查询将列出所有用户的名称、对应的订单金额以及地址详情;若某用户无订单或地址信息,则相关字段显示为 `NULL`。 ### 总结 理解 `LEFT JOIN` 的执行顺序有助于编写更高效准确的 SQL 查询。通过合理设计连接条件和顺序,可以确保所需数据完整呈现,并避免不必要的数据丢失。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值