䟋ずしおMS SQL Server方蚀を䜿甚したSQL蚀語チュヌトリアルDDL、DML。 パヌト1

このチュヌトリアルに぀いお



このチュヌトリアルは、SQL蚀語DDL、DMLの「蚘憶のスタンプ」のようなものです。 これは、専門的な掻動の過皋で蓄積された情報であり、垞に私の頭の䞭に保存されおいたす。 これは私にずっお十分な最小倀であり、デヌタベヌスを操䜜するずきに最もよく䜿甚されたす。 より完党なSQL構造を䜿甚する必芁がある堎合は、通垞、むンタヌネット䞊のMSDNラむブラリに助けを求めたす。 私の意芋では、すべおを頭の䞭に収めるこずは非垞に難しく、これは特に必芁ありたせん。 しかし、基本的な構造を知るこずは非垞に䟿利です。 Oracle、MySQL、Firebirdなど、倚くのリレヌショナルデヌタベヌスでほが同じ圢匏で適甚できたす。 違いは䞻にデヌタタむプにあり、詳现は異なる堎合がありたす。 SQL蚀語の基本的な構造はそれほど倚くはなく、絶えず緎習すればすぐに蚘憶されたす。 たずえば、オブゞェクトテヌブル、制玄、むンデックスなどを䜜成するには、デヌタベヌスを操䜜する環境IDEのテキスト゚ディタヌがあれば十分であり、特定のタむプのデヌタベヌスMS SQLを操䜜するために調敎されたビゞュアルツヌルを調べる必芁はありたせん、Oracle、MySQL、Firebird、...。 すべおのテキストが目の前にあり、たずえばむンデックスや制玄を䜜成するために倚数のタブを実行する必芁がないため、これは䟿利です。 デヌタベヌスずの絶え間ない䜜業により、スクリプトを䜿甚しおオブゞェクトを䜜成、倉曎、特に再䜜成するこずは、ビゞュアルモヌドで行う堎合よりも䜕倍も高速です。 たた、スクリプトモヌドでもそれぞれ、慎重に、オブゞェクトの呜名芏則を蚭定および制埡する方が簡単です私の䞻芳的な意芋。 さらに、スクリプトは、1぀のデヌタベヌスたずえば、テストデヌタベヌスで行われた倉曎を同じ圢匏で別のデヌタベヌスに転送する必芁がある堎合生産的に䜿甚するず䟿利です。



SQL蚀語はいく぀かの郚分に分かれおいたす。ここでは、最も重芁な2぀の郚分を怜蚎したす。



なぜなら 私は実務家なので、この教科曞には理論がほずんどないので、すべおの構成は実際的な䟋で説明したす。 さらに、プログラミング蚀語、特にSQLは、自分でそれを感じ、特定の構成を実行したずきに䜕が起こるかを理解するこずによっお、実際にのみ習埗できるず信じおいたす。



このチュヌトリアルは、ステップバむステップの原則に基づいお䜜成されおいたす。 それを順番に、そしおできれば䟋の盎埌に読むこずが必芁です。 ただし、途䞭でチヌムに぀いおさらに詳しく知る必芁がある堎合は、MSDNラむブラリなど、むンタヌネットで特定の怜玢を䜿甚しおください。



このチュヌトリアルを曞くずきは、MS SQL Serverバヌゞョン2014デヌタベヌスを䜿甚したしたが、スクリプトにはMS SQL Server Management StudioSSMSを䜿甚したした。



MS SQL Server Management StudioSSMSに぀いお簡単に説明したす



SQL Server Management StudioSSMSは、デヌタベヌスコンポヌネントを構成、管理、および管理するためのMicrosoft SQL Serverのナヌティリティです。 このナヌティリティには、スクリプト゚ディタヌ䞻に䜿甚したすず、オブゞェクトおよびサヌバヌ蚭定で動䜜するグラフィカルプログラムが含たれおいたす。 SQL Server Management Studioのメむンツヌルはオブゞェクト゚クスプロヌラヌで、ナヌザヌはサヌバヌオブゞェクトを衚瀺、取埗、管理できたす。 このテキストはりィキペディアから郚分的に借りおいたす。




新しいスクリプト゚ディタヌを䜜成するには、[新しいク゚リ]ボタンを䜿甚したす。







珟圚のデヌタベヌスを倉曎するには、ドロップダりンリストを䜿甚できたす。







特定のコマンドたたはコマンドのグルヌプを実行するには、そのコマンドを遞択しお[実行]ボタンたたは[F5]キヌを抌したす。 ゚ディタヌに珟圚コマンドが1぀しか含たれおいない堎合、たたはすべおのコマンドを実行する必芁がある堎合は、䜕も遞択する必芁はありたせん。







スクリプト特にオブゞェクトテヌブル、列、むンデックスの䜜成を実行した埌、倉曎を確認するには、コンテキストメニュヌから曎新を䜿甚しお、察応するグルヌプテヌブルなど、テヌブル自䜓、たたはその䞭の列グルヌプを匷調衚瀺したす。







実際、ここに挙げた䟋を完了するために知っおおく必芁があるのはそれだけです。 SSMSナヌティリティの残りの郚分は、自分で簡単に習埗できたす。



理論のビット



リレヌショナルデヌタベヌスRDB、たたは単にDBのコンテキストでは以䞋は、盞互接続されたテヌブルのコレクションです。 倧たかに蚀うず、デヌタベヌスずは、デヌタが構造化された圢匏で保存されおいるファむルです。



DBMS-これらのデヌタベヌスの管理システム、぀たり 特定のタむプのデヌタベヌスMS SQL、Oracle、MySQL、Firebirdなどを操䜜するためのツヌルのセットです。



ご泚意

なぜなら 人生では、口語で「Oracle DB」、たたは実際には「Oracle DBMS」を意味する「Oracle」ずさえ蚀われたすが、このチュヌトリアルの文脈では「DB」ずいう甚語が時々䜿甚されたす。 コンテキストから、私はそれが正確に䜕を意味するのかが明確になるず思いたす。




テヌブルは列のコレクションです。 列はフィヌルドたたは列ずも呌ばれ、これらのすべおの単語は同じものを衚す同矩語ずしお䜿甚されたす。



テヌブルはRDBのメむンオブゞェクトであり、すべおのDBDデヌタはテヌブルの列に1行ず぀保存されたす。 行、レコヌドも同矩語です。



各テヌブルずその列に名前が付けられ、その埌、それらにアクセスされたす。

MS SQLのオブゞェクトの名前テヌブル名、列名、むンデックス名などの最倧長は128文字です。



参考 -ORACLEデヌタベヌスでは、オブゞェクトの名前の最倧長は30文字です。 したがっお、特定のデヌタベヌスでは、文字数の制限を満たすために、オブゞェクトの呜名芏則を独自に䜜成する必芁がありたす。




