2017-12-19 6 views
1

誰もこのSQLクエリの仕組みを説明できますか?私はそれを理解しようとしていますが、このクエリの背後に論理を得ることはできません。より明確にするために変数を使用してデータベースのリストを示すこのSQLクエリを説明してください

select (@a) 
from (SELECT (@a :="") 
      ,(select (@a) 
       from information_schema.schemata 
       where (@a) in (@a := concat(@a, schema_name, '<br>')) 
       ) 
    ) a 
+2

を取得します。それはただのSQL –

+0

ええ、私はSQLインジェクションを学び、フローにインジェクションを含めようとしていました。 – Akash

+0

さて、結果は何ですか? –

答えて

5
SELECT 
    @a -- Final Result (3) 
     FROM 
     ( 
      SELECT (@a :="") -- Resetting the variable after each run, (1) 
      (
       SELECT @a -- Does really nothing. This can be anything 
        FROM information_schema.schemata 
         WHERE (@a) IN (@a := CONCAT(@a, schema_name, '<br>')) -- This will be executed for each row. But none of the rows will match. At the end, @a will have the desired output (2) 
      ) 
    ) a 

SELECT * from information_schema.schemataを実行し、出力

(1)、(2)を参照してください、私たちはクエリを分割した場合(3)これ、実行優先順位

を示し、:EDIT

SET @a = ""; SELECT 1 FROM information_schema.schemata WHERE (@a) IN (@a := CONCAT(@a, schema_name, '<br>')); SELECT @a; 

以下に示すように起こることです質問:
行のいずれも一致しない場合、変数 "a"は望ましい出力をどのようにしますか?

は、私たちはmytableは、10件のレコードを持っており、someconditionは、すべてのインデックスを使用していない場合は、someconditionが10回実行されます小さなクエリselect * from mytable where (somecondition) を見てみましょう。各実行に基づいて、結果がtrue/1の場合、その行が表示されます。これは、SQL selectステートメントの単純な理論です。

今、あなたは(@a) IN (@a := CONCAT(@a, schema_name, '<br>'))someconditionを置き換えることが、あなたはそれがSQLインジェクションではありません答え

+0

ありがとう、これは私が必要なものです。あなたはとてもうまく説明しました。 – Akash

+1

私は助けてうれしいです! – Akhil

+0

行のいずれも一致しない場合、変数 "a"はどのように出力されるのか説明できますか?また、クエリの実行優先度はどのように決定しますか? – Akash

関連する問題