MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/02/22
Microsoft Data Engine FunClub
Since 2000.01.30

Transact-SQL言語
プログラミング基本情報



◆識別子
文書[タイトル]抜粋・要約・備考
識別子の使用 識別子のクラス
区切られた識別子
標準識別子に関する規則
識別子の付け方のルールが明記されている
区切られた識別子 標準識別子の形式に関する規則に従わない識別子は必ず区切り記号で区切る必要があります。
引用符で囲まれた識別子 引用符で囲まれた識別子の設定をオフにすると、二重引用符は単一引用符と同様に、文字列の区切りを示します。引用符で囲まれた識別子の設定をオンにすると、二重引用符は列名などの識別子の区切りを示します。
オブジェクト名としての識別子の使用 オブジェクトの名前は次の 4 つの識別子から成ります。以下の形式で記述されるサーバー名、データベース名、所有者名、オブジェクト名です。
オブジェクトの可視性と修飾に関する規則 オブジェクトを作成するとき名前のいずれかの部分を指定しなかった場合、MicrosoftR SQL Server は次の既定の名前を使用します。
辞書順、大文字小文字を区別する 大文字小文字を区別する並べ替え順をインストールすると、オブジェクト名を含むすべてのエントリで大文字と小文字が区別されます。
bcp による区切り識別子の使用 テーブル名のスペースなどの埋め込まれた特殊文字を含むオブジェクト文字を参照する場合には、オブジェクト名は二重引用符 (" ") または角かっこ ([ ]) で区切り、bcp ユーティリティを使用する場合には -q パラメータを指定する必要があります。
Transact-SQL の構文要素 識別子は、 テーブル、ビュー、列、データベース、サーバーなどのオブジェクトの名前です。
SET QUOTED_IDENTIFIER 識別子を区切る引用符とリテラル文字列に関して、MicrosoftR SQL Server が SQL-92 の規則に従うことを指定します
最大容量仕様 識別子長 (文字数)は、最大128文字
sp_validname 有効な MicrosoftR SQL Server 識別子名を調べます。


◆NULL値
文書[タイトル]抜粋・要約・備考
NULL 値 NULL 値は、認識できない値を示します。NULL 値は、空値または値 0 とは異なります。
NULL 値の許容 列が NULL 値を許容するかどうかで、テーブルの行のその列に NULL 値を格納できるかどうかが決まります。
NULL 比較検索条件 NULL値は、その列のデータ値は未定であるか、利用できないということを示しています
ANSI Null ANSI_Nulls オプションは、データベースが NULL 値を許容するかどうかについての既定の設定と、NULL 値との比較の両方を制御します。
データの基本要素へのアクセスと変更 NULL 値は認識できない値です。後で情報を入力することを示すために NULL 値を使用することもできます
列プロパティの変更 列が NULL 値を許容するかどうかを定義できます
NULL 値と結合 結合されるテーブルの列に NULL 値がある場合、それらの NULL 値が互いに一致することはありません。
GROUP BY と Null 値 グループ化に使われる列に NULL 値が 1 つ含まれる場合、結果ではその行が 1 つのグループになります。グループ化に使われる列に複数の NULL 値が含まれる場合は、それらの NULL 値が 1 つのグループになります
Null 値と集計関数 集計関数が機能している間、列内の NULL 値は無視されます
データ型とテーブル構造 列では NULL 値が受け入れられる場合も、拒否される場合もあります。NULL はデータベース内の特殊な値であり、未知の値という概念を表しています。NULL は空白文字や 0 と同じではありません
正規化 テーブルに NULL 値を許す列を作成しない。
テーブルに NULL 値を許す列を作成できます。NULL 値は値がないことを意味します。単独のケースで NULL 値が便利なこともあります。しかし、NULL 値を許す列は、特殊な処理が必要でデータ操作が複雑になるため、極力使用しないようにするのが最善です。
暗黙または明示的な NULL 値 明示的な NULL 値を列に挿入したり、DEFAULT キーワードを使用して列に値を割り当てると、トリガは正常に起動されます
IS [NOT] NULL 指定された式が NULL かどうかを調べます。
NULLIF 指定された 2 つの式が等価な場合に NULL 値を返します。
SET ANSI_NULLS = (等号) 比較演算子と <> (不等号) 比較演算子を NULL 値に対して使用した場合の SQL-92 準拠動作を指定します
SET ANSI_NULL_DFLT_OFF {ON | OFF} データベースに対して ANSI null default オプションが false に設定されているときに、セッションの動作を変更して、新しい列で NULL 値を許容するかどうかの既定の設定を変更します。
SET CONCAT_NULL_YIELDS_NULL 連結の結果が NULL として取り扱われるのか、空文字列として取り扱われるのかを制御します。
GETANSINULL このセッションで使用するデータベースで NULL 値を許容するかどうかの既定の設定を返します。