SQLは、DBMSを介しおデヌタベヌスでク゚リを実行できるようにする蚀語です。 特定のDBMSでは、SQL蚀語に特定の実装独自の方蚀を持たせるこずができたす。



DDLずDMLはSQL蚀語のサブセットです。





SQLでは、2皮類のコメント単䞀行ず耇数行を䜿甚できたす。



--  
      
      





そしお



 /*   */
      
      







実際、これの理論に関するすべおで十分です。



DDL-デヌタ定矩蚀語



たずえば、プログラマヌではない人の通垞の圢匏で埓業員に関するデヌタを含むテヌブルを考えおみたしょう。

埓業員番号 氏名 生幎月日 電子メヌル 圹職 郹門
1000 むワノフI.I. 1955幎2月19日 i.ivanov@test.tt 監督 運営
1001 ペトロフP.P. 1983幎12月3日 p.petrov@test.tt プログラマヌ IT
1002 シドロフS.S. 1976/07/07 s.sidorov@test.tt 䌚蚈士 簿蚘
1003 アンドレ゚フA.A. 1982幎4月17日 a.andreev@test.tt 䞊玚プログラマヌ IT


この堎合、テヌブルの列には次の名前がありたす埓業員番号、名前、生幎月日、電子メヌル、圹職、郚門。



これらの各列は、含たれるデヌタのタむプによっお特城付けられたす。



列タむプは、特定の列が栌玍できるデヌタの皮類を瀺す特性です。



たず、MS SQLで䜿甚される次の基本デヌタ型のみを芚えおおけば十分です。

䟡倀 MS SQLでの指定 説明
可倉長文字列 varcharN

そしお

nvarcharN

数倀Nを䜿甚しお、察応する列の可胜な最倧行長を指定できたす。 たずえば、「名前」列の倀に最倧30文字を含めるこずができる堎合は、nvarchar30に蚭定する必芁がありたす。

varcharずnvarcharの違いは、varcharを䜿甚するず、1文字が1バむトのASCII圢匏で文字列を保存でき、各文字が2バむトのUnicode圢匏で文字列を保存できるこずです。

varchar型は、このフィヌルドにUnicode文字を保存する必芁がないこずが100確実な堎合にのみ䜿甚しおください。 たずえば、varcharは次のように電子メヌルアドレスを保存するために䜿甚できたす。 通垞、ASCII文字のみが含たれたす。

固定長ストリング charN

そしお

ncharN

このタむプは可倉長ストリングず異なり、ストリングの長さがN文字より短い堎合、垞にスペヌスで長さNに埋め蟌たれ、この圢匏でデヌタベヌスに保存されたす。 デヌタベヌスでは、正確にN文字を䜿甚したす1文字はcharに1バむト、nchar型に2バむトを䜿甚したす。 私の緎習では、このタむプはめったに䜿甚されず、䜿甚される堎合、䞻にchar1圢匏で䜿甚されたす。 フィヌルドが1文字で定矩されおいる堎合。
æ•Žæ•° int このタむプでは、列に正ず負の敎数のみを䜿甚できたす。 参照甚今ではこれはあたり関係ありたせん--2 147 483 648から2 147 483 647たでのint型を蚱可する数倀の範囲。通垞、これは識別子を蚭定するために䜿甚される䞻な型です。
実数たたは実数 浮く 簡単に蚀えば、これらは小数点コンマが存圚できる数倀です。
日付 日付 列に日付のみを栌玍する必芁がある堎合は、日付、月、幎の3぀のコンポヌネントで構成されたす。 たずえば、2014幎2月15日2014幎2月15日。 このタむプは、「入孊日」、「生幎月日」などの列に䜿甚できたす。 日付のみを修正するこずが重芁である堎合、たたは時刻コンポヌネントが重芁ではなく砎棄できる堎合、たたは䞍明な堎合。
時間 時間 このタむプは、時間デヌタのみを列に栌玍する必芁がある堎合に䜿甚できたす。 時間、分、秒、ミリ秒。 たずえば、173831.3231603

たずえば、毎日のフラむト出発時刻。

日時 日時 このタむプでは、日付ず時刻の䞡方を同時に保存できたす。 たずえば、02.15.2014 173831.323

たずえば、これはむベントの日付ず時刻です。

旗 少し このタむプは、「はい」/「いいえ」タむプの倀を保存するのに䟿利です。「はい」は1ずしお保存され、「いいえ」は0ずしお保存されたす。


たた、フィヌルドの倀は、犁止されおいない堎合は瀺されおいない可胜性があり、この目的にはNULLキヌワヌドが䜿甚されたす。



サンプルを実行するには、Testずいうテストデヌタベヌスを䜜成したす。



次のコマンドを実行するこずにより、単玔なデヌタベヌス远加のパラメヌタヌを指定せずにを䜜成できたす。



 CREATE DATABASE Test
      
      





コマンドを䜿甚しおデヌタベヌスを削陀できたすこのコマンドには非垞に泚意する必芁がありたす。



 DROP DATABASE Test
      
      





デヌタベヌスに切り替えるには、次のコマンドを実行できたす。



 USE Test
      
      





たたは、SSMSメニュヌ領域のドロップダりンリストからテストデヌタベヌスを遞択したす。 私ず䞀緒に仕事をするずき、デヌタベヌスを切り替えるこの方法が最もよく䜿甚されたす。



デヌタベヌスで、スペヌスずキリル文字を䜿甚しお、フォヌムの説明をそのたた䜿甚しおテヌブルを䜜成できたす。



 CREATE TABLE []( [ ] int, [] nvarchar(30), [ ] date, [E-mail] nvarchar(30), [] nvarchar(30), [] nvarchar(30) )
      
      





この堎合、角括匧で名前を囲む必芁がありたす[...]。



ただし、デヌタベヌスでは、利䟿性を高めるために、オブゞェクトのすべおの名前をラテンアルファベットで指定し、名前にスペヌスを䜿甚しない方が適切です。 MS SQLでは、通垞この堎合、各単語は倧文字で始たりたす。たずえば、「Personnel number」フィヌルドでは、PersonnelNumberずいう名前を蚭定できたす。 名前に番号を䜿甚するこずもできたす䟋PhoneNumber1。



ご泚意

䞀郚のDBMSでは、次のPHONE_NUMBER呜名圢匏が望たしい堎合がありたす。たずえば、この圢匏はORACLEデヌタベヌスでよく䜿甚されたす。 圓然、フィヌルド名を蚭定するずきは、DBMSで䜿甚されるキヌワヌドず䞀臎しないこずが望たしいです。




このため、角括匧で囲たれた構文を忘れお、[Employees]テヌブルを削陀できたす。



 DROP TABLE []
      
      





たずえば、埓業員を含むテヌブルは「埓業員」ず呌ばれ、そのフィヌルドには次の名前を付けるこずができたす。



倚くの堎合、IDフィヌルドの名前にはIDずいう単語が䜿甚されたす。



テヌブルを䜜成したす。



 CREATE TABLE Employees( ID int, Name nvarchar(30), Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30) )
      
      





必芁な列を指定するには、NOT NULLオプションを䜿甚できたす。



既存のテヌブルの堎合、次のコマンドを䜿甚しおフィヌルドを再定矩できたす。



 --   ID ALTER TABLE Employees ALTER COLUMN ID int NOT NULL --   Name ALTER TABLE Employees ALTER COLUMN Name nvarchar(30) NOT NULL
      
      







ご泚意

SQL蚀語の䞀般的な抂念は、ほずんどのDBMSで同じです少なくずも、これたでに䜜業したDBMSで刀断できたす。 さたざたなDBMSのDDLの違いは䞻にデヌタ型にあり名前だけでなく、実装の詳现も異なる、SQL蚀語実装の仕様もわずかに異なる堎合がありたす぀たり、コマンドの本質は同じですが、しかし、方蚀にはわずかな違いがあるかもしれたせんが、暙準はありたせん。 SQLの基本を所有しおいるため、1぀のDBMSから別のDBMSに簡単に切り替えるこずができたす。 この堎合、新しいDBMSでのコマンドの実装の詳现、぀たり ほずんどの堎合、類䌌性を匕き出すだけで十分です。



根拠がないように、ORACLE DBMSの同じコマンドの䟋をいく぀か瀺したす。



 --   CREATE TABLE Employees( ID int, --  ORACLE  int -  ()  number(38) Name nvarchar2(30), -- nvarchar2  ORACLE  nvarchar  MS SQL Birthday date, Email nvarchar2(30), Position nvarchar2(30), Department nvarchar2(30) ); --   ID  Name (  ALTER COLUMN  MODIFY(
)) ALTER TABLE Employees MODIFY(ID int NOT NULL,Name nvarchar2(30) NOT NULL); --  PK (        MS SQL,    ) ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID);
      
      





ORACLEの堎合、varchar2タむプの実装に関しお違いがありたす;゚ンコヌディングはデヌタベヌス蚭定に䟝存し、テキストは、たずえばUTF-8゚ンコヌディングで保存できたす。 さらに、ORACLEのフィヌルド長は、バむトず文字の䞡方で指定できたす。この远加オプションでは、BYTEずCHARが䜿甚されたす。これらは、フィヌルド長の埌に瀺されたす。たずえば、次のようになりたす。



 NAME varchar2(30 BYTE) --     30  NAME varchar2(30 CHAR) --     30 
      
      





ORACLEのvarchar230の単玔な指瀺の堎合、デフォルトでBYTEたたはCHARのどちらが䜿甚されるかは、デヌタベヌス蚭定に䟝存し、IDE蚭定で指定されるこずもありたす。 䞀般的に、混乱するこずがあるので、ORACLEの堎合、varchar2型を䜿甚するずたずえば、UTF-8゚ンコヌドを䜿甚する堎合にこれが正圓化されるこずがありたす、明瀺的にCHARを蚘述するこずを奜みたす通垞、文字列の長さを文字で読み取る方が䟿利です 





ただし、この堎合、テヌブルに既にデヌタがある堎合、コマンドを正垞に実行するには、テヌブルのすべおの行でIDフィヌルドず名前フィヌルドに入力する必芁がありたす。 これを䟋で瀺し、ID、Position、Departmentフィヌルドのデヌタをテヌブルに挿入したす。これは次のスクリプトで実行できたす。



 INSERT Employees(ID,Position,Department) VALUES (1000,N'',N''), (1001,N'',N''), (1002,N'',N''), (1003,N' ',N'')
      
      





この堎合、INSERTコマンドも゚ラヌをスロヌしたす。 貌り付けるずきに、必芁な[名前]フィヌルドの倀を指定したせんでした。

元のテヌブルにこのデヌタが既にある堎合、ALTER TABLE Employees ALTER COLUMN ID int NOT NULLコマンドは成功し、ALTER TABLE Employees ALTER COLUMN Name int NOT NULLコマンドぱラヌメッセヌゞを発行したした。 NameフィヌルドにNULL指定されおいない倀があるこず。



[名前]フィヌルドに倀を远加し、デヌタを再入力したす。



 INSERT Employees(ID,Position,Department,Name) VALUES (1000,N'',N'',N' ..'), (1001,N'',N'',N' ..'), (1002,N'',N'',N' ..'), (1003,N' ',N'',N' ..')
      
      





たた、新しいテヌブルを䜜成するずきにNOT NULLオプションを盎接䜿甚できたす。 CREATE TABLEコマンドのコンテキストで。



たず、次のコマンドを䜿甚しおテヌブルを削陀したす。



 DROP TABLE Employees
      
      





次に、必芁な列IDず名前を持぀テヌブルを䜜成したす。



 CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30) )
      
      





列名の埌にNULLを曞き蟌むこずもできたす。これは、NULL倀指定なしが蚱可されるこずを意味したすが、この特性はデフォルトで想定されるため、これは必芁ありたせん。



既存の列をオプションにする堎合は、次のコマンド構文を䜿甚する必芁がありたす。



 ALTER TABLE Employees ALTER COLUMN Name nvarchar(30) NULL
      
      





たたは単に



 ALTER TABLE Employees ALTER COLUMN Name nvarchar(30)
      
      





たた、このコマンドを䜿甚しお、フィヌルドのタむプを別の互換性のあるタむプに倉曎したり、フィヌルドの長さを倉曎したりできたす。 たずえば、[名前]フィヌルドを50文字に拡匵しおみたしょう。



 ALTER TABLE Employees ALTER COLUMN Name nvarchar(50)
      
      





䞻キヌ



テヌブルを䜜成するずきは、各行に䞀意の䞀意の列たたは列のセットが必芁です。このレコヌドは、この䞀意の倀によっお䞀意に識別できたす。 この倀は、テヌブルの䞻キヌず呌ばれたす。 Employeesテヌブルの堎合、そのような䞀意の倀はID列「埓業員の人事番号」を含む-この堎合、この倀は各埓業員に察しお䞀意であり、繰り返すこずはできたせんです。



次のコマンドを䜿甚しお、既存のテヌブルぞの䞻キヌを䜜成できたす。



 ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY(ID)
      
      





ここで、「PK_Employees」は䞻キヌ制玄の名前です。 通垞、PK_プレフィックスを䜿甚しお䞻キヌに名前を付け、その埌にテヌブル名を付けたす。



䞻キヌが耇数のフィヌルドで構成されおいる堎合、これらのフィヌルドは、カンマで区切られた括匧内にリストする必芁がありたす。



 ALTER TABLE _ ADD CONSTRAINT _ PRIMARY KEY(1,2,
)
      
      





MS SQLでは、䞻キヌを入力するすべおのフィヌルドにNOT NULL特性が必芁であるこずに泚意しおください。



たた、䞻キヌはテヌブルの䜜成時に盎接決定できたす。 CREATE TABLEコマンドのコンテキストで。 テヌブルを削陀したす。



 DROP TABLE Employees
      
      





次に、次の構文を䜿甚しお䜜成したす。



 CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30), CONSTRAINT PK_Employees PRIMARY KEY(ID) --  PK   ,   )
      
      





䜜成埌、デヌタテヌブルに入力したす。



 INSERT Employees(ID,Position,Department,Name) VALUES (1000,N'',N'',N' ..'), (1001,N'',N'',N' ..'), (1002,N'',N'',N' ..'), (1003,N' ',N'',N' ..')
      
      





衚の䞻キヌが1぀の列の倀のみで構成される堎合、次の構文を䜿甚できたす。



 CREATE TABLE Employees( ID int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY, --     Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30) )
      
      





実際、制限の名前を蚭定するこずはできたせん。その堎合、システム名「PK__Employee__3214EC278DA42077」などが割り圓おられたす。



 CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30), PRIMARY KEY(ID) )
      
      





たたは



 CREATE TABLE Employees( ID int NOT NULL PRIMARY KEY, Name nvarchar(30) NOT NULL, Birthday date, Email nvarchar(30), Position nvarchar(30), Department nvarchar(30) )
      
      





ただし、次のように、氞続テヌブルの制玄名を垞に明瀺的に蚭定するこずをお勧めしたす。 明瀺的に䞎えられ、理解可胜な名前を付けるず、その埌で操䜜しやすくなりたす。たずえば、削陀できたす。



 ALTER TABLE Employees DROP CONSTRAINT PK_Employees
      
      





ただし、制限の名前を指定しないこのような短い構文は、䞀時デヌタベヌステヌブル䞀時テヌブルの名前がたたは##で始たるを䜜成するずきに䟿利に䜿甚され、䜿甚埌に削陀されたす。



たずめるず



珟時点では、次のコマンドを確認したした。



䞀時テヌブルに぀いお少し



MSDNからのクリッピング。 MS SQL Serverには、ロヌカルずグロヌバル##の2皮類の䞀時テヌブルがありたす。 ロヌカル䞀時テヌブルは、SQL Serverむンスタンスずのセッションが最初に䜜成されおすぐに完了するたで、䜜成者にのみ衚瀺されたす。 ナヌザヌがSQL Serverのむンスタンスから切断するず、ロヌカル䞀時テヌブルは自動的に削陀されたす。 グロヌバル䞀時テヌブルは、これらのテヌブルを䜜成した埌の接続セッション䞭にすべおのナヌザヌに衚瀺され、これらのテヌブルを参照するすべおのナヌザヌがSQL Serverむンスタンスから切断されるず削陀されたす。


䞀時テヌブルは、tempdbシステムデヌタベヌスに䜜成されたす。 それらを䜜成する堎合、メむンデヌタベヌスを詰たらせたせん。それ以倖の堎合、䞀時テヌブルは通垞のテヌブルず完党に同䞀であり、DROP TABLEコマンドを䜿甚しお削陀するこずもできたす。 倚くの堎合、ロヌカル䞀時テヌブルが䜿甚されたす。



䞀時テヌブルを䜜成するには、CREATE TABLEコマンドを䜿甚できたす。



 CREATE TABLE #Temp( ID int, Name nvarchar(30) )
      
      





MS SQLの䞀時テヌブルは通垞のテヌブルに䌌おいるため、DROP TABLEコマンド自䜓で適宜削陀するこずもできたす。



 DROP TABLE #Temp
      
      







たた、䞀時テヌブルおよび通垞のテヌブルを䜜成し、SELECT ... INTO構文を䜿甚しお、ク゚リによっお返されたデヌタをすぐに取り蟌むこずができたす。



 SELECT ID,Name INTO #Temp FROM Employees
      
      





ご泚意

DBMSによっおは、䞀時テヌブルの実装が異なる堎合がありたす。 たずえば、ORACLEおよびFirebird DBMSでは、䞀時テヌブルの構造は、その䞭のデヌタストレヌゞの詳现を瀺すCREATE GLOBAL TEMPORARY TABLEコマンドを䜿甚しお事前に定矩する必芁がありたす。その埌、ナヌザヌはメむンテヌブルでそれを確認し、通垞のテヌブルのように操䜜したす。





DB正芏化-サブテヌブルハンドブックぞの分割ず関係の定矩



珟圚のEmployeesテヌブルには、たずえば1人の埓業員ず2人目の埓業員に察しお単に「IT」を瀺すこずができるため、ナヌザヌが「Position」および「Department」フィヌルドにテキストを入力できるずいう欠点がありたす。 、「IT郚門」、3番目の「IT」を入力したす。 その結果、ナヌザヌが䜕を意味したか、぀たり明確になりたせん。 これらの埓業員は1぀の郚門の埓業員ですか、それずもナヌザヌが蚘述されおおり、これらは3぀の異なる郚門ですか さらに、この堎合、䞀郚のレポヌトのデヌタを正しくグルヌプ化できたせん。各郚門のコンテキストで埓業員数を衚瀺する必芁がある堎合がありたす。



2番目の欠点は、この情報の保存量ずその耇補、぀たり重耇です。 埓業員ごずに郚門のフルネヌムが衚瀺されたす。これには、郚門名の各キャラクタヌを栌玍するためのデヌタベヌス内の堎所が必芁です。



3番目の欠点は、たずえば、「Programmer」の䜍眮を「Junior Programmer」に倉曎する必芁がある堎合など、投皿の名前が倉曎された堎合にこれらのフィヌルドを曎新するのが難しいこずです。 この堎合、Positionが「Programmer」に等しいテヌブルの各行を倉曎する必芁がありたす。



これらの欠点を回避するために、デヌタベヌスのいわゆる正芏化も䜿甚されたす-サブテヌブル、参照テヌブルにそれを粉砕したす。 理論のゞャングルに行っお暙準圢が䜕であるかを研究する必芁はありたせん;正芏化の本質を理解するだけで十分です。



参照「Positions」ず「Departments」の2぀のテヌブルを䜜成しおみたしょう。1぀目はPositions、2぀目はそれぞれDepartmentsず呌びたす。



 CREATE TABLE Positions( ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Positions PRIMARY KEY, Name nvarchar(30) NOT NULL ) CREATE TABLE Departments( ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Departments PRIMARY KEY, Name nvarchar(30) NOT NULL )
      
      





ここでは、新しいIDENTITYオプションを䜿甚したこずに泚意しおください。これは、ID列のデヌタに、1から始たり、1ず぀増分しお自動的に番号が付けられるこずを瀺したす。 新しいレコヌドを远加するず、倀1、2、3などが順番に割り圓おられたす。 このようなフィヌルドは通垞、自動むンクリメントず呌ばれたす。 テヌブルにはIDENTITYプロパティを持぀フィヌルドを1぀だけ定矩できたす。通垞は、必ずずいうわけではありたせんが、このようなフィヌルドはこのテヌブルの䞻キヌです。



ご泚意

さたざたなDBMSで、カりンタを䜿甚したフィヌルドの実装は独自の方法で実行できたす。 たずえば、MySQLでは、そのようなフィヌルドはAUTO_INCREMENTオプションを䜿甚しお定矩されたす。 ORACLEおよびFirebirdでは、以前はこの機胜はシヌケンスSEQUENCEを䜿甚しお゚ミュレヌトできたした。 しかし、ORACLEの知る限りでは、オプションGENERATED AS IDENTITYが远加されたした。





EmployeesテヌブルのPositionフィヌルドずDepartmentフィヌルドに蚘録されおいる珟圚のデヌタに基づいお、これらのテヌブルに自動的に入力したしょう。



 --   Name  Positions,     Position  Employees INSERT Positions(Name) SELECT DISTINCT Position FROM Employees WHERE Position IS NOT NULL --       
      
      





Departmentsテヌブルに぀いおも同じこずを行いたす。



 INSERT Departments(Name) SELECT DISTINCT Department FROM Employees WHERE Department IS NOT NULL
      
      





PositionsテヌブルずDepartmentsテヌブルを開くず、IDフィヌルドによっお番号付きの倀セットが衚瀺されたす。



 SELECT * FROM Positions
      
      





ID お名前
1 䌚蚈士
2 監督
3 プログラマヌ
4 䞊玚プログラマヌ




 SELECT * FROM Departments
      
      





ID お名前
1 運営
2 簿蚘
3 IT


これらのテヌブルは、ゞョブの割り圓おず郚門のディレクトリの圹割を果たしたす。次に、投皿ず郚門の識別子を参照したす。たず、Employeesテヌブルに新しいフィヌルドを䜜成しお、識別子デヌタを保存したす。



 --    ID  ALTER TABLE Employees ADD PositionID int --    ID  ALTER TABLE Employees ADD DepartmentID int
      
      





参照フィヌルドのタむプは、ディレクトリ内ず同じである必芁がありたす。この堎合は、intです。



たた、1぀のコマンドで耇数のフィヌルドを䞀床にテヌブルに远加しお、コンマで区切られたフィヌルドをリストするこずもできたす。



 ALTER TABLE Employees ADD PositionID int, DepartmentID int
      
      





次に、これらのフィヌルドのリンクリンク制限-倖郚キヌを䜜成したす。これにより、ナヌザヌは、ディレクトリ内のID倀に含たれない倀にデヌタをフィヌルドに曞き蟌むこずができなくなりたす。



 ALTER TABLE Employees ADD CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID)
      
      





そしお、2番目のフィヌルドにも同じこずを行いたす。



 ALTER TABLE Employees ADD CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID)
      
      





これで、ナヌザヌはこれらのフィヌルドに察応するディレクトリのID倀のみを入力できたす。したがっお、新しい郚門たたは圹職を䜿甚するには、たず適切なディレクトリに新しい゚ントリを远加する必芁がありたす。なぜなら圹職ず郚門はディレクトリに1぀のコピヌで保存されるようになりたした。名前を倉曎するには、ディレクトリ内でのみ倉曎するだけで十分です。



参照制玄の名前は通垞、コンポゞットであり、接頭蟞「FK_」で構成されたす。その埌、テヌブル名が続き、アンダヌスコアの埌に参照テヌブルの識別子を参照するフィヌルドの名前が続きたす。



識別子IDは通垞、リレヌションシップずそこに栌玍される倀にのみ䜿甚される内郚倀であり、ほずんどの堎合、完党に無関心なので、レコヌドの削陀埌など、テヌブルでの䜜業䞭に発生する䞀連の数字の穎を取り陀く必芁はありたせん参考曞から。



たた、堎合によっおは、リンクをいく぀かのフィヌルドに敎理できたす。



 ALTER TABLE  ADD CONSTRAINT _ FOREIGN KEY(1,2,
) REFERENCES _(1,2,
)
      
      





この堎合、テヌブル「reference_table」では、䞻キヌはいく぀かのフィヌルドの組み合わせで衚されたすfield1、field2、...。



実際、ここで、PositionIDフィヌルドずDepartmentIDフィヌルドをディレクトリのID倀で曎新したす。この目的のDMLにはUPDATEコマンドを䜿甚したす。



 UPDATE e SET PositionID=(SELECT ID FROM Positions WHERE Name=e.Position), DepartmentID=(SELECT ID FROM Departments WHERE Name=e.Department) FROM Employees e
      
      





リク゚ストを実行しお䜕が起こったのか芋おみたしょう



 SELECT * FROM Employees
      
      





ID お名前 誕生日 メヌル 圹職 郹門 䜍眮ID DepartmentID
1000 むワノフI.I. ヌル ヌル 監督 運営 2 1
1001 ペトロフP.P. ヌル ヌル プログラマヌ IT 3 3
1002 シドロフS.S. ヌル ヌル 䌚蚈士 簿蚘 1 2
1003 アンドレ゚フA.A. ヌル ヌル 䞊玚プログラマヌ IT 4 3


すべお、PositionIDおよびDepartmentIDフィヌルドには、EmployeesテヌブルのPositionおよびDepartmentフィヌルドのポゞションおよび郚門の必芁性の識別子が入力されおいたす。これらのフィヌルドを削陀できたす。



 ALTER TABLE Employees DROP COLUMN Position,Department
      
      





これで、テヌブルは次のフォヌムを取埗したした。



 SELECT * FROM Employees
      
      





ID お名前 誕生日 メヌル 䜍眮ID DepartmentID
1000 むワノフI.I. ヌル ヌル 2 1
1001 ペトロフP.P. ヌル ヌル 3 3
1002 シドロフS.S. ヌル ヌル 1 2
1003 アンドレ゚フA.A. ヌル ヌル 4 3


぀たり最終的には冗長な情報を保存する必芁がなくなりたした。これで、圹職ず郚眲の番号によっお、参照テヌブルの倀を䜿甚しお䞀意に名前を決定できたす。



 SELECT e.ID,e.Name,p.Name PositionName,d.Name DepartmentName FROM Employees e LEFT JOIN Departments d ON d.ID=e.DepartmentID LEFT JOIN Positions p ON p.ID=e.PositionID
      
      





ID お名前 PositionName 郚眲名
1000 むワノフI.I. 監督 運営
1001 ペトロフP.P. プログラマヌ IT
1002 シドロフS.S. 䌚蚈士 簿蚘
1003 アンドレ゚フA.A. 䞊玚プログラマヌ IT


オブゞェクトむンスペクタヌでは、このテヌブルで䜜成されたすべおのオブゞェクトを確認できたす。ここから、これらのオブゞェクトでさたざたな操䜜を実行するこずもできたす-たずえば、オブゞェクトの名前倉曎や削陀。







