- ベストアンサー
MySQLデータ検索クエリについて
- MySQLデータ検索クエリについての質問に対する回答をお願いします。
- 質問者は、SELECT @num := "abcdef" を実行した際の結果が想定と異なることに悩んでいます。
- 質問者は、FROMの書式を調べてみたが解決できず、進展がない状況です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
聞きたい事は SELECT @num := "abcdef" FROM @num WHERE @num LIKE '%a%'; これを実行すると ERROR 1064 (42000) ~省略~ at line 2 と、なりますが、(1)なぜエラーになるのか、(2)ここからどう直せば通るのか、の2点が分からない。 でいいのかな。 まず、これの2行目でエラーが起きるのは「@num」なるテーブルが無いのもさる事ながら、アットマークで始まるテーブル名が識別子として不正だからだ。で、次に SELECT @num := "abcdef" FROM (SELECT @num := "abcdef") WHERE @num LIKE '%a%'; これのエラーは2行目のインラインビューに名前がついていないのが原因。 SELECT @num := "abcdef" FROM (SELECT @num := "abcdef") as numtable WHERE @num LIKE '%a%'; これでOK。さて、この時に3行目の@num LIKE '%a%'がどういう意味になるかだけど、2行目の(SELECT @num := "abcdef")によってabcdefという文字列リテラルが設定された変数@numにaという文字が含まれるかという判定を行う。 @numがSQLの構文うんぬんとは少し離れた場所に居る「MYSQLの変数という概念」である事が分かれば、SQLとどう組み合わせれば良いかというのが分かるかと思う。 で、実行される順番というか@numに出し入れする順番は2行目、3行目、1行目になる。このSQLを見て欲しい。 SELECT @num := "hoge" from (select @num := "fuga") as numtable WHERE @num LIKE '%a%'; まず2行目のインラインビューが実行されて@numにfugaが設定される。次にそのインラインビューのうちどの行を出力するかの判定が3行目で行われ、その時の@numの値はfuga。するとインラインビューの1つ目が出力される事になったので出力しようとするとこのタイミングで1行目の@num := "hoge"が実行され、@numの値がhogeになった後で結果セットを返す事になる。なので、このSQLはhogeが返される。
お礼
御返答頂きありがとうございました。 大変分かりやすかったです。