◆CHECK制約
文書[タイトル]抜粋・要約・備考
制約 CHECK 制約は、列に入れることができる値を制限することにより、ドメイン整合性を設定します。 CHECK 制約は TRUE または FALSE として評価される論理検索条件を指定します。
CHECK 制約 CHECK 制約は、列に格納できる値を制限することによってドメイン整合性を設定します。
CHECK 制約はほかの列のデータに基づかない論理式から有効な値を判断します。
CHECK 制約の作成と変更 CHECK 制約は次のとおり作成、追加、変更、または削除できます。
テーブルを作成するとき CHECK 制約を作成するには
既存のテーブルに CHECK 制約を作成するには
CHECK 制約を作成するとき既存のデータをチェックしないようにするには
などのリンクがあります。
データの整合性 ドメイン整合性は、データ型によって値の型を、CHECK 制約とルールによって値の形式を、FOREIGN KEY 制約、CHECK 制約、DEFAULT 定義、NOT NULL 定義、およびルールによって値の範囲を制限することによって保つことができます。
Oracle から SQL Server への制約の移行 1 つのテーブルに対して複数の CHECK 制約を定義できます。
1 つの CREATE TABLE ステートメントで列ごとに 1 つしか列レベルの CHECK 制約を定義できません。
分割されたデータが入ったビューの使用 分割されたビューを使用すると、大きなテーブルに入ったデータをサブテーブルに分割できます。各サブテーブルのデータ範囲は、分割する列に対して指定する CHECK 制約の中で定義します。
CHECK_CONSTRAINTS 現在のデータベース内の現在のユーザーによって所有される CHECK 制約ごとに 1 行のデータを保持します。
CREATE TABLE CREATE TABLEの使い方
ALTER TABLE ALTER TABLEの使い方


◆DEFAULT定義
文書[タイトル]抜粋・要約・備考
デフォルト CREATE TABLE で DEFAULT キーワードを使用してデフォルト定義を作成し、定数式を列のデフォルトとして割り当てます。
DEFAULT 定義の作成と変更 DEFAULT 定義は次のとおり作成、追加、変更、または削除できます。
各作成方法へのリンクがあります。
DEFAULT 定義 列が NULL 値を許容する場合は、その行に NULL 値をロードできます。しかし、NULL 値を許容する列は望ましくないことがあるので、必要に応じてその列に DEFAULT 定義を指定してください。
SUSER_SNAME ログイン名の取得
ユーザーのセキュリティ識別番号 (SID) からログイン識別名を返します。
SUSER_SID ユーザー ログイン名のセキュリティ識別番号 (SID) を返します。
SYSTEM_USER ログイン名の取得
現在のシステム ユーザー名に対して既定値が指定されていない場合、システム提供の値をテーブルに挿入します。
USER_NAME ユーザ名の取得
指定された識別番号からユーザー データベースにおけるユーザー名を返します。
CURRENT_USER 現在のユーザーを返します。この関数を実行すると、USER_NAME() と同じ実行結果が得られます。
SESSION_USER テーブルに既定値が設定されていない場合に、システムが提供する現在のセッションのユーザー名の値をテーブルに挿入できるようにするニラディック関数です。また、このユーザー名を、クエリ、エラー メッセージなどで使用できるようにします。
USER 既定値が指定されていない場合、現在のユーザーのデータベース ユーザー名をテーブルに追加できるように、システム定義の値を提供します。
USER_ID データベースにおけるユーザーの識別番号を返します。
HOST_NAME ワークステーションの名前を返します。
HOST_ID ワークステーションの ID 番号を返します。
APP_NAME 現在のセッションがアプリケーションによって設定されている場合、そのアプリケーションの名前を返します。
NEWID uniqueidentifier 型の一意な値を作成します。
GETDATE 現在のシステム上の日付と時刻を、datetime 値の MicrosoftR SQL Server 標準内部形式で返します


