2

= を入力すると正しい結果が得られ、!= を入力すると、別のリストではなく完全なリストが表示されるのはなぜですか。

SELECT     * 
FROM      library, crime_data 
WHERE     crime_data.id=$oreo 
AND       crime_data.isbn != library.isbn 
AND       crime_data.visibility='0' 
GROUP BY  library.isbn

私は何を間違っていますか?

4

2 に答える 2

8

集合論の観点から、SQL が何をしているのかを概念的に考える必要があります。2 つのテーブルを結合する場合、概念はデカルト結合です。テーブル A の各行は、テーブル B の各行と結合されます。したがって、10 行のテーブルと 20 行のテーブルがあり、それらを結合すると、次の結合が得られます。 200 行。

「=」を使用して選択すると、値が等しい、通常は少ない行のみが選択されます。「!=」を使用すると、すべての OTHER 行が選択されます。


「どうあるべきか」というコメントに答えるように編集します。

Select *
From library
Where Not Exists 
    (
        Select 1 
        From  crime_data 
        Where crime_data.isbn = library.isbn 
    )
于 2013-09-30T11:16:21.230 に答える
2

方法!==関連付けは、簡単な例で簡単に確認できます。

SELECT
    1=1,
    1=2,
    1=NULL,
    NULL=NULL,

    1<>1,
    1<>2,
    1<>NULL,
    NULL<>NULL

(MySQL固有のもので<>はなく標準演算子を使用していますが、同等です)。!=

+-----+-----+--------+-----------+------+------+---------+------------+
| 1=1 | 1=2 | 1=NULL | NULL=NULL | 1<>1 | 1<>2 | 1<>NULL | NULL<>NULL |
+-----+-----+--------+-----------+------+------+---------+------------+
|   1 |   0 |   NULL |      NULL |    0 |    1 |    NULL |       NULL |
+-----+-----+--------+-----------+------+------+---------+------------+

したがって、行の合計を含まない行の和crime_data.isbn = library.isbn集合crime_data.isbn != library.isbn。少なくとも 1 つのNULL演算子があるすべての行を除外します。

于 2013-09-30T11:30:02.987 に答える