Skip to content
nishi_74322014 edited this page Aug 19, 2026 · 2 revisions

SQL

概要

SQL のトピック。

移行メモ(元ページの状態): 元ページは見出しと「再帰クエリ」への
リンクのみのスタブ ページである。
移行に際して、ページの位置付け(SQL に関するトピックの入口)を保ったまま、
索引として機能する程度の補記を追加した。

詳細

再帰クエリ

再帰クエリ

, etc.

補足(SQL の分類): SQL は用途によって以下に分類される。
アプリケーション開発者が日常的に書くのは DML だが、
権限設計やマイグレーションでは DDL / DCL も扱う。

分類 正式名 主なステートメント
DML Data Manipulation Language SELECT / INSERT / UPDATE / DELETE / MERGE
DDL Data Definition Language CREATE / ALTER / DROP / TRUNCATE
DCL Data Control Language GRANT / REVOKE / DENY
TCL Transaction Control Language BEGIN TRAN / COMMIT / ROLLBACK / SAVE TRAN

なお、TRUNCATE TABLE は DDL に分類されるが、
SQL Server ではトランザクション内でロールバック可能である。

補足(方言): SQL は ISO/ANSI で標準化されているが、
実装ごとの差(方言)が大きい。
クロスDB対応を意識する場合に問題になりやすいのは以下。

観点 SQL Server Oracle PostgreSQL
件数制限 TOP n / OFFSET-FETCH ROWNUM / FETCH FIRST LIMIT / OFFSET
文字列連結 + / CONCAT || ||
空文字と NULL 区別する '' は NULL 区別する
パラメータ記法 @name :name $1 / @name(Npgsql)
識別子の引用 [name] "name" "name"
日付の現在値 GETDATE() / SYSDATETIME() SYSDATE now()

標準に寄せて書けば移植性は上がるが、
性能を出すには結局その DBMS 固有の書き方が要る、というのが実情である。

補足(アプリから SQL を書くときの原則):

  1. 必ずパラメータ化する。文字列連結は SQL インジェクションの原因になる
    ADO.NETSQLプロファイラ(SQLトレース)を参照)。
  2. SELECT * を使わない。列を明示すると、
    カバリング インデックスが効きやすくなり、スキーマ変更の影響も受けにくい
    SQL Server のインデックス)。
  3. 列に関数を掛けないWHERE YEAR(d) = 2026
    インデックスが使われない(SARGable でない)。
  4. 暗黙の型変換を避ける。パラメータの型を列に合わせる。

実行計画の読み方は実行プランのグラフィカル表示を参照。

参考

関連


Tags: 移行, データアクセス

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally