【かーそる】

カーソル(DB) とは?

💡 DB検索結果を「1行ずつ順番に処理」するためのポインタ
📌 このページのポイント
DBカーソル ― 結果セットを1行ずつ処理 クエリ結果セット ID 商品名 価格 1 ノートPC ¥120,000 処理済 2 マウス ¥3,500 処理済 3 キーボード ¥8,000 現在行 4 モニター ¥45,000 未処理 5 ヘッドセット ¥15,000 未処理 カーソル操作 OPEN カーソル開始 FETCH 次の行を取得 → 1行ずつ処理 CLOSE カーソル終了 大量データを少しずつ メモリ効率よく処理 結果セットを「ポインタ」で1行ずつたどる仕組み
カーソル(DB)のイメージ
ひよこ ひよこ

カーソルって画面のカーソルと同じ?

ペンギン先生 ペンギン先生

語源は同じ「指し示すもの」だけど、DBのカーソルはSELECT結果の「今どの行を処理しているか」を指すポインタ。1万行の結果を一度に全部メモリに持たず、「FETCH(取得)→処理→次へ」と1行ずつ処理できる。

ひよこ ひよこ

なんでカーソルを使うの?

ペンギン先生 ペンギン先生

大量データを全件取得するとメモリが枯渇することがある。カーソルで1行ずつ取得して処理すればメモリを節約できる。ただし、カーソルは処理が遅いことが多いので、SQLのSET演算(WHERE・GROUP BYなど)で同等の処理ができるなら使わない方が速い。

ひよこ ひよこ

Pythonで使うことはある?

ペンギン先生 ペンギン先生

DBライブラリ(psycopg2・MySQLConnectorなど)が内部でカーソルオブジェクトを使う。「cursor = conn.cursor(); cursor.execute('SELECT ...'); cursor.fetchone()」という書き方がそれ。「fetchone()」で1行取得、「fetchall()」で全行取得する。

ひよこ ひよこ

カーソルを使わない方がいい場面ってあるの?

ペンギン先生 ペンギン先生

大量のデータを一度に処理する場合はカーソルよりSETベース(一括操作)の方が圧倒的に速いよ。たとえば「全ユーザーのステータスを更新する」処理をカーソルで1行ずつUPDATEすると何分もかかるのが、「UPDATE users SET status = 'active'」の1文で一瞬で終わる。実はSQL Serverの開発現場では「カーソルは最後の手段」と言われていて、9割のケースはJOINサブクエリで書き換えられるんだ。ただしストアドプロシージャで複雑な行ごとの処理が必要な場合は今でもカーソルの出番があるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
カーソル(DB)って出てきたら「SELECT結果を1行ずつ順番に処理するためのポインタ機能」と思えばOK!
📖 おまけ:英語の意味
「Cursor」 = 指し示すもの・矢印
💬 PCの画面カーソル(マウスポインタ)と同語源で「現在位置を指し示す」という意味。DBでは処理中の行位置を指す
← 用語集にもどる