今天去面试遇到了一个问题,左连接查询的问题

6 篇文章 0 订阅

问:(左(外)连接)左连接查询主数据一定能查询到数据吗?

答:一定能?

答案是错误的,现在想想好傻,如果一定能查询到数据,连表查询条件有什么作用呢?

以下有两张表做了测试:

user 表,里面有两条数据,


活动表action,里面有一条数据:


SELECT 
  *,action.`id` AS action_id
FROM
  `users` LEFT JOIN ACTION ON users.`id`=action.`id`
LIMIT 0, 1000 ;


能查到数据,尽管action 的数据为空:


SELECT 
  *,action.`id` AS action_id
FROM
  `users` LEFT JOIN ACTION ON users.`id`=action.`id` WHERE users.`id`=3
LIMIT 0, 1000 ;


加上用户表的id=3,action是没有改条数据的,也是能查询到数据:


如果把action.`id`=2作为条件,尽管action能查询到数据可是users主表没有数据,所以无法查询到数据:


SELECT 
  *,action.`id` AS action_id
FROM
  `users` LEFT JOIN ACTION ON users.`id`=action.`id` WHERE action.`id`=2
LIMIT 0, 1000 ;




综上:我们可以得到:

1、如果主表作为条件【或者没有条件】有数据并且被连接表不作为条件,不管被连接是否有数据都能查询到有数据

2、如果被连接表作为查询条件能查询该表数据(无法查询数据),如果主表无法查询到数据的话,则不会查询到数据。


话外:

如果是right  join(右(外)连接) 的话!结果相反。

(
SELECT 
  *,action.`id` AS action_id
FROM
  `users` RIGHT JOIN ACTION ON users.`id`=action.`id` 
LIMIT 0, 1000 ;)

如果是INNER JOIN(等值连接)的话!需要两个条件都成立才能查询到数据

SELECT 
  *,
  action.`id` AS action_id 
FROM
  `users` 
  INNER JOIN ACTION 
    ON users.`id` = action.`id` 
LIMIT 0, 1000 ;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值