◆主キー
文書[タイトル]抜粋・要約・備考
主キー制約 テーブルには通常、テーブルの各行を一意に識別する値が入った列または列の組み合わせがあります。この列をテーブルの主キー (PK)と呼び、この列はテーブルの実体の整合性を設定します。
PRIMARY KEY 制約の作成と変更 PRIMARY KEY 制約は次のとおり作成、追加、変更、または削除できます。
作成方法に関するリンクがあります。
制約 主キーも一意性を設定しますが、主キーは NULL 値を許容しません。
Oracle から SQL Server への制約の移行 PRIMARY KEY 制約または UNIQUE 制約が定義されている場合に一意なインデックスを自動的に作成することによって、一意性が保証されます。さらに、主キーの列は自動的に NOT NULL として定義されます。主キーは 1 つのテーブルに 1 つしか認められません
データの整合性 実体の整合性は、行を特定のテーブルの一意な実体として定義します。実体の整合性は、テーブルの識別子列または主キーの整合性を、インデックス、UNIQUE 制約、PRIMARY KEY 制約、または IDENTITY プロパティによって設定します
テーブルの表示 外部キー列が主キーに関係付けられている場合は、データベース ダイアグラムの中で、主キー列の行セレクタに主キーを表す記号が付いています。
正規化 データベースの設計理論の基本規則は、各テーブルに一意な行識別子、つまり 1 つのレコードをテーブル内のほかのどのレコードからも区別できる 1 つの列または列のセットを追加することです。
分割 正規化はデータベースの標準的処理です。1 つのテーブルにある重複列を削除し、2 番目のテーブルに格納します。2 番目のテーブルは、主キーと外部キーの関係により、最初のテーブルにリンクされています。
クラスタ化インデックスの使用 PRIMARY KEY 制約を作成すると、テーブルにまだクラスタ化インデックスがなく、PRIMARY KEY 制約の作成時に非クラスタ化インデックスを指定しなかった場合には、自動的にクラスタ化インデックスが作成されます。
sp_pkeys 現在の環境における単一のテーブルに対する主キーの情報を返します。


◆外部キー
文書[タイトル]抜粋・要約・備考
外部キー制約 外部キー (FK)は、2 つのテーブルのデータ間のリンクを設定するための単一の列または列の組み合わせです。2 つのテーブル間のリンクを設定するには、一方のテーブルの主キー値を格納する列を他方のテーブルに追加します。追加した列はそのテーブル内の外部キーになります。
FOREIGN KEY 制約の作成と変更 FOREIGN KEY 制約は次のとおり作成、追加、変更、または削除できます。
テーブルを作成するとき FOREIGN KEY 制約を作成するには?
既存のテーブルに FOREIGN KEY 制約を作成するには?
FOREIGN KEY 制約を作成するとき既存のデータをチェックしないようにするには?
FOREIGN KEY 制約を変更するには?
INSERT ステートメントと UPDATE ステートメントで FOREIGN KEY 制約を無効化するには?
などの方法。
制約 FOREIGN KEY 制約は、テーブル間の関係を示します。 1 つのテーブル内の外部キーは、別のテーブル内の候補キーを指しています。
FOREIGN KEY 制約を変更する方法 FOREIGN KEY 制約を変更するには、サーバー グループを展開し、サーバーを展開します。
外部キー列のデータ型とサイズは、主キー列のデータ型とサイズと一致している必要があります。
データベース ダイアグラムを使用して FOREIGN KEY 制約を作成する方法 データベース ダイアグラムを使用して FOREIGN KEY 制約を作成するには
データの整合性 参照整合性は、レコードが入力または削除されたとき、定義されたテーブル間の関係を維持します。
参照整合性は、外部キーと主キーの関係、または外部キーと一意なキーの関係に基づいています。参照整合性によって、テーブル間でのキー値の一貫性が維持されます。
テーブルリレーションシップ Access の連鎖更新と連鎖削除は SQL Server では使用できません。
結合の基礎 テーブルごとに結合に使用する列を指定します。一般的な結合条件では、1 つのテーブルから外部キーを指定し、ほかのテーブルでそれに対応したキーを指定します。
sp_fkeys 現在の環境での、論理外部キーを返します。このプロシージャは、無効化されている外部キーも含めて、外部キーのリレーションシップを示します。
sp_foreignkeys リンク サーバー上にあるテーブルの主キーを参照する外部キーを返します。