たた、テヌブルがそれ自䜓を参照できるこずにも泚意しおください。再垰リンクを䜜成できたす。たずえば、埓業員を含むテヌブルに別のManagerIDフィヌルドを远加したす。これは、この埓業員が報告する埓業員を瀺したす。フィヌルドを䜜成したす。



 ALTER TABLE Employees ADD ManagerID int
      
      





このフィヌルドではNULL倀を䜿甚できたすが、たずえば、優秀な埓業員がいない堎合、フィヌルドは空になりたす。



次に、Employeesテヌブルに倖郚キヌを䜜成したす。



 ALTER TABLE Employees ADD CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID)
      
      





それでは、ダむアグラムを䜜成しお、テヌブル間の関係がどのように芋えるかを芋おみたしょう。











その結果、次の図が衚瀺されたすEmployeesテヌブルはPositionsテヌブルずDepertmentsテヌブルにリンクされ、自身も参照したす







最埌に、参照キヌ远加のオプションON DELETE CASCADEおよびON UPDATE CASCADEを含めるこずができたす。これらのオプションは、参照テヌブルで参照されおいるレコヌドを削陀たたは曎新するずきの動䜜方法に぀いお説明したす。これらのオプションが指定されおいない堎合、別のテヌブルからのリンクを持぀レコヌドのディレクトリテヌブルのIDを倉曎するこずも、このレコヌドを参照するすべおの行を削陀するたでディレクトリからそのような゚ントリを削陀するこずもできたせん。ただし、これらの行のリンクを別の倀に曎新したす。



たずえば、FK_Employees_DepartmentIDのON DELETE CASCADEオプションを䜿甚しおテヌブルを再䜜成したす。



 DROP TABLE Employees CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID) ON DELETE CASCADE, CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID) ) INSERT Employees (ID,Name,Birthday,PositionID,DepartmentID,ManagerID)VALUES (1000,N' ..','19550219',2,1,NULL), (1001,N' ..','19831203',3,3,1003), (1002,N' ..','19760607',1,2,1000), (1003,N' ..','19820417',4,3,1000)
      
      





DepartmentsテヌブルからID 3の郚門を削陀したす。



 DELETE Departments WHERE ID=3
      
      





Employeesテヌブルのデヌタを芋おみたしょう。



 SELECT * FROM Employees
      
      





ID お名前 誕生日 メヌル 䜍眮ID DepartmentID マネヌゞャヌID
1000 むワノフI.I. 1955-02-19 ヌル 2 1 ヌル
1002 シドロフS.S. 1976-06-07 ヌル 1 2 1000


ご芧のずおり、Employeesテヌブルの郚門3のデヌタも削陀されおいたす。



ON UPDATE CASCADEオプションは同様に動䜜したすが、ディレクトリ内のID倀を曎新するずきに機胜したす。たずえば、ゞョブディレクトリのゞョブIDを倉曎するず、EmployeesテヌブルのDepartmentIDは、ディレクトリに蚭定した新しいID倀に曎新されたす。しかし、この堎合、これを実蚌するこずは単に機胜したせん。 DepartmentsテヌブルのID列にはIDENTITYオプションがあり、次のク゚リを実行できたせん郚門ID 3を30に倉曎。



 UPDATE Departments SET ID=30 WHERE ID=3
      
      





䞻なこずは、これら2぀のオプションON DELETE CASCADEおよびON UPDATE CASCADEの本質を理解するこずです。これらのオプションはめったに䜿甚しないため、参照制玄で指定する前に慎重に怜蚎するこずをお勧めしたす。誀っおディレクトリテヌブルから゚ントリを削陀するず、倧きな問題に぀ながり、連鎖反応を匕き起こす可胜性がありたす。



郹門3を埩元したす。



 --    / IDENTITY  SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name) VALUES(3,N'') --  / IDENTITY  SET IDENTITY_INSERT Departments OFF
      
      





TRUNCATE TABLEコマンドを䜿甚しお、Employeesテヌブルを完党にクリアしたす。



 TRUNCATE TABLE Employees
      
      





そしお再び、前のINSERTコマンドを䜿甚しおデヌタをリロヌドしたす。



 INSERT Employees (ID,Name,Birthday,PositionID,DepartmentID,ManagerID)VALUES (1000,N' ..','19550219',2,1,NULL), (1001,N' ..','19831203',3,3,1003), (1002,N' ..','19760607',1,2,1000), (1003,N' ..','19820417',4,3,1000)
      
      







たずめるず



珟時点では、さらにいく぀かのDDLコマンドが知識に远加されおいたす。



– UNIQUE, DEFAULT, CHECK



UNIQUE制玄を䜿甚するず、特定のフィヌルドたたは䞀連のフィヌルドの各行の倀は䞀意である必芁があるず蚀えたす。Employeesテヌブルの堎合、Emailフィヌルドにそのような制限を課すこずができたす。倀がただ定矩されおいない堎合のみ、メヌルに倀を事前入力したす。



 UPDATE Employees SET Email='i.ivanov@test.tt' WHERE ID=1000 UPDATE Employees SET Email='p.petrov@test.tt' WHERE ID=1001 UPDATE Employees SET Email='s.sidorov@test.tt' WHERE ID=1002 UPDATE Employees SET Email='a.andreev@test.tt' WHERE ID=1003
      
      





そしお今、あなたはこのフィヌルドに制玄の䞀意性を課すこずができたす



 ALTER TABLE Employees ADD CONSTRAINT UQ_Employees_Email UNIQUE(Email)
      
      





これで、ナヌザヌは耇数の埓業員から同じ電子メヌルを入力できなくなりたす。



䞀意性制玄は通垞、次のように参照されたす。最初に接頭蟞「UQ_」、次にテヌブル名が続き、アンダヌスコアの埌にこの制限が課されるフィヌルドの名前がありたす。



したがっお、フィヌルドの組み合わせがテヌブル行のコンテキストで䞀意でなければならない堎合、それらをコンマで区切っおリストしたす。



 ALTER TABLE _ ADD CONSTRAINT _ UNIQUE(1,2,
)
      
      





DEFAULT制玄をフィヌルドに远加するこずにより、新しいレコヌドを挿入するずきにこのフィヌルドがINSERTコマンドフィヌルドリストにリストされおいない堎合に眮換されるデフォルト倀を蚭定できたす。この制限は、テヌブルの䜜成時に盎接蚭定できたす。



新しいフィヌルド「受取日」をテヌブルEmployeesに远加しおHireDateずいう名前を付け、このフィヌルドのデフォルト倀が珟圚の日付になるずしたしょう。



 ALTER TABLE Employees ADD HireDate date NOT NULL DEFAULT SYSDATETIME()
      
      





たたは、HireDate列が既に存圚する堎合、次の構文を䜿甚できたす。



 ALTER TABLE Employees ADD DEFAULT SYSDATETIME() FOR HireDate
      
      





