mysql - SQL问个基础例子,书上的,我怎么看都看不懂..谁帮我解释一下第2个为什么和第1个一样?
怪我咯
怪我咯 2017-04-17 14:44:54
0
5
664
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 栄光と夢
質問したのは私です。これは私が追加したものです。
何が起こっているのか説明しましょう
実際、その論理は、自分自身を後から推測する人間として扱うことです。
次に、独自のデカルト集合を計算します。
次に、2 番目の条件を使用してフィルタリングします。
いいねを押す +0
巴扎黑

最初の方法は、cid が複数ある場合にエラーを記述する方法ですか?
次の記述方法を参照できます。

/*サブクエリ*/
ID、名前、CIDを選択してください
  教科書から
where cid in (shbooks where name='') から cid を選択します。

--またはこの書き方
ID、名前、CIDを選択してください
  shbooks のアウタークエリより
CID が存在する場所
  (outerquery.cid = innerquery.cid および innerquery.name='' である shbooks innerquery から 1 を選択します);
  

2 番目の書き方についてですが、内部結合について理解していますか?以下の書き方の方が分かりやすいでしょうか?

ID、名前、CID を選択
  shbooksメインより
  内部結合 (名前 = '' の shbooks から cid を選択) 子
  main.cid = child.cid; で

ID、名前、CIDを選択してください
  shbooksメインより
  main.cid の内部結合 shbooks child = child.cid
  ここで、child.name = '';

最後に、この本の例に従っていますか?もしそうなら、その本は読まないことをお勧めします。

いいねを押す +0
左手右手慢动作

条件は 2 つです、兄貴、b2.name='栄光と夢' および b1.cid = b2.cid

いいねを押す +0
迷茫

これを 2 つの異なるテーブルと考えてください。これは自己結合です。

いいねを押す +0
迷茫

@broken Mirror これは正しい解決策です。最初にデカルト集合、次にフィルターです。これが実装原則です。ただし、通常、この種のステートメント SQL は自動的に最適化されます。実際には、最初にデカルト積を実行してからフィルターをかけるわけではありません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート