王志新的博客

mysql多表联查

王志新 2018-06-07 12:08:02
正文点这评论(0 人参与)
mysql多表联查


mysql多表联查是很常见的问题,记录下我常用的查询方式


1:inner join 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。(INNER JOIN 与 JOIN 是相同的)

举例:select order.orderId,order_pay.content from order inner join order_pay on(order.orderId = order_pay.orderId) where order.orderId = '111111';


2:left join 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

举例:select user.userId,IF(user_vip.userId,1,0) as userVip from user left join user_vip on (user.userId = user_vip.userId) where user.userId = 'xxx';


3:right join 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

举例:select order_pay.content,order.orderMoney from order right join order_pay on (order_pay.orderId = order.orderId ) where order.orderId = 'xxxxx';


需要注意的是:多表联查的时候关联的字段一定要是索引,或者是主键,否则会造成全表扫描影响效率

left join最好是左表先过滤出少量的数据 在和右表去关联

同理

right join 最好是右表现过滤出少量的数据 在和左表去关联

尽量减少主表的数据在去和其他的表去关联,这样速度会快很多


ps:有大神说,表关联会产生迪卡尔积现象,大神选用查出a表数据 然后 in() b表的数据,

虽然表关联是先产生迪卡尔积然后在筛选数据,但是给好条件减少数据的过滤,感觉应该比in快很多吧。

应该是我太菜鸟了,以后再来补充

ps:2018-11-30

如果两张表的关联id其中一张表的id会重复很多的话就不适合用inner jion,因为会产生很严重的 迪卡尔积现象 并且是全表



打赏

评论

评论
搜索
网站分类
最近发表
  • mac系统VirtualBox + Vagrant + 宝塔 Linux虚拟开发环境
  • Mac系统VirtualBox中CentOS启用共享文件夹
  • centos虚拟机配置静态IP网络
  • ssh远程连接服务器异常修复(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)
  • vsCode+Homestead开启xdebug调试
  • PHP Laravel Homestead安装
  • php+Xunsearch中文检索
  • array_filter()
  • array_fill_keys()
  • array_fill()
  • 常用工具
    软件下载
    友情链接

    X
    我知道了