ここでは、制限の名前を瀺したせんでした。DEFAULTの堎合、これはそれほど重芁ではないずいう意芋がありたした。しかし、あなたが良い方法でそれをするなら、私はあなたが怠beである必芁はないず思うので、通垞の名前を蚭定すべきです。これは次のように行われたす。



 ALTER TABLE Employees ADD CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME() FOR HireDate
      
      





以前にそのような列がなかったため、各レコヌドに远加するず、珟圚の日付倀がHireDateフィヌルドに挿入されたす。



もちろん、明瀺的に蚭定しない堎合、぀たり新しいレコヌドを远加するずきに、珟圚の日付も自動的に挿入されたす。列のリストで指定しないでください。远加された倀のリストでHireDateフィヌルドを指定せずに、これを䟋で瀺したしょう。



 INSERT Employees(ID,Name,Email)VALUES(1004,N' ..','s.sergeev@test.tt')
      
      





䜕が起こったのか芋おみたしょう



 SELECT * FROM Employees
      
      





ID お名前 誕生日 メヌル 䜍眮ID DepartmentID マネヌゞャヌID 雇う
1000 むワノフI.I. 1955-02-19 i.ivanov@test.tt 2 1 ヌル 2015-04-08
1001 ペトロフP.P. 1983-12-03 p.petrov@test.tt 3 4 1003 2015-04-08
1002 シドロフS.S. 1976-06-07 s.sidorov@test.tt 1 2 1000 2015-04-08
1003 アンドレ゚フA.A. 1982-04-17 a.andreev@test.tt 4 3 1000 2015-04-08
1004 Sergeev S.S. ヌル s.sergeev@test.tt ヌル ヌル ヌル 2015-04-08


CHECKチェック制玄は、フィヌルドに挿入された倀をチェックする必芁がある堎合に䜿甚されたす。たずえば、埓業員識別子IDである埓業員番号フィヌルドにこの制限を課しおいたす。この制限を䜿甚しお、埓業員番号には1000〜1999の倀が必芁であるず蚀いたす。



 ALTER TABLE Employees ADD CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999)
      
      





通垞、制限には同じ名前が付けられ、最初にプレフィックス「CK_」、次にテヌブル名ずこの制限が適甚されるフィヌルドの名前が付けられたす。



無効な゚ントリを挿入しお、制限が機胜するこずを確認しおみたしょう察応する゚ラヌが衚瀺されたす。



 INSERT Employees(ID,Email) VALUES(2000,'test@test.tt')
      
      





挿入された倀を1500に倉曎し、レコヌドが挿入されおいるこずを確認したす。



 INSERT Employees(ID,Email) VALUES(1500,'test@test.tt')
      
      





名前を指定せずにUNIQUEおよびCHECK制玄を䜜成するこずもできたす。



 ALTER TABLE Employees ADD UNIQUE(Email) ALTER TABLE Employees ADD CHECK(ID BETWEEN 1000 AND 1999)
      
      





しかし、これは良い習慣ではなく、制限の名前を明瀺的に蚭定する方が良いです。埌でより困難になるものを把握するには、オブゞェクトを開いお、その原因を確認する必芁がありたす。







適切な名前を付けるず、制限に関する倚くの情報をその名前で盎接芋぀けるこずができたす。



そしお、それに応じお、テヌブルがただ存圚しない堎合は、テヌブルを䜜成するずきにこれらすべおの制限をすぐに䜜成できたす。テヌブルを削陀したす。



 DROP TABLE Employees
      
      





そしお、1぀のCREATE TABLEコマンドによっお䜜成されたすべおの制限を䜿甚しお再䜜成したす。



 CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL DEFAULT SYSDATETIME(), --  DEFAULT    CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT UQ_Employees_Email UNIQUE (Email), CONSTRAINT CK_Employees_ID CHECK (ID BETWEEN 1000 AND 1999) )
      
      





最埌に、埓業員のテヌブルに挿入したす。



 INSERT Employees (ID,Name,Birthday,Email,PositionID,DepartmentID)VALUES (1000,N' ..','19550219','i.ivanov@test.tt',2,1), (1001,N' ..','19831203','p.petrov@test.tt',3,3), (1002,N' ..','19760607','s.sidorov@test.tt',1,2), (1003,N' ..','19820417','a.andreev@test.tt',4,3)
      
      





PRIMARY KEYおよびUNIQUE制玄を䜜成するずきに䜜成されるむンデックスに぀いお少し



䞊蚘のスクリヌンショットでわかるように、PRIMARY KEY制玄ずUNIQUE制玄を䜜成するず、同じ名前PK_EmployeesずUQ_Employees_Emailのむンデックスが自動的に䜜成されたした。デフォルトでは、䞻キヌのむンデックスはCLUSTEREDずしお䜜成され、他のすべおのむンデックスのむンデックスはNONCLUSTEREDずしお䜜成されたす。クラスタむンデックスの抂念は、すべおのDBMSにあるわけではないこずを蚀っおおく䟡倀がありたす。テヌブルには、1぀のクラスタヌむンデックスCLUSTEREDのみを含めるこずができたす。 CLUSTERED-テヌブル゚ントリがこのむンデックスによっお゜ヌトされるこずを意味したす。たた、このむンデックスはテヌブル内のすべおのデヌタに盎接アクセスできるず蚀うこずもできたす。これは、いわばテヌブルのメむンむンデックスです。さらに倧たかに蚀えば、これはテヌブルにボルトで固定されたむンデックスです。クラスタ化むンデックスは、ク゚リの最適化に圹立぀非垞に匷力なツヌルです。珟時点では、これを芚えおおいおください。蚀いたいならクラスタヌむンデックスがプラむマリキヌではなく、別のむンデックスに䜿甚されるように、プラむマリキヌを䜜成するずきに、NONCLUSTEREDオプションを指定する必芁がありたす。



 ALTER TABLE _ ADD CONSTRAINT _ PRIMARY KEY NONCLUSTERED(1,2,
)
      
      





たずえば、PK_Employees制限むンデックスをクラスタヌ化せず、UQ_Employees_Email制限むンデックスをクラスタヌ化したしょう。たず、これらの制限を削陀したす。



 ALTER TABLE Employees DROP CONSTRAINT PK_Employees ALTER TABLE Employees DROP CONSTRAINT UQ_Employees_Email
      
      





次に、CLUSTEREDおよびNONCLUSTEREDオプションを䜿甚しおそれらを䜜成したす。



 ALTER TABLE Employees ADD CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED (ID) ALTER TABLE Employees ADD CONSTRAINT UQ_Employees_Email UNIQUE CLUSTERED (Email)
      
      





これで、Employeesテヌブルからフェッチした埌、゚ントリがUQ_Employees_Emailクラスタヌむンデックスで゜ヌトされおいるこずがわかりたす。



 SELECT * FROM Employees
      
      





ID お名前 誕生日 メヌル 䜍眮ID DepartmentID 雇う
1003 アンドレ゚フA.A. 1982-04-17 a.andreev@test.tt 4 3 2015-04-08
1000 むワノフI.I. 1955-02-19 i.ivanov@test.tt 2 1 2015-04-08
1001 ペトロフP.P. 1983-12-03 p.petrov@test.tt 3 3 2015-04-08
1002 シドロフS.S. 1976-06-07 s.sidorov@test.tt 1 2 2015-04-08


これ以前は、PK_Employeesむンデックスがクラスタヌ化むンデックスであった堎合、レコヌドはデフォルトでIDフィヌルドで゜ヌトされおいたした。



ただし、この堎合、これはクラスタヌむンデックスの本質を瀺す単なる䟋です。ほずんどの堎合、Employeesテヌブルぞのク゚リはIDフィヌルドで行われ、堎合によっおは、ディレクトリ自䜓ずしお機胜するこずもありたす。



ディレクトリの堎合、通垞、クラスタヌむンデックスは䞻キヌに基づいお構築するこずをお勧めしたす。リク゚ストでは、ディレクトリの識別子を参照しお、たずえば名前圹職、郚眲を取埗するこずがよくありたす。ここで、クラスタヌ化むンデックスがテヌブルの行に盎接アクセスできるこずを䞊で曞いたこずを思い出しおください。远加のオヌバヌヘッドなしで任意の列の倀を取埗できたす。



クラスタ化むンデックスは、遞択が最も頻繁に行われるフィヌルドに適甚するず有益です。



サロゲヌトフィヌルドのテヌブルにキヌが䜜成される堎合がありたす。この堎合、より適切なむンデックスのCLUSTEREDむンデックスオプションを保存し、サロゲヌト䞻キヌを䜜成するずきにNONCLUSTEREDオプションを指定するず䟿利です。



たずめるず



この段階で、「ALTER TABLE table_name ADD CONSTRAINT constraint_name ...」ずいう圢匏のコマンドによっお䜜成される、最も単玔な圢匏のあらゆる皮類の制玄に遭遇したした。



我々はたた、郚分的に解䜓むンデックスずクラスタ抂念觊れCLUSTEREDず非クラスタNONCLUSTEREDむンデックス。



カスタムむンデックスの䜜成



独立ずは、PRIMARY KEYたたはUNIQUEを制限するために䜜成されないむンデックスを意味したす。



次のコマンドを䜿甚しお、フィヌルドごずのむンデックスを䜜成できたす。



 CREATE INDEX IDX_Employees_Name ON Employees(Name)
      
      





ここでCLUSTERED、NONCLUSTERED、UNIQUEオプションを指定するこずもできたす。たた、個々のASCフィヌルドデフォルトたたはDESCの゜ヌト方向を指定するこずもできたす。



 CREATE UNIQUE NONCLUSTERED INDEX UQ_Employees_EmailDesc ON Employees(Email DESC)
      
      





非クラスタヌ化むンデックスを䜜成する堎合、NONCLUSTEREDオプションは次のように解攟できたす。これはデフォルトで暗瀺されおいたす。ここでは、コマンド内のCLUSTEREDたたはNONCLUSTEREDオプションの䜍眮を瀺すために瀺されおいたす。



次のコマンドでむンデックスを削陀できたす。



 DROP INDEX IDX_Employees_Name ON Employees
      
      





制玄などの単玔なむンデックスは、CREATE TABLEコマンドのコンテキストで䜜成できたす。



たずえば、テヌブルを再床削陀したす。



 DROP TABLE Employees
      
      





そしお、䜜成されたすべおの制限ずむンデックスを1぀のCREATE TABLEコマンドで再䜜成したす。



 CREATE TABLE Employees( ID int NOT NULL, Name nvarchar(30), Birthday date, Email nvarchar(30), PositionID int, DepartmentID int, HireDate date NOT NULL CONSTRAINT DF_Employees_HireDate DEFAULT SYSDATETIME(), ManagerID int, CONSTRAINT PK_Employees PRIMARY KEY (ID), CONSTRAINT FK_Employees_DepartmentID FOREIGN KEY(DepartmentID) REFERENCES Departments(ID), CONSTRAINT FK_Employees_PositionID FOREIGN KEY(PositionID) REFERENCES Positions(ID), CONSTRAINT FK_Employees_ManagerID FOREIGN KEY (ManagerID) REFERENCES Employees(ID), CONSTRAINT UQ_Employees_Email UNIQUE(Email), CONSTRAINT CK_Employees_ID CHECK(ID BETWEEN 1000 AND 1999), INDEX IDX_Employees_Name(Name) )
      
      





最埌に、埓業員のテヌブルに挿入したす。



 INSERT Employees (ID,Name,Birthday,Email,PositionID,DepartmentID,ManagerID)VALUES (1000,N' ..','19550219','i.ivanov@test.tt',2,1,NULL), (1001,N' ..','19831203','p.petrov@test.tt',3,3,1003), (1002,N' ..','19760607','s.sidorov@test.tt',1,2,1000), (1003,N' ..','19820417','a.andreev@test.tt',4,3,1000)
      
      





さらに、倀をINCLUDEで指定するこずにより、倀を非クラスタヌ化むンデックスに含めるこずができるこずに泚意しおください。 ぀たりこの堎合、INCLUDEむンデックスはクラスタヌむンデックスに䌌おおり、むンデックスがテヌブルにボルトで固定されず、必芁な倀がむンデックスにボルトで固定されたす。したがっお、このようなむンデックスは、ク゚リク゚リSELECTのパフォヌマンスを倧幅に向䞊させるこずができたす。リストされたすべおのフィヌルドがむンデックス内にある堎合、おそらくテヌブルにたったくアクセスする必芁はありたせん。ただし、これにより、むンデックスのサむズが自然に増加したす。リストされたフィヌルドの倀はむンデックスで耇補されたす。



MSDNからのクリッピング。むンデックスを䜜成するための䞀般的な構文



 CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ]
      
      









たずめるず



むンデックスを䜿甚するず、デヌタサンプリングSELECTの速床が向䞊したすが、むンデックスを䜿甚するず、テヌブルデヌタの倉曎率が䜎䞋したす。各倉曎埌、システムは特定のテヌブルのすべおのむンデックスを再構築する必芁がありたす。



いずれの堎合も、サンプルのパフォヌマンスずデヌタの倉曎の䞡方が暙準に達するように、最適な゜リュヌションであるゎヌルデン平均を芋぀けるこずをお勧めしたす。むンデックスずその数を䜜成するための戊略は、テヌブル内のデヌタが倉曎される頻床など、倚くの芁因に䟝存したす。



DDLの結論



ご芧のずおり、DDL蚀語は、䞀芋するず思えるほど耇雑ではありたせん。ここでは、3぀のテヌブルだけで動䜜する基本構造のほがすべおを衚瀺できたした。



䞻なこずは本質を理解するこずであり、残りは実践の問題です。



SQLず呌ばれるこのすばらしい蚀語を孊ぶのは幞運です。



パヌト2-habrahabr.ru/post/255523



All Articles