8

@Cesarさんのリクエストにより更新しています。あなたが何を望んでいるのか理解できれば幸いです。そうでない場合は、元に戻してください。カッスノイ。

SQL次のようなクエリを作成した場合:各リストで同じ番号を持つ要素のペアのみに一致SELECT * FROM TABLE_NAME WHERE b IN (2, 7) AND c IN (3, 9)すると仮定できますか?MySQL

つまり、、、(2, 3)... (7, 9)

たとえば、次のようなテーブルがあるとします。

+------------+------------+----------+
 | | PK | b | c |
 +------------+------------+----------+
 | | 1 | 2 | 3 |
 +------------+------------+----------+
 | | 2 | 5 | 4 |
 +------------+------------+----------+
 | | 3 | 7 | 9 |
 +------------+------------+----------+
 | | 4 | 7 | 4 |
 +------------+------------+----------+
 | | 5 | 2 | 9 |
 +------------+------------+----------+

返される行はand (and not )のみであると想定するのは正しいですか?135

4

5 に答える 5

23
SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4)

このクエリは行を返します。ここで、b5または7、ANDc4です。

「ペアで評価する」とはどういう意味ですか?

アップデート:

サンプルにもう 1 行追加します。

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     3    |     7    |     9    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
 |     5    |     2    |     9    |
 +----------+----------+----------+

セット全体を一致させたい場合は、次の構文を使用できます。

SELECT  *
FROM    table_name
WHERE   (b, c) IN ((2, 3), (7, 9))

bこれは、「 is2cis が3同時に、またはbis7сisが同時にあるすべての行を返す」ことを意味します9

上記の例では、このクエリは行を返し13

しかし、このクエリを逆に書き直すと、次のようになります。

SELECT  *
FROM    table_name
WHERE   b IN (2, 7)
        AND c IN (3, 9)

、これは「がまたはのいずれかであり、ANDがまたはのbいずれかであるすべての行を返す」ことを意味します。27c39

行は 2 番目のクエリの条件を満たしますが、最初のクエリの条件を満たさないため、これは行13およびを返します。55

于 2009-07-28T14:05:31.150 に答える
5

行 2 と 4 の戻り値は正しいですが、(4,4) を選択すると、冗長であるため、少し混乱する可能性があります。AND は、行が両方の条件を満たす必要があることを意味します。クエリに が含まれていた場合、WHERE b IN(5,7) AND c IN(4,9)行 2、3、および 4 が返されます。

ペアで考えれば、すべての組み合わせが必要です。たとえば、b IN(5,7) AND c IN(4,9)(5,4)、(5,9)、(7,4)、および (7,9) が、(5,4) と (7,9) だけでなく、機能する可能な組み合わせとして生成されます。

于 2009-07-28T14:03:53.523 に答える
5

各条件を順番に評価できます。これにより、ここで何が起こっているかをよりよく理解できる場合があります。クエリでは、b が 5 または 7 で c が 4 のすべての値を選択する必要があると記載されているため、最初の条件 ( b IN (5,7))を使用してテーブルを縮小しましょう。

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    | < No match
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < Match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

次に、次の条件を評価しましょう。行が選択されるためには、両方が真でなければなりません ( c IN (4,4)、これは基本的に と同じですc = 4)。

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < No match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

他のすべては有効です:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
于 2009-07-28T14:05:37.283 に答える
1

あなたの例はあなたの質問を正確に示しているわけではありませんが、複数の IN 句は互いに関連していません。これらは、他の WHERE 句と同様に順番に評価されます

したがって、次のクエリ

SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8)

次のいずれかに一致します。

紀元前
----
5 4
5 8
7 4
7 8

INor-separated 比較の省略形と見なすことができます。これは、前のクエリを次のように書くこともできることを意味します (仕組みは少し異なりますが、概念は同じです)。

SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8)

したがって、あなたの例では、はい、返される行は 2 と 4 だけです。

于 2009-07-28T14:10:29.850 に答える
1

はい、私はあなたが正しいと信じています。

事実上、'IN' は (b = 5 OR b = 7) の省略形と見なすことができます。これは「ボンネットの下」でどのように機能するかではありませんが、簡単に考えることができます。

大きなテーブルの場合、複数の 'IN' 句はパフォーマンスの問題を引き起こします。

編集:

上記のポスターは正しいです。 c IN (4, 4) は無意味です。「AND c = 4」と同じように簡単に言うことができます。

句を論理的に同等のものに変換すると、その理由がわかります。

SELECT * FROM テーブル WHERE (b = 5 または b = 7) AND (c = 4 または c = 4)

于 2009-07-28T14:04:28.127 に答える