子查询和联合查询

1.子查询和联合查询的区别有几点?
2.子查询改写成联合查询后的SQL语句是否错误?
3.在实际的操作过程中,我们如何写健壮的SQL语句?

1.两者的区别主要是在效率上,INNER JOIN通常效率比IN高许多
一般应当避免用IN
当两张表的关系是1:1的时候,可以直接将IN逻辑改写成为INNER JOIN
当两张表的关系是1:N的时候,直接改写为INNER JOIN就会导致迪卡尔积
从而得到重复记录
这时候应当采用以下形式
Sql代码
SELECT    
    雇员.雇员ID,   
    雇员.姓氏,   
    雇员.名字,   
    雇员.邮政编码,   
    雇员.城市,   
    雇员.地址,   
    雇员.家庭电话,   
    X.CNT   
FROM 雇员    
INNER JOIN (   
    SELECT    
        订单.雇员ID,   
        COUNT(*) AS CNT   
    FROM 订单   
    GROUP BY 订单.雇员ID    
    HAVING COUNT(*) > 100    
) X ON  
    雇员.雇员ID = X.雇员ID  

当然,当订单表中数据很多的时候,上面的这个SQL语句可能仍然有效率问题
最简单的解决办法是在雇员加一个“订单数”的字段
每次订单插入/删除的时候修改这个字段即可

3.在实际写联合查询语句的时候,为了写出正确的SQL语句
最要紧的就是理清表与表之间的关系,
在处理1:N,N:M关系的时候,注意避免迪卡尔积

自己的一些语句的区别:
--笛卡尔积
1,
select * from doc_CollectDoc d ,doc_DocInceptPerson p
where  d.docId = p.doc_SendDoc_id
and p.department = '1'
2,
select * from doc_CollectDoc d INNER JOIN   (
  select DISTINCT p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
)   x on
d.docId = x.doc_SendDoc_id
3,
select * from doc_CollectDoc d where d.docId in (
  select  p.doc_SendDoc_id from doc_DocInceptPerson p where p.department = '1'
)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值