6

フィールドA、B、Cを持つFISHというmysqlテーブルがあるとしましょう。

実行しSELECT * FROM FISHます。これにより、すべてのフィールドのビューが表示されます。では、Aが元のテーブルのキーだった場合、それはビューのキーでもありますか?つまり、テーブルFISH2があり、実行した場合

 SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A

関連するフィールドは引き続きキーになりますか?

それでは、この1つのステップをさらに進めましょう。私が走ったら

SELECT * FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D, (SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E WHERE D.DUCK = E.DUCK2

AとBが元のテーブルのキーであった場合、それらの連結もキーになりますか?

ありがとう :)

4

3 に答える 3

2

Aがキーインの場合fish、魚のみの投影では、Aがまだ一意である結果セットが生成されます。

テーブルfishと1:1の関係を持つテーブル(fish_typeなど)を結合すると、Aが一意である結果セットが生成されます。

魚からの1:MまたはM:Mの関係を持つ別のテーブル(fish_beitsなど)との結合では、「反対側」(などbait='Dynamite')にフィルター述語を指定しない限り、Aが一意である結果は生成されません。

SELECT * FROM (SELECT * FROM FISH) D, (SELECT * FROM FISH2) E WHERE D.A = E.A

...論理的には次のステートメントと同等であり、ほとんどのデータベース(MySQLを含む)が変換を実行します。

select *
  from fish
  join fish2 on(fish.a = fish2.a)

結果セットでAがまだ一意であるかどうかは、のキーfish2とそれらの関係によって異なります(上記を参照)。

連結は一意性を保持しません。次の場合を考えてみましょう。

concat("10", "10") => "1010"
concat("101", "0") => "1010"

したがって、最後のクエリ...

SELECT * 
  FROM (SELECT CONCAT(A,B) AS DUCK, C FROM FISH) D
      ,(SELECT CONCAT(A,B) AS DUCK2, C FROM FISH2) E 
 WHERE D.DUCK = E.DUCK2

...(必然的に)と同じ結果を生成しません

select * 
  from fish 
  join fish2 on(
       fish.a = fish2.a
   and fish.b = fish2.b
  )

衝突は実際の値に依存するので、私は必然的に書きました。しばらく前にバグを探しましたが、根本的な原因はまさにこれでした。バグが現れる前に、コードは数年間機能していました。

于 2011-03-20T21:10:50.930 に答える
0

「キー」が「一意」を意味する場合、はい、一意の値を超えるデカルト積のタプルは一意になります。(帰謬法によってそれを証明することができます。)

于 2011-03-20T15:59:27.407 に答える
0

ASステップ1では、ビューを、実行時に句内のすべてを含むサブクエリと考えてCREATE VIEWください。

たとえば、ビューvがとして作成されているSELECT a, b, c FROM t場合、実行すると...

SELECT * FROM v WHERE a = some_value

...概念的には...として扱われます

SELECT * FROM (SELECT a, b, c FROM t) WHERE a = some_value

適切なオプティマイザを備えたデータベースは、列aが結果に直接渡さtれ、サブクエリに移動することで(存在する場合は)インデックスを利用できることに気付くでしょう。

SELECT * FROM (SELECT a, b, c FROM t WHERE a = some_value)

これはすべて舞台裏で行われ、自分で行う必要のある最適化ではありません。明らかに、WHERE条項内のすべての条件に対してそれを行うことはできませんが、どこでできるかを理解することは、優れたオプティマイザーを作成する技術の一部です。

ステップ2の場合、連結されたキーは中間結果の一部になり、データベースがインデックス作成が必要であると判断したかどうかは、実装の詳細です。複製に関するfcheのコメントにも注意してください。

データベースにクエリプランの説明が含まれている場合は、データベースを実行して結果の解釈を学習することで、クエリの実行を高速化する理由と低速化する要因について多くの洞察を得ることができます。

于 2011-03-20T16:34:22.290 に答える