浅谈 MySQL 连表查询

连表查询是一把双刃剑, 优点是适应范式, 减少数据冗余; 缺点是连表查询特别是多张表的连表会增加数据库的负担, 降低查询效率.

简介

连表查询就是 2 张表或者多张表的联合查询, 联合查询的结果称之为 "笛卡尔积", 假设 A 表中有 n 条记录, B 表中有 m 条记录, "笛卡尔积" 就是 n*m

各种连表查询的本质就是对笛卡尔积的过滤

  • 全查询: 全量查询笛卡尔积, n*m 种结果, 不加关键字过滤
  • 内连接: 关键字是 INNER JOIN, JOIN, WHERE, 或者自然匹配(省略连表条件, 不建议使用!!!)
  • 外连接:

    • 左外连接: 关键字是 LEFT JOIN, LEFT OUTER JOIN
    • 右外连接: 关键字是 RIGHT JOIN, RIGHT OUTER JOIN

这里有一张神图

连表查询总结

数据准备

create table `user_a` (  `aid` int(11) NOT NULL AUTO_INCREMENT,  `a_name` varchar(255) NOT NULL,  `age` smallint NOT NULL,  PRIMARY KEY(`aid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '测试表A';

create table `user_b` (  `bid` int(11) NOT NULL AUTO_INCREMENT,  `b_name` varchar(255) NOT NULL,  `age` smallint NOT NULL,  PRIMARY KEY(`bid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '测试表B';

# 插入测试数据INSERT INTO `user_a`(aid, a_name, age) VALUES(1, 'test1', 1),(2, 'test2', 2),(3, 'test3', 3);INSERT INTO `user_b`(bid, b_name, age) VALUES(1, 'test2', 2),(2, 'test3', 3),(4, 'test4', 4);

全查询

全查询
# 全查询: 下面的结果都是等价的# [推荐] INNER JOINSELECT * FROM user_a INNER JOIN user_b;SELECT * FROM user_a, user_b;SELECT * FROM user_a JOIN user_b;SELECT * FROM user_a CROSS JOIN user_b;

结果: 全量查询 n*m 种可能性

全量查询结果

内连接

内连接

对 n*m 的笛卡尔积进行过滤, 用 WHERE 或者 ON 关键字都是等价的(内连接是等价的, 外连接不是等价的)

(建议使用 ON 关键字, 约定俗称)

# 内连接: 下面的结果都是等价的# [推荐] INNER JOIN + ONSELECT * FROM user_a a INNER JOIN user_b b ON a.a_name=b.b_name;# INNER JOIN + WHERESELECT * FROM user_a a JOIN user_b b ON a.a_name=b.b_name;# JOIN + ONSELECT * FROM user_a a JOIN user_b b ON a.a_name=b.b_name;# JOIN + WHERESELECT * FROM user_a a JOIN user_b b WHERE a.a_name=b.b_name;# 多表 + WHERESELECT * FROM user_a a, user_b b WHERE a.a_name=b.b_name;

结果: 只有左边和右边同时存在才会返回再结果集里面

内连接结果

外连接

外连接包括左连接和右连接

左连接

左连接
# 左连接# [唯一写法] LEFT JOIN + ONSELECT * FROM user_a a LEFT JOIN user_b b ON a.a_name=b.b_name;

结果: 保证左边的数据完整, 如果右边没有该数据, 则右边的数据为 NULL

左连接结果

右连接

右连接
# 右连接# [唯一写法] RIGHT JOIN + ONSELECT * FROM user_a a RIGHT JOIN user_b b ON a.a_name=b.b_name;

结果: 保证右边的数据完整, 如果左边没有该数据, 则左边的数据为 NULL

右连接结果

ON 和 WHERE 的区别

ON 和 WHERE 在内连表的时候是没有区别的 (推荐使用 INNER JOIN + ON 的规范写法)

外连接只能用 ON, 外连接用 WHERE 直接语法错误

为什么要小表驱动大表

因为连接查询的本质是遍历左边表的记录去匹配右边表的记录, 左边表的复杂度是 O(n), 右边表能走索引 O(log n)

总结

  • 全量查询: 推荐使用 INNER JOIN 查询整个笛卡尔集, 不常用
  • 内连接: 推荐使用 INNER JOIN + ON
  • 左连接: 推荐使用 LEFT JOIN + ON
  • 右连接: 推荐使用 RIGHT JOIN + ON
  • 使用小表驱动大表, 因为驱动表的复杂度是 O(n), 被驱动表的复杂度是 O(log n)

reference

https://juejin.cn/post/7043811976270577672

本文由 mdnice 多平台发布

浅谈 MySQL 连表查询相关推荐

  1. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  2. 浅谈mysql的子查询

    2019独角兽企业重金招聘Python工程师标准>>> mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,mysql在处理子查 ...

  3. 浅谈 MySQL 子查询及其优化

    2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...

  4. 浅谈MySQL表类型

    小小子的文章写的不错哦. 转载:http://www.xiaoxiaozi.com/2009/07/14/1171/ 浅谈MySQL表类型 MySQL为我们提供了很多表类型供选择,有MyISAM.IS ...

  5. 支付宝的数据库是MySQL变种_浅谈MySql的储存引擎(表类型)

    浅谈mysql的存储引擎(表类型) 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库, ...

  6. mysql 用户通配符_浅谈mysql通配符进行模糊查询的实现方法

    在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符. 首先我们来了解一下2个概念,一个是操作符,一个是通配符. 操作符 like就是SQL语句中的操作符,它的作用是指示在SQL语句后 ...

  7. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  8. mysql怎么在海量数据上ddl_浅谈MySQL Online DDL(中)

    本文首发于个人微信公众号<andyqian>,期待你的关注! 前言 在上一篇文章中<浅谈MySQL Online DDL (上)>中,我们谈到了MySQL Online DDL ...

  9. php 如何设计索引_Mysql学习浅谈mysql的索引设计原则以及常见索引的区别

    <Mysql学习浅谈mysql的索引设计原则以及常见索引的区别>要点: 本文介绍了Mysql学习浅谈mysql的索引设计原则以及常见索引的区别,希望对您有用.如果有疑问,可以联系我们. 索 ...

最新文章

  1. ADO.NET并发性
  2. Spring学习笔记十七---事务的转播行为
  3. [导入]微软CSS,GCR半日游--学了一样东西,什么叫做灰头土脸
  4. 神经网络与卷积神经网络入门(保证让你懂)
  5. boost::mpi模块实现scan集合的测试
  6. 虚拟机上安装完成redhat后无法上网和Xshell无法连接虚拟机的问题
  7. 为什么不用ZK来做服务发现?
  8. Android 进程常驻(5)----开机广播的简单守护以及总结
  9. 律师坚称技术无罪:“钉钉打卡神器”开发者二审被改判四年
  10. 你不知道的JS之作用域和闭包(二)词法作用域
  11. 伦巴时间步的动作要领_拉丁舞教学视频,拉丁伦巴舞基本动作
  12. 1. C++基础知识学习及其深入理解(面向对象部分还没学) -- 课程1完成
  13. 虚拟机里面主要涉及哪些功能,虚拟机管理需要哪些功能
  14. 电脑用户计算机名文件夹,电脑用户名文件夹名称更改
  15. 搜狐CEO张朝阳:不想把成功交给一种可能
  16. Linux性能优化之内存(一)
  17. 汽车车牌自动识别技术
  18. 深度学习之目标检测--Pytorch实战
  19. word文档在保存后消失,如何恢复?
  20. 130个超实用的网站

热门文章

  1. mysql c dll_libmysql_c.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  2. 4.四大组件的工作过程
  3. Minecraft 1.16.5模组开发(五十四) 方块探测器(Detector)
  4. Linux 命令ps aux命令解析
  5. CC00038.python——|HadoopPython.v02|——|Arithmetic.v02|Pandas数据分析库:Pandas数据结构|
  6. 猴子钦定大王(循环单链表)
  7. Error: Unknown command: cask
  8. fastJson API 最快的Json和对象转换工具
  9. Typora+Git搭建云笔记本
  10. 以前flyback的osdiy