mysql - SQL问个基础例子,书上的,我怎么看都看不懂..谁帮我解释一下第2个为什么和第1个一样?
怪我咯
怪我咯 2017-04-17 14:44:54
0
5
648
SELECT
    id,
    name,
    cid
from
    shbooks
where
    cid=(
        SELECT
            cid 
        FROM
            shbooks
        where
            name= '光荣与梦想'
        );

上面这个我完全看得懂,返回<光荣与梦想>的cid,然后用这个值作为条件,匹配整个表的cid;


SELECT
    b1.id,
    b1.name,
    b1.cid
from
    shbooks b1,
    shbooks b2 
where
    b1.cid=b2.cid
and
    b2.name='光荣与梦想';

但是这个,条件是 b1.cid=b2.cid 的话,会返回整个表,为什么加上个 b2.name='光荣与梦想' 就能返回 和 光荣与梦想 相同cid 的别的书???


答案不在长,也不在语言是不是准确,只要让我能明白怎么个逻辑就行了..谢谢了!

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(5)
Peter_Zhu

原始

b1.cid b1.name
1     光荣与梦想
2     另一本书
1     梦想与光荣

條件b1.cid = b2.cid(從9個結果過濾得到5個結果)只要理解為什麼是9個結果,整個問題應該也沒有什麼疑問了。

b1.cid b1.name b2.cid b2.name
1     光荣与梦想 1    光荣与梦想
1     光荣与梦想 1    梦想与光荣
2     另一本书   2    另一本书
1     梦想与光荣 1    梦想与光荣
1     梦想与光荣 1    光荣与梦想

條件 b2.name='光榮與夢想'
就得到

b1.cid b1.name b2.cid b2.name
1     光荣与梦想 1    光荣与梦想
1     梦想与光荣 1    光荣与梦想

我就是提问的的人,这是我补充的!
我给大家解释解释到底是怎么回事,
其实逻辑就是自己把自己当俩表;
然后算自己的的笛卡尔集,
然后再用第二个条件筛选!
巴扎黑

你的第一種寫法如果存在多條cid是不是就出錯了?
你可以參考下面的寫法:

/*子查询*/
select id,name,cid 
  from shbooks 
where cid in (select cid from shbooks where name='');

--或者这种写法
select id,name,cid
  from shbooks outerquery
where cid exists  
  (select 1 from shbooks innerquery where outerquery.cid = innerquery.cid and innerquery.name='');
  

至於你的第二種寫法,你了解inner join嗎?你看看下面的寫法是不是更好懂?

select id,name,cid
  from shbooks main
  inner join (select cid from shbooks where name = '') child
  on main.cid = child.cid; 

select id,name,cid
  from shbooks main
  inner join shbooks child on main.cid = child.cid
  where child.name = ''; 

最後問問,你都是照書上的範例寫?如果是,我建議最好不要看那本書了!

左手右手慢动作

條件是兩個啊大兄弟,b2.name='光榮與夢想' 同時 b1.cid = b2.cid

迷茫

看成兩個不同的表就行,這是自聯接

迷茫

@碎鏡 他的是正解,先笛卡爾集,然後進行篩選。這是實現原理。不過一般這種語句SQL會自動最佳化。並不會真的先做出笛卡爾積然後再篩選。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板