人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLで、 select ?; は、どういう意味ですか?
sqliteで実行した所、エラーが帰ってこなかったので 不思議です。

●質問者: suzume_oyado
●カテゴリ:コンピュータ インターネット
✍キーワード:SELECT SQL SQLite エラー 不思議
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● JULY
●35ポイント

SQLite が認識する SQL - Third impact

sqlite で「?」は、バインド変数を使う時のプレースホルダーを示すもので、sqlite3_bind などを使って、プログラムから sqlite を使う場合に、この「?」の位置に入るものを、後から指定して結果を得る、という使い方をします。この仕組は SQL インジェクション対策として取り上げられる事が多いです。

インジェクション系攻撃への防御の鉄則 - 狙われるWebアプリケーション:ITpro

で、おそらく、「select ?;」は、「select 何か」を意味していて、結果的にその「何か」が指定されていない、と言いう状態で、構文的にはエラーではない、というのが sqlite の解釈なのだと思います。

ちなみに、MySQL、PostgreSQL、Oracle では、エラーになりました。Oracle の場合、そもそも「FROM 句の無い SELECT」が許容されない(例えば、MySQL とかだと、select 1; は許容される)ので、「?」以前の問題になります。

◎質問者からの返答

おぉ。なるほど。そんな機能があるのですね。

ありがとうございました!


2 ● chuken_kenkou
●35ポイント

?パラメタは、動的SQL(実行時に文字列でSQLを組み立てて、PREPARE + EXECUTE)する場合に、可変のパラメタとして指定します。

指定できる箇所は、検索条件の式の値部分、挿入値、更新値などです。

SELECT * FROM tbl WHERE c1=?
UPDATE tbl SET c2=?,c3=? WHERE c1 BETWEEN ? AND ?
INSERT INTO tbl(c1,c2,c3) VALUES(?,?,?)
DELETE FROM tbl WHERE c1 IN(?,?,?)

PREPAREは、SQLの解析を行い、アクセス計画の作成といった処理が行われるため、処理時間が掛かる部分です。?パラメタを使えば、一度、PREPAREすれば、?パラメタに設定する値を変えながらEXECUTEを繰り返し行えます。

RDBMSによっては、PREPAREした結果をプールしておき、異なるセッション間でも「同じSQL」であれば、PREPAREの結果を活用しオーバヘッド抑止するといった機能を実装していたりします。

また、?パラメタの部分は、PREPAREした後は、EXECUTEで値しか入れられないので、SQLインジェクション対策でも利用されます。


一方、表名、列名、条件式そのものを変える場合は、?パラメタは使えません。

なお、質問にある

select ?; 

ですが、これだけ見ると「何のためにこんなことをするのか?」と思えるかも知れませんが、

INSERT INTO tbl1(c1,c2,c3) SELECT ?,c2,c3 FROM tbl2 

といった使い方は、普通に考えられるでしょう。

◎質問者からの返答

処理を軽くするためのモノなのですね。

ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