◆インデックス
文書[タイトル]抜粋・要約・備考
インデックス データベースのインデックスは、本の索引に似ています。本の索引を使用すると、全体を読まなくても必要な情報をすばやく探し出すことができます。データベースの場合も、テーブル全体を調べなくても、インデックスを使用すればデータベース プログラムでテーブル内のデータを検索することができます。
テーブル インデックス SQLServerインデックスには、次の 2 種類があります。
クラスタ化 と 非クラスタ化 です
インデックスの設計 インデックスを設計するときのガイドライン
インデックスの特性
クラスタ化インデックスの使用 クラスタ化インデックスは、テーブル内でのデータの格納順序を決定します。クラスタ化インデックスは、姓を使用してエントリを配列した電話帳のようなものです。クラスタ化インデックスはテーブル内のデータの物理的格納順序を決定するので、1 つのテーブルに 1 つしかクラスタ化インデックスを作成できません。
非クラスタ化インデックスの使用 非クラスタ化インデックスは、教科書の索引に似ています。データとインデックスがそれぞれ別の場所に格納され、データの格納場所を示すポインタが付いています。インデックス内のアイテムはインデックス キー値の順に格納されていますが、テーブル内の情報はそれとは別の順序で格納されています。
一意なインデックスの使用 一意なインデックスを作成した列に重複した値が出現することはありません。複数列に一意なインデックスを指定すると、その列内の値の組み合わせが一意になります。たとえば、last_name、first_name、および middle_initial の各列の組み合わせに一意なインデックス full_name を作成した場合は、テーブル内で複数の人が同じ姓名を持っていることはありません
FILL FACTOR インデックスを作成するとき、FILL FACTOR を指定することによって、空き領域を余分に残し、インデックスの各リーフ レベルのページ上に何パーセントかの空き領域を予約することができます。こうすると、テーブルのデータの記憶領域が将来拡張した場合に対応でき、ページ分割が起こる可能性が減少します。
fill factor オプション 【操作方法へのリンク】
fill factor オプションは、SQLServerが既存のデータを使用して新しいインデックスを作成するときに各ページを埋める方法を指定します。各ページを埋めるときは、ページの分割に時間がかかるため、fill factor で指定する割合はパフォーマンスに影響します。
インデックスの作成 【操作方法へのリンク】
統計情報 【操作方法へのリンク】
インデックスの再構築 【操作方法へのリンク】
インデックスの名前の変更 【操作方法へのリンク】
インデックスの表示 【操作方法へのリンク】
インデックスの削除 【操作方法へのリンク】
テーブルとインデックスのアーキテクチャ [アーキテクチャ]
データベース内のオブジェクトは、8KB から構成されるページの集合として格納されます。ここでは、テーブルとインデックス用のページの編成方法について説明します。
分布統計 [アーキテクチャ]
すべてのインデックスに、インデックス内のキー値の選択度と分布を記述した分布統計があります。
ヒープ構造 [アーキテクチャ]
ヒープは sysindexes の中に indid=0 という 1 行を持っています。sysindexes.FirstIAM 列は、そのヒープへ割り当てられた領域を管理する IAM ページ チェインの最初の IAM ページを指しています。SQL Serverは IAM ページを使用してヒープ内を移動します。
クラスタ化インデックス [アーキテクチャ]
Microsoft SQL Server のインデックスは B ツリーとして編成されています。
非クラスタ化インデックス [アーキテクチャ]
非クラスタ化インデックスもクラスタ化インデックスと同じ B ツリー構造になっていますが、次に示す 2 つの大きな相違点があります。
text、ntext、および image の各データ [アーキテクチャ]
text、ntext、および image の各値は、データ行の一部としてではなく、別な独自のページ集合に格納されます。データ行には、text、ntext、または image の値ごとに 1 つずつ、16 バイトから構成されるポインタだけが格納されます。
ファイル グループへのインデックスの格納 既定では、インデックスが作成されるベース テーブルと同じファイル グループにインデックスも作成されます。ただし、非クラスタ化インデックスは、ベース テーブルとは異なるファイル グループに作成できます。異なるファイル グループにインデックスを作成した場合、そのファイル グループが独自のコントローラを持つ異なる物理ドライブを使用していると、パフォーマンスの向上を実感できます。
インデックス チューニングの推奨設定 【操作方法へのリンク】
インデックスは、データベース スキーマまたはアプリケーション設計に影響を与えずに削除、追加、および変更できます。優れたパフォーマンスを達成するには、有効なインデックスの設計が重要です。
Access から SQL Server へのインデックスの移行 非クラスタ化インデックス
クラスタ化インデックス
CREATE INDEX 指定されたテーブルにインデックスを作成します。
DROP INDEX 1 つ以上のインデックスを現在のデータベースから削除します。
DBCC DBREINDEX 指定されたデータベース内のテーブルの 1 つ以上のインデックスを再構築します。
DBCC SHOWCONTIG 指定されたテーブルのデータとインデックスの断片化に関する情報を表示します。
INDEXPROPERTY 指定されたテーブル識別番号、インデックス名、およびプロパティ名のインデックス プロパティ値を返します。
INDEX_COL インデックス付きの列名を返します。
sp_helpindex テーブルのインデックスに関する情報をレポートします。
sp_statistics 指定されたテーブル上のすべてのインデックスの一覧を返します。


◆一時テーブル
文書[タイトル]抜粋・要約・備考
識別子の使用 # で始まる識別子は一時テーブルまたは一時プロシージャを表します。2 つのシャープ記号 (##) で始まる識別子は、グローバルな一時オブジェクトを表します。
Oracle から SQL Server への一時テーブルの移行 3種類あるテーブルの違いの解説
#table_nameの意味
##table_nameの意味
tempdb..table_nameの意味
データ型とテーブル構造 一時テーブルは、名前が番号記号 (#) で始まるテーブルです。ユーザーが接続を切断したときに削除されない一時テーブルは、SQL Server によって自動的に削除されます。一時テーブルはカレント データベース内には格納されず、システム データベース tempdb に格納されます。一時テーブルには、次の 2 種類があります。
テーブルの作成と変更 一時テーブルは tempdb に格納され、使用されなくなると自動的に削除される点を除いてパーマネント テーブルと同じです。
一時テーブルには、ローカル一時テーブルとグローバル一時テーブルの 2 種類があります
ストアド プロシージャのプログラミング ストアド プロシージャ内でプライベートな一時テーブルを作成した場合、この一時テーブルはストアド プロシージャのためにのみ存在し、ストアド プロシージャを終了すると消滅します
Transact-SQL に関するヒント 一時テーブルの作成と保守はオーバーヘッドを必要とします。可能であれば、操作を単一の複雑な Transact-SQL ステートメントをコード化することを考慮してください。
トリガやストアド プロシージャ内で一時テーブルを使用すると、トリガやストアド プロシージャを使用するたびにそれらを再コンパイルしなくてはならなくなることがあります。
SELECT SELECT文の書式
テーブルを作成するデータベースで select into/bulkcopy がオンになっていない場合は、SELECT INTO を使ってパーマネント テーブルを作成することができません。ローカルまたはグローバルな一時テーブルのみが作成できます。
SELECT のサンプル コード D.SELECT INTO を使用してテーブルを作成する
最初の例では、tempdb 内に #coffeetabletitles という一時テーブルを作成しています
UNION をほかの Transact-SQL ステートメントと共に使う select into/bulkcopy オプションが設定されていない場合は、SELECT INTO は一時テーブルの作成にしか使用できません
OBJECT_ID 一時テーブル名を指定する場合、一時テーブル名の前にデータベース名を指定する必要があります。たとえば、次のように指定します。
SELECT OBJECT_ID('tempdb..#mytemptable')
システム データベースとデータ tempdb はグローバル リソースです。システムに接続したすべてのユーザー用の一時テーブルと一時ストアド プロシージャは、ここに格納されます
ストアド プロシージャの自動実行 ストアド プロシージャの自動実行は、グローバルな一時テーブルの作成など、tempdb のシステム タスクまたは保守タスクを行う場合にも使用できます。
CREATE TABLE CREATE TABLE文の使い方
孤立セッション 多くの場合は、オープン状態のセッションが、サーバー リソースを消費していることや、オープンされているカーソル、一時テーブル、ロックを保有している可能性があることの方が問題になります


サポート技術に戻る

Homeに戻る


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。

MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません