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

はじめにずDDL-デヌタ定矩蚀語



パヌト1-habrahabr.ru/post/255361



DML-デヌタ操䜜蚀語



最初の郚分では、MERGEコマンドを陀き、ほがすべおのコマンドセットを䜿甚しお、DML蚀語に぀いお少し觊れたした。



私自身の経隓のシヌケンスに埓っおDMLに぀いおお話したす。 途䞭で、泚目すべき「぀る぀るした」堎所に぀いおも説明したす。これらの「぀る぀るした」堎所は、SQL蚀語の倚くの方蚀で䌌おいたす。



なぜなら 教科曞はプログラマヌだけでなく幅広い読者局に圓おられおいるため、説明が適切な堎合がありたす。 長くお退屈です。 これは、専門的な掻動の結果ずしお実際に䞻に埗られる資料に察する私のビゞョンです。



このチュヌトリアルの䞻な目的は、SQL蚀語の本質を完党に理解し、その構造を正しく䜿甚する方法を教えるこずです。 この分野の専門家は、この資料をめくるこずに興味があるかもしれたせん。倚分圌らは自分自身のために䜕か新しいものを匕き出すこずができるか、蚘憶をリフレッシュするために読むだけで圹立぀かもしれたせん。 みんなが興味を持っおくれるこずを願っおいたす。



なぜなら MS SQLデヌタベヌス方蚀のDMLは、SELECTコンストラクトの構文ず非垞に関連しおいるので、それからDMLに぀いお話を始めたす。 私の意芋では、SELECTコンストラクトはDML蚀語の最も重芁なコンストラクトです。 郚品を犠牲にしお、必芁なデヌタがデヌタベヌスから遞択されたす。





DML蚀語には、次の構成芁玠が含たれおいたす。





このパヌトでは、次のようなSELECTコマンドの基本的な構文のみを怜蚎したす。



SELECT [DISTINCT] _  * FROM  WHERE  ORDER BY _
      
      





SELECTステヌトメントのトピックは非垞に広範囲であるため、このパヌトではその基本的な構成のみに焊点を圓おたす。 基盀をよく知らないず、もっず耇雑な構造を研究し始めるこずができないず思いたす。 その埌、すべおがこの基本蚭蚈サブク゚リ、関連付けなどを䞭心に展開されたす。



たた、このパヌトの䞀郚ずしお、TOPオファヌに぀いおも説明したす。 私は意図的にこの構文を基本的な構文で瀺したせんでした。 SQL蚀語の方蚀ごずに異なる方法で実装されたす。



DDL蚀語がより静的な堎合、぀たり それを䜿甚しお、剛䜓構造テヌブル、リレヌションシップなどが䜜成され、DML蚀語は本質的に動的です。ここでは、さたざたな方法で正しい結果を埗るこずができたす。



トレヌニングは、ステップバむステップモヌドでも継続されたす。 読むずきは、すぐに自分の手で䟋を詊しおみおください。 結果の分析を行った埌、盎感的に理解しおみおください。 たずえば、関数の倀など、理解できないものが残っおいる堎合は、むンタヌネットに問い合わせおください。



䟋は、最初の郚分でDDL + DMLを䜿甚しお䜜成されたテストデヌタベヌスに衚瀺されたす。



最初の郚分でデヌタベヌスを䜜成しなかった人誰もがDDL蚀語に興味があるわけではないためには、次のスクリプトを䜿甚できたす。



デヌタベヌステストを䜜成するスクリプト
 --   CREATE DATABASE Test GO --   Test  USE Test GO --    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 ) GO --     SET IDENTITY_INSERT Positions ON INSERT Positions(ID,Name)VALUES (1,N''), (2,N''), (3,N''), (4,N' ') SET IDENTITY_INSERT Positions OFF GO SET IDENTITY_INSERT Departments ON INSERT Departments(ID,Name)VALUES (1,N''), (2,N''), (3,N'') SET IDENTITY_INSERT Departments OFF GO --     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) ) GO --    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)
      
      









これで、DML蚀語の孊習を開始する準備が敎いたした。



SELECT-デヌタサンプリング挔算子



たず、アクティブなク゚リ゚ディタヌの堎合、ドロップダりンリストで遞択するか、USE Testコマンドを䜿甚しお、珟圚のテストデヌタベヌスを䜜成したす。



SELECTの最も基本的な圢匏から始めたしょう。



 SELECT * FROM Employees
      
      





このク゚リでは、Employeesテヌブルからすべおの列これは「*」で瀺されたすを返すように求められたす-「SELECT all_fields from the employees_table」ずしお読み取るこずができたす。 クラスタヌ化むンデックスが存圚する堎合、返されるデヌタはほずんどの堎合、ID列で゜ヌトされたすただし、これはポむントではありたせん。ほずんどの堎合、ORDER BY ...を䜿甚しお明瀺的に゜ヌトを指定するためです 

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 3 2015-04-08 1003
1002 シドロフS.S. 1976-06-07 s.sidorov@test.tt 1 2 2015-04-08 1000
1003 アンドレ゚フA.A. 1982-04-17 a.andreev@test.tt 4 3 2015-04-08 1000


䞀般に、MS SQLダむアレクトでは、最も単玔な圢匏のSELECTク゚リにはFROMブロックが含たれない堎合がありたす。この堎合、それを䜿甚しお倀を取埗できたす。



 SELECT 5550/100*15, SYSDATETIME(), --     SIN(0)+COS(0)
      
      





列名なし 列名なし 列名なし
825 2015-04-11 121236.0406743 1


匏5550/100 * 15の結果は825でしたが、蚈算機に頌るず倀832.5が埗られるこずに泚意しおください。 825の結果は、この匏ではすべおの数倀が敎数であるため、結果が敎数であるこずが刀明したした。 5550/100は55.5ではなく55を䞎えたす。



MS SQLの次のロゞックを思い出しおください。



぀たり 結果はより倧きな型に倉換されるため、最埌の2぀のケヌスでは実数を取埗したす数孊のように、実数の範囲は敎数の範囲より倧きいため、結果はそれに倉換されたす。



 SELECT 123/10, -- 12 123./10, -- 12.3 123/10. -- 12.3
      
      





ここで123.=123.0、この堎合は0を砎棄でき、ポむントのみを残すこずができたす。



他の算術挔算に぀いおも、同じロゞックが適甚されたす。陀算の堎合は、このニュアンスがより適切です。



したがっお、数倀列のデヌタ型に泚意しおください。 その堎合、党䜓であり、実際の結果を取埗する必芁がある堎合は、倉換を䜿甚するか、定数123.ずしお指定された数倀の埌にドットを配眮したす。



CASTたたはCONVERT関数を䜿甚しお、フィヌルドを倉換できたす。 たずえば、IDフィヌルドを䜿甚したす。タむプはintです。



 SELECT ID, ID/100, --     CAST(ID AS float)/100, --   CAST     float CONVERT(float,ID)/100, --   CONVERT     float ID/100. --          FROM Employees
      
      





ID 列名なし 列名なし 列名なし 列名なし
1000 10 10 10 10.000000
1001 10 10.01 10.01 10.010000
1002 10 10.02 10.02 10.020000
1003 10 10.03 10.03 10.030000


メモぞ。 ORACLEデヌタベヌスでは、FROMブロックのない構文は無効です;そこで、この目的のために、1行を含むDUALシステムテヌブルが䜿甚されたす。



 SELECT 5550/100*15, --   ORACLE    832.5 sysdate, sin(0)+cos(0) FROM DUAL
      
      







ご泚意 倚くのRDBのテヌブル名の前には、スキヌマの名前を付けるこずができたす。



 SELECT * FROM dbo.Employees -- dbo –  
      
      







スキヌマは、独自の名前を持぀デヌタベヌスの論理ナニットであり、テヌブル、ビュヌなどのデヌタベヌスオブゞェクトをグルヌプ化できたす。



異なるデヌタベヌスのスキヌマの定矩は異なる堎合がありたす。スキヌマがデヌタベヌスのナヌザヌに盎接関連しおいる堎合、぀たり この堎合、スキヌムずナヌザヌは同矩語であり、スキヌムで䜜成されるすべおのオブゞェクトは基本的にこのナヌザヌのオブゞェクトであるず蚀えたす。 MS SQLでは、スキヌマは独立しお䜜成できる独立した論理ナニットですCREATE SCHEMAを参照。



デフォルトでは、dboデヌタベヌス所有者ず呌ばれるMS SQLデヌタベヌスに単䞀のスキヌマが䜜成され、䜜成されたすべおのオブゞェクトはデフォルトでこのスキヌマに䜜成されたす。 したがっお、ク゚リでテヌブルの名前を単に指定するず、珟圚のデヌタベヌスのdboスキヌマで怜玢されたす。 特定のスキヌマでオブゞェクトを䜜成する堎合、オブゞェクトの名前の前にスキヌマの名前を付ける必芁もありたす䟋「CREATE TABLE schema_name.table_name...」。



MS SQLの堎合、スキヌマ名の前に、指定されたスキヌマが存圚するデヌタベヌスの名前を付けるこずもできたす。



 SELECT * FROM Test.dbo.Employees -- _._.
      
      





このような改良は、たずえば次の堎合に圹立ちたす。

  • 1぀のリク゚ストで、異なるスキヌムたたはデヌタベヌスにあるオブゞェクトを参照したす
  • あるスキヌマたたはデヌタベヌスから別のスキヌマたたはデヌタベヌスにデヌタを転送する必芁がありたす
  • 1぀のデヌタベヌスにある堎合、別のデヌタベヌスからデヌタを芁求する必芁がありたす
  • など


スキヌマは、デヌタベヌスアヌキテクチャ、特に倧芏暡なデヌタベヌスを開発するずきに䜿甚するず䟿利な非垞に䟿利なツヌルです。





たた、リク゚ストのテキストでは、単䞀行の「-...」ず耇数行の「/ * ... * /」コメントの䞡方を䜿甚できるこずを忘れないでください。 リク゚ストが倧きく耇雑な堎合、コメントは、あなたや他の誰かが、しばらくしお、その構造を芚えたり理解したりするのに倧いに圹立ちたす。



テヌブルに倚くの列があり、特にテヌブルにただ倚くの行がある堎合、さらにネットワヌク経由でデヌタベヌスにク゚リを行う堎合は、必芁なフィヌルドをカンマで盎接リストしお遞択するこずをお勧めしたす。



 SELECT ID,Name FROM Employees
      
      







぀たり ここでは、テヌブルからIDずNameフィヌルドのみを返す必芁があるず蚀いたす。 結果は次のようになりたすずころで、ここでオプティマむザヌはNameフィヌルドによっお䜜成されたむンデックスを䜿甚するこずにしたした。

ID お名前
1003 アンドレ゚フA.A.
1000 むワノフI.I.
1001 ペトロフP.P.
1002 シドロフS.S.


メモぞ。 たずえば、どのむンデックスが䜿甚されおいるかを調べるなど、デヌタのサンプリング方法を確認するず圹立぀堎合がありたす。 これは、「掚定実行蚈画の衚瀺-蚈算蚈画の衚瀺」ボタンをクリックするか、「実際の実行蚈画を含める-結果にク゚リ実行の実際の蚈画を含める」を蚭定した堎合に実行できたす







実行蚈画の分析は、ク゚リの最適化に非垞に圹立ちたす。どのむンデックスが欠萜しおいるか、たたはどのむンデックスがたったく䜿甚されおおらず削陀できるかを芋぀けるこずができたす。



DMLを習埗し始めたばかりの堎合は、それほど重芁ではないので、メモを取り、安党に忘れるこずができたすこれは圹に立たないかもしれたせん-私たちの最初の目暙は、DML蚀語の基本を孊び、正しく䜿甚する方法を孊ぶこずです。最適化は別の技術です。 客芳的な芳点から正しい結果を返すク゚リを手に持っおいるだけで、個々の人がすでに最適化に取り組んでいるこずがより重芁な堎合がありたす。 最初に、目暙を達成するための手段を䜿甚しおク゚リを正しく蚘述する方法を孊習する必芁がありたす。 ここで達成しなければならない䞻な目暙は、ク゚リが正しい結果を返すこずです。





テヌブルの゚むリアスを定矩する



列をリストするずき、列の前にFROMブロックにあるテヌブルの名前を付けるこずができたす。



 SELECT Employees.ID,Employees.Name FROM Employees
      
      







ただし、通垞、この構文は䜿甚するのに䞍䟿です。 テヌブル名が長い堎合がありたす。 これらの目的のために、通垞、短い名前が指定および適甚されたす-゚むリアス



 SELECT emp.ID,emp.Name FROM Employees AS emp
      
      





たたは



 SELECT emp.ID,emp.Name FROM Employees emp --   AS   (   )
      
      







ここで、empは、このSELECTステヌトメントのコンテキストで䜿甚できるEmployeesテヌブルの゚むリアスです。 ぀たり このSELECTステヌトメントのコンテキストでは、テヌブルに新しい名前を付けたず蚀えたす。



もちろん、この堎合、ク゚リ結果は「SELECT ID、Name FROM Employees」ずたったく同じになりたす。 これが必芁な理由はこの郚分でもさらに理解されたすが、珟時点では、テヌブル名が盎接たたぱむリアスを䜿甚しお列名の前に指定指定できるこずを芚えおいたす。 ここでは、2぀のうち1぀を䜿甚できたす。 ゚むリアスを蚭定した堎合、゚むリアスを䜿甚する必芁がありたすが、テヌブル名は䜿甚できなくなりたす。



メモぞ。 ORACLEでは、ASキヌワヌドなしでテヌブル゚むリアスを指定するオプションのみが蚱可されたす。





DISTINCT-重耇する行を削陀する



DISTINCTキヌワヌドは、ク゚リ結果から重耇する行を削陀するために䜿甚されたす。 倧たかに蚀えば、最初にDISTINCTオプションなしでク゚リが実行され、その埌、すべおの重耇が結果からスロヌされるず想像しおください。 䟋を䜿甚しおより明確にするためにこれを瀺したしょう



 --      CREATE TABLE #Trash( ID int NOT NULL PRIMARY KEY, Col1 varchar(10), Col2 varchar(10), Col3 varchar(10) ) --      INSERT #Trash(ID,Col1,Col2,Col3)VALUES (1,'A','A','A'), (2,'A','B','C'), (3,'C','A','B'), (4,'A','A','B'), (5,'B','B','B'), (6,'A','A','B'), (7,'A','A','A'), (8,'C','A','B'), (9,'C','A','B'), (10,'A','A','B'), (11,'A',NULL,'B'), (12,'A',NULL,'B') --       DISTINCT SELECT Col1,Col2,Col3 FROM #Trash --       DISTINCT SELECT DISTINCT Col1,Col2,Col3 FROM #Trash --    DROP TABLE #Trash
      
      







これは芖芚的に次のようになりたすすべおの耇補には同じ色のマヌクが付けられたす。







次に、より実甚的な䟋を䜿甚しお、これを適甚できる堎所を芋おみたしょう-Employeesテヌブルから郚門の䞀意の識別子のみを返したす぀たり、埓業員が登録されおいる郚門のIDを芋぀けたす



 SELECT DISTINCT DepartmentID FROM Employees
      
      





DepartmentID
1
2
3


ここに3行ありたした。 1぀の郚門ITに2人の埓業員がいたす。



次に、どの郚眲でどの投皿が衚瀺されるかを確認したす。



 SELECT DISTINCT DepartmentID,PositionID FROM Employees
      
      





DepartmentID 䜍眮ID
1 2
2 1
3 3
3 4


ここでは4行になりたした。 この衚には重耇した組み合わせDepartmentID、PositionIDはありたせん。



しばらくDDLに戻る



デモ䟋のデヌタが䞍足し始めおいるので、より広範囲か぀明確に説明したいので、Employessテヌブルを少し拡匵したしょう。 さらに、「繰り返しは孊習の母です」ず蚀っおいる小さなDDLを思い出したす。もう䞀床、少し進んでUPDATEステヌトメントを適甚したしょう。



 --    ALTER TABLE Employees ADD LastName nvarchar(30), --  FirstName nvarchar(30), --  MiddleName nvarchar(30), --  Salary float, --      -  BonusPercent float --       GO --    (   ) UPDATE Employees SET LastName=N'',FirstName=N'',MiddleName=N'', Salary=5000,BonusPercent= 50 WHERE ID=1000 --  .. UPDATE Employees SET LastName=N'',FirstName=N'',MiddleName=N'', Salary=1500,BonusPercent= 15 WHERE ID=1001 --  .. UPDATE Employees SET LastName=N'',FirstName=N'',MiddleName=NULL, Salary=2500,BonusPercent=NULL WHERE ID=1002 --  .. UPDATE Employees SET LastName=N'',FirstName=N'',MiddleName=NULL, Salary=2000,BonusPercent= 30 WHERE ID=1003 --  ..
      
      







デヌタが正垞に曎新されたこずを確認したす。



 SELECT * FROM Employees
      
      





ID お名前 ... 姓 名 ミドルネヌム 絊料 ボヌナスパヌセント
1000 むワノフI.I. むワノフ むワン むバノビッチ 5000 50
1001 ペトロフP.P. ペトロフ ピヌタヌ ペトロビッチ 1500 15
1002 シドロフS.S. シドロフ シドヌル ヌル 2500 ヌル
1003 アンドレ゚フA.A. アンドレ゚フ アンドレむ ヌル 2000幎 30




ク゚リ列の゚むリアスの定矩



ここに曞くよりもここに衚瀺する方が簡単だず思いたす



 SELECT --     LastName+' '+FirstName+' '+MiddleName AS , --   , ..   HireDate AS " ", --   , ..   Birthday AS [ ], --  AS   Salary ZP FROM Employees
      
      





氏名 入孊日 生幎月日 Zp
むワノフむワンむワノビッチ 2015-04-08 1955-02-19 5000
ペトロフペトルペトロビッチ 2015-04-08 1983-12-03 1500
ヌル 2015-04-08 1976-06-07 2500
ヌル 2015-04-08 1982-04-17 2000幎


ご芧のずおり、蚭定した列゚むリアスは結果のテヌブルのヘッダヌに反映されたす。 実際、これが列゚むリアスの䞻な目的です。



泚意しおください、 最埌の2人の埓業員にはミドルネヌムNULL倀がないため、匏「LastName + '' + FirstName + '' + MiddleName」の結果もNULLを返したした。



MS SQLで文字列を接続远加、連結するには、「+」蚘号を䜿甚したす。



NULLが関係するすべおの匏たずえば、NULLによる陀算、NULLによる加算はNULLを返すこずに泚意しおください。



メモぞ。

ORACLEの堎合、||挔算子は文字列を連結するために䜿甚され、連結は「LastName ||」のようになりたす。 '|| FirstName ||' '|| MiddleName "。 ORACLEの堎合、文字列型には䟋倖があり、NULLず空の文字列 ''は同じであるこずに泚意しおください。したがっお、ORACLEでは、この匏は最埌の2人の埓業員に察しおSidorov SidorずAndreyev Andreyを返したす。 バヌゞョンORACLE 12cの時点では、私の知る限り、この動䜜を倉曎するオプションはありたせん正しくない堎合は修正しおください。 ここで、これが良いか悪いかを刀断するのは難しいです。なぜなら、 堎合によっおは、MS SQLのようにNULL文字列の動䜜がより䟿利であり、ORACLEのように他の堎合に䟿利です。



ORACLEは、[...]を陀く䞊蚘のすべおの列゚むリアスも受け入れたす。



ISNULL関数を䜿甚しお構造を損傷しないようにするために、MS SQLではCONCAT関数を䜿甚できたす。 3぀のオプションを怜蚎しお比范したす。



 SELECT LastName+' '+FirstName+' '+MiddleName FullName1, -- 2    NULL   '' (     ORACLE) ISNULL(LastName,'')+' '+ISNULL(FirstName,'')+' '+ISNULL(MiddleName,'') FullName2, CONCAT(LastName,' ',FirstName,' ',MiddleName) FullName3 FROM Employees
      
      





Fullname1 Fullname2 氏名3
むワノフむワンむワノビッチ むワノフむワンむワノビッチ むワノフむワンむワノビッチ
ペトロフペトルペトロビッチ ペトロフペトルペトロビッチ ペトロフペトルペトロビッチ
ヌル シドロフ・シドヌル シドロフ・シドヌル
ヌル アンドレむ゚フアンドレむ アンドレむ゚フアンドレむ


MS SQLでは、等号を䜿甚しお゚むリアスを指定できたす。



 SELECT ' '=HireDate, --  "
"  [
]   '
' [ ]=Birthday, ZP=Salary FROM Employees
      
      







ASキヌワヌドたたは等号を䜿甚しお゚むリアスを指定するこずは、おそらく奜みの問題です。 しかし、他の人の芁求を解析するずき、この知識は圹に立ちたす。



結論ずしお、゚むリアスに぀いおは、ラテン文字ず数字のみを䜿甚しお名前を蚭定し、「...」、「...」、および[...]の䜿甚を避けた方がよいず蚀いたす。぀たり、テヌブルに名前を付けるずきに䜿甚したのず同じルヌルを䜿甚したす。 さらに、䟋では、このような名前のみを䜿甚し、「...」、「...」、[...]は䜿甚したせん。



基本的な算術SQLステヌトメント



オペレヌタヌ アクション
+ 加算x + yたたは単項プラス+ x
- 枛算xyたたは単項マむナス-x
* 乗算x * y
/ 陀算x / y
 陀算の残りxy。 たずえば、1510は5になりたす


算術挔算子の優先順䜍は、数孊ず同じです。 必芁に応じお、括匧を䜿甚しお挔算子の適甚順序を倉曎できたす-a + b*x /yz。



そしおもう䞀床、NULLを䜿甚した操䜜がNULLを䞎えるこずを繰り返したす。䟋えば、10 + NULL、NULL * 15 / 3、100 / NULL-これはすべおNULLになりたす。 ぀たり 単に䞍定の倀を指定するず、明確な結果が埗られたせん。 ク゚リのコンパむル時にこれを考慮し、必芁に応じお、ISNULL、COALESCE関数を䜿甚しおNULL倀を凊理したす。



 SELECT ID,Name, Salary/100*BonusPercent AS Result1, --   NULL  Salary/100*ISNULL(BonusPercent,0) AS Result2, --   ISNULL Salary/100*COALESCE(BonusPercent,0) AS Result3 --   COALESCE FROM Employees
      
      





ID お名前 結果1 結果2 結果3
1000 むワノフI.I. 2500 2500 2500
1001 ペトロフP.P. 225 225 225
1002 シドロフS.S. ヌル 0 0
1003 アンドレ゚フA.A. 600 600 600
1004 ニコラ゚フN.N. ヌル 0 0
1005 アレクサンドロフA.A. ヌル 0 0




COALESCE関数に぀いお少しお話ししたす。



 COALESCE (expr1, expr2, ..., exprn) -    NULL    .
      
      







䟋



 SELECT COALESCE(f1, f1*f2, f2*f3) val --       FROM (SELECT null f1, 2 f2, 3 f3) q
      
      







私は䞻にDML蚀語の構成芁玠に焊点を圓おたすが、ほずんどの堎合、䟋で芋られる関数に぀いおは説明したせん。 特定の関数の機胜がわからない堎合は、むンタヌネットでその説明を探しおください。たずえば、Google怜玢で「MS SQL文字列関数」、「MS SQL数孊関数」、「MS SQL関数」などを指定しお、関数グルヌプの情報を盎接怜玢するこずもできたすNULL凊理。」 関数に関する倚くの情報があり、簡単に芋぀けるこずができたす。 たずえば、MSDNラむブラリでは、COALESCE関数に぀いお詳しく知るこずができたす。



COALESCEずCASEを比范したMSDNクリッピング



COALESCE匏は、CASE匏の構文ショヌトカットです。 これは、コヌドCOALESCEexpression1、... nがク゚リオプティマむザヌによっお次のCASE匏ずしお曞き換えられるこずを意味したす。



 CASE WHEN (expression1 IS NOT NULL) THEN expression1 WHEN (expression2 IS NOT NULL) THEN expression2 ... ELSE expressionN END
      
      







たずえば、陀算の残りの䜿甚方法を怜蚎したす。この挔算子は、レコヌドをグルヌプに分割する堎合に非垞に䟿利です。たずえば、偶数の埓業員番号IDを持぀すべおの埓業員を匕き出したす。2で割り切れるID



 SELECT ID,Name FROM Employees WHERE ID%2=0 --     2  0
      
      





ID お名前
1000 むワノフI.I.
1004 ニコラ゚フN.N.
1002 シドロフS.S.




ORDER BY-ク゚リの結果の䞊べ替え



ORDER BY句は、ク゚リの結果を゜ヌトするために䜿甚されたす。



 SELECT LastName, FirstName, Salary FROM Employees ORDER BY LastName,FirstName --    2-  –  ,    
      
      





姓 名 絊料
アンドレ゚フ アンドレむ 2000幎
むワノフ むワン 5000
ペトロフ ピヌタヌ 1500
シドロフ シドヌル 2500


ORDER BY句のフィヌルド名の埌に、降順でこのフィヌルドを䞊べ替えるために䜿甚されるDESCオプションを指定できたす。



 SELECT LastName,FirstName,Salary FROM Employees ORDER BY --    Salary DESC, -- 1.    LastName, -- 2.   FirstName -- 3.  
      
      





姓 名 絊料
むワノフ むワン 5000
シドロフ シドヌル 2500
アンドレ゚フ アンドレむ 2000幎
ペトロフ ピヌタヌ 1500


ご泚意ください。昇順の䞊べ替えにはASCキヌワヌドがありたすが、既定では昇順の䞊べ替えが䜿甚されるため、このオプションを忘れるこずができたすこのオプションを䞀床䜿甚した堎合は芚えおいたせん。




ORDER BY句では、SELECT句にリストされおいないフィヌルドを䜿甚できるこずに泚意しおくださいDISTINCTを䜿甚する堎合を陀き、このケヌスに぀いおは埌述したす。たずえば、TOPオプションを䜿甚しお少し前に進み、たずえば、プラむバシヌの目的で絊䞎自䜓を衚瀺しおはならないこずを考慮しお、絊䞎が最も高い3人の埓業員を遞択する方法を瀺したす。



 SELECT TOP 3 --   3      ID,LastName,FirstName FROM Employees ORDER BY Salary DESC --      
      
      





ID 姓 名
1000 むワノフ むワン
1002 シドロフ シドヌル


もちろん、ここでは耇数の埓業員が同じ絊䞎を持っおいる堎合があり、この芁求がどの特定の3人の埓業員に返されるかを蚀うのは困難です。これはタスクディレクタヌで解決する必芁がありたす。このタスクに぀いおディレクタヌず話し合った埌、次のオプションを䜿甚するこずに同意し、決定したず仮定したす-生幎月日フィヌルドで远加の゜ヌトを実行したす぀たり、私たちは行くのに長い道のりがありたす、そしお耇数の埓業員の生幎月日が䞀臎する可胜性がある堎合陀倖、その埌、ID倀の降順で3番目の゜ヌトを実行できたす最埌に遞択されるのは、IDが最も高いものです-たずえば、最埌に受け入れられた人、たずえば、埓業員番号が順番に発行されたす



 SELECT TOP 3 --   3      ID,LastName,FirstName FROM Employees ORDER BY Salary DESC, -- 1.       Birthday, -- 2.     ID DESC -- 3.         ID
      
      







぀たりク゚リ結果を予枬可胜にするようにしおください。これにより、フラむトの結果報告の堎合に、なぜこれらの人々がブラックリストに登録されたのか、぀たり、承認された芏則に埓っお、すべおが正盎に遞択されたした。



ORDER BY句で異なる匏を䜿甚しお゜ヌトするこずもできたす。



 SELECT LastName,FirstName FROM Employees ORDER BY CONCAT(LastName,' ',FirstName) --  
      
      







たた、ORDER BYでは、列に定矩された゚むリアスを䜿甚できたす。



 SELECT CONCAT(LastName,' ',FirstName) fi FROM Employees ORDER BY fi --  
      
      







DISTINCT句を䜿甚する堎合、SELECTブロックにリストされおいる列のみがORDER BY句で䜿甚できるこずに泚意しおください。 ぀たりDISTINCT操䜜を適甚した埌、新しい列のセットを持぀新しいデヌタセットを取埗したす。このため、次の䟋は機胜したせん。



 SELECT DISTINCT LastName,FirstName,Salary FROM Employees ORDER BY ID -- ID    ,      DISTINCT
      
      







぀たり 結果がナヌザヌに返される前に、ORDER BY句がすでに最終セットに適甚されおいたす。



1. ORDER BY , SELECT:



 SELECT LastName,FirstName,Salary FROM Employees ORDER BY --    3 DESC, -- 1.    1, -- 2.   2 -- 3.  
      
      







, .



( ), , «*» . – , -, , , ( ), , , .. , .



, , , , (.. ), , .



, .





2.

MS SQL NULL .



 SELECT BonusPercent FROM Employees ORDER BY BonusPercent
      
      







DESC



 SELECT BonusPercent FROM Employees ORDER BY BonusPercent DESC
      
      







NULL , , :



 SELECT BonusPercent FROM Employees ORDER BY ISNULL(BonusPercent,100)
      
      







ORACLE 2 NULLS FIRST NULLS LAST ( ). 䟋



 SELECT BonusPercent FROM Employees ORDER BY BonusPercent DESC NULLS LAST
      
      







.





TOP –



MSDNからのクリッピング。TOP-ク゚リの結果セットで返される行の数を、指定された数たたはパヌセント倀に制限したす。TOP句がORDER BY句ず組み合わせお䜿甚​​される堎合、結果セットは゜ヌトされた結果の最初のN行に制限されたす。それ以倖の堎合、最初のN行は未定矩の順序で返されたす。



通垞、この匏はORDER BY句ずずもに䜿甚され、結果セットからN番目の行を返す必芁がある堎合の䟋をすでに芋たした。



ORDER BYがない堎合、この提案は通垞、倚くのレコヌドが存圚する可胜性のある未知のテヌブルを芋る必芁がある堎合に適甚されたす。この堎合、たずえば、最初の10行のみを返すように䟝頌できたすが、明確にするために、2぀だけを蚀いたす。



 SELECT TOP 2 * FROM Employees
      
      







結果セットから察応する割合の行を返すために、単語PERCENTを指定するこずもできたす。



 SELECT TOP 25 PERCENT * FROM Employees
      
      







私の緎習では、行数による遞択がより頻繁に䜿甚されたす。



たた、TOPを䜿甚するず、WITH TIESオプションを䜿甚できたす。これは、あいたいな゜ヌトの堎合にすべおの行を返すのに圹立ちたす。この文は、TOP Nの遞択に該圓する行ず構成が等しいすべおの行を返したす。その結果、Nより倚くの行を遞択できたす。デモ甚に絊䞎が1500の別の「プログラマ」を远加したしょう。



 INSERT Employees(ID,Name,Email,PositionID,DepartmentID,ManagerID,Salary) VALUES(1004,N' ..','n.nikolayev@test.tt',3,3,1003,1500)
      
      







2000幎の絊䞎で圹職ず郚門を指定せずに別の埓業員を玹介したす。



 INSERT Employees(ID,Name,Email,PositionID,DepartmentID,ManagerID,Salary) VALUES(1005,N' ..','a.alexandrov@test.tt',NULL,NULL,1000,2000)
      
      







ここで、WITH TIESオプションを䜿甚しお、絊䞎が3人の埓業員の絊䞎ず同じで、絊䞎が最小のすべおの埓業員を遞択したす埌で明らかになるこずを願っおいたす。



 SELECT TOP 3 WITH TIES ID,Name,Salary FROM Employees ORDER BY Salary
      
      







ここでは、TOP 3が瀺されおいたすが、ク゚リは4぀のレコヌドを返したした。4人の埓業員には、TOP 3が返した絊䞎倀がありたした1500および2000。これは次のように芖芚的に機胜したす。







メモぞ。

さたざたなデヌタベヌスでは、TOPはさたざたな方法で実装されたす。MySQLには、このためのLIMIT句があり、远加で初期オフセットを蚭定できたす。



ORACLE 12cでは、TOP機胜ずLIMIT機胜を組み合わせた同等の機胜も導入したした。「ORACLE OFFSET FETCH」ずいう蚀葉を探しおください。バヌゞョン12cより前は、通垞、ROWNUM疑䌌列がこの目的で䜿甚されおいたした。



しかし、DISTINCT文ずTOP文を同時に適甚するずどうなりたすか実隓を行うこずにより、このような質問に簡単に答えるこずができたす。䞀般的に、恐れるこずなく、実隓するのを怠らないでください。そのほずんどは実際に孊習されたす。SELECTステヌトメントの語順は次のずおりです。最初の語はDISTINCTであり、その埌にTOPが続きたす。論理的に掚論し、巊から右に読む堎合、最初は重耇の拒吊であり、次にこのセットでTOPが䜜成されたす。さお、次のこずを確認しお確認したしょう。



 SELECT DISTINCT TOP 2 Salary FROM Employees ORDER BY Salary
      
      





絊料
1500
2000幎


぀たりその結果、私たちはすべおの絊䞎のうち最䜎の2぀を受け取りたした。もちろん、䞀郚の埓業員のRFPが指定されおいないNULL堎合がありたす。このスキヌムにより、これを行うこずができたす。したがっお、タスクに応じお、ORDER BY句でNULL倀を凊理するか、SalaryがNULLであるすべおのレコヌドを単玔に砎棄するこずを決定し、そのためにWHERE句の怜蚎に進みたす。



WHERE-行フェッチ条件



この文は、特定の条件でレコヌドをフィルタリングするために䜿甚されたす。たずえば、「IT」郚門で働くすべおの埓業員を遞択したすID = 3



 SELECT ID,LastName,FirstName,Salary FROM Employees WHERE DepartmentID=3 --  ORDER BY LastName,FirstName
      
      





ID 姓 名 絊料
1004 ヌル ヌル 1500
1003 アンドレ゚フ アンドレむ 2000幎
1001 ペトロフ ピヌタヌ 1500


WHERE句は、ORDER BYコマンドの前に蚘述されたす。



コマンドが元の埓業員セットに適甚される順序は次のずおりです。

  1. WHERE-指定されおいる堎合、埓業員のセット党䜓から最初に必芁なのは、条件を満たすレコヌドのみの遞択です
  2. DISTINCT-指定された堎合、すべおの重耇は砎棄されたす
  3. ORDER BY-指定されおいる堎合、結果は゜ヌトされたす
  4. TOP-指定されおいる堎合、指定された数のレコヌドのみが゜ヌト結果から返されたす




明確にするために䟋を考えおみたしょう。



 SELECT DISTINCT TOP 1 Salary FROM Employees WHERE DepartmentID=3 ORDER BY Salary
      
      







これは次のように







なりたす。NULLのチェックは等号ではなく、IS NULLおよびIS NOT NULL挔算子を䜿甚しお行われるこずに泚意しおください。「=」挔算子等号を䜿甚しおNULLず比范できないこずを忘れないでください。匏の結果もNULLになりたす。



たずえば、郚門を持たないすべおの埓業員を遞択したす぀たり、DepartmentID IS NULL



 SELECT ID,Name FROM Employees WHERE DepartmentID IS NULL
      
      





ID お名前
1005 アレクサンドロフA.A.


次に、䟋ずしお、BonusPercent倀が瀺されおいるすべおの埓業員のボヌナスを蚈算したしょう぀たり、BonusPercent IS NOT NULL



 SELECT ID,Name,Salary/100*BonusPercent AS Bonus FROM Employees WHERE BonusPercent IS NOT NULL
      
      







はい、ずころで、考えおみるず、BonusPercentの倀はれロ0になる可胜性がありたす。たた、このフィヌルドに制限を課しおいないため、マむナス蚘号を付けお倀を入力するこずもできたす。



問題に぀いお説明した埌、これたでのずころBonusPercent <= 0たたはBonusPercent IS NULLであれば、これは埓業員にもボヌナスがないこずを意味したす。最初に、蚀われたように、それを実行したす。論理挔算子ORおよびNOTを䜿甚しおこれを実装したす。



 SELECT ID,Name,Salary/100*BonusPercent AS Bonus FROM Employees WHERE NOT(BonusPercent<=0 OR BonusPercent IS NULL)
      
      







぀たりここでブヌル挔算子の研究を始めたした。括匧内の匏BonusPercent <= 0 OR BonusPercent IS NULLは、埓業員にボヌナスがないこずを確認し、この倀を反転させたせん。「ボヌナスのない埓業員ではないすべおの埓業員を返す」ず述べおいたす。



たた、この匏を曞き換えお、匏BonusPercent> 0およびBonusPercent IS NOT NULLで衚すこずにより、すぐに「ボヌナスのあるすべおの埓業員を返す」ず蚀うこずができたす。



 SELECT ID,Name,Salary/100*BonusPercent AS Bonus FROM Employees WHERE BonusPercent>0 AND BonusPercent IS NOT NULL
      
      







WHEREブロックでも、算術挔算子ず関数を䜿甚しおさたざたな皮類の匏を確認できたす。たずえば、ISNULL関数で匏を䜿甚しお同様のチェックを実行できたす。



 SELECT ID,Name,Salary/100*BonusPercent AS Bonus FROM Employees WHERE ISNULL(BonusPercent,0)>0
      
      







ブヌル挔算子ず単玔比范挔算子



はい、ここでは数孊なしではできたせん。そのため、ブヌル挔算子ず単玔な比范挔算子に぀いお簡単に説明したす。



SQLには、AND、OR、NOTの3぀のブヌル挔算子のみがありたす。

そしお 論理I。2぀の条件condition1 AND condition2の間に眮かれたす。匏がTrueを返すには、䞡方の条件がtrueでなければなりたせん。
たたは 論理OR。2぀の条件condition1 OR condition2の間に眮かれたす。匏がTrueを返すには、1぀の条件のみがTrueであれば十分です。
ない 条件/論理匏を反転したす。別の匏NOT logical_expressionにスヌパヌむンポヌズされ、logical_expression = Falseの堎合Trueを返し、logical_expression = Trueの堎合Falseを返したす


ブヌル挔算子ごずに、条件がNULLになる可胜性がある堎合の結果がさらに瀺される真理倀衚を提䟛できたす。







条件を圢成するために䜿甚される次の単玔な比范挔算子がありたす。

状態 䟡倀
= 同様に
< 少ない
> もっず
<= より小さいか等しい
> = より倧きいか等しい
<>

=
等しくない


さらに、NULLの倀/匏をチェックするための2぀の挔算子がありたす。

NULLです NULL等䟡チェック
NULLではない NULL䞍等匏の確認


優先床1すべおの比范挔算子。2NOT; 3AND; 4たたは。



耇雑な論理匏を構築する堎合、括匧が䜿甚されたす。



 ((1 AND 2) OR NOT(3 AND 4 AND 5)) OR (
)
      
      







たた、括匧を䜿甚しお、蚈算の暙準シヌケンスを倉曎できたす。



ここでは、仕事に十分な量のブヌル代数のアむデアを䞎えようずしたした。ご芧のずおり、より耇雑な条件を蚘述するために、ロゞックなしではできたせんが、それらのいく぀かAND、OR、NOTがあり、人々が思い぀いたので、すべおが非垞に論理的です。



第二郚を完成させたす



ご芧のずおり、SELECT挔算子の基本的な構文に぀いおも非垞に長い間話すこずができたすが、蚘事のフレヌムワヌク内にずどたるために、远加の論理挔算子-BETWEEN、IN、LIKEを瀺したす。



BETWEEN-範囲の確認



この挔算子の圢匏は次のずおりです。



 _ [NOT] BETWEEN _  AND _ 
      
      







倀は匏にするこずができたす。



䟋を芋おみたしょう



 SELECT ID,Name,Salary FROM Employees WHERE Salary BETWEEN 2000 AND 3000 --      2000-3000
      
      





ID お名前 絊料
1002 シドロフS.S. 2500
1003 アンドレ゚フA.A. 2000幎
1005 アレクサンドロフA.A. 2000幎


実際、BETWEENは次の圢匏の簡略化されたレコヌドです。



 SELECT ID,Name,Salary FROM Employees WHERE Salary>=2000 AND Salary<=3000 --       2000-3000
      
      







単語BETWEENの前に、単語NOTを䜿甚できたす。これにより、指定された範囲に該圓しない倀がチェックされたす。



 SELECT ID,Name,Salary FROM Employees WHERE Salary NOT BETWEEN 2000 AND 3000 --   NOT(Salary>=2000 AND Salary<=3000)
      
      







したがっお、BETWEEN、IN、LIKEを䜿甚する堎合、ANDおよびORを䜿甚しお他の条件ず組み合わせるこずもできたす。



 SELECT ID,Name,Salary FROM Employees WHERE Salary BETWEEN 2000 AND 3000 --      2000-3000 AND DepartmentID=3 --     3
      
      







IN-倀のリストぞの゚ントリを確認したす



この挔算子の圢匏は次のずおりです。



 _ [NOT] IN (1, 2, 
)
      
      







䟋で瀺す方が簡単だず思いたす



 SELECT ID,Name,Salary FROM Employees WHERE PositionID IN(3,4) --     3  4
      
      





ID お名前 絊料
1001 ペトロフP.P. 1500
1003 アンドレ゚フA.A. 2000幎
1004 ニコラ゚フN.N. 1500


぀たり 基本的に、これは次の匏に䌌おいたす。



 SELECT ID,Name,Salary FROM Employees WHERE PositionID=3 OR PositionID=4 --     3  4
      
      







NOTの堎合、これは同様になりたす郚門3ず郚門4以倖の党員を取埗したす。



 SELECT ID,Name,Salary FROM Employees WHERE PositionID NOT IN(3,4) --   NOT(PositionID=3 OR PositionID=4)
      
      







NOT INを䜿甚したリク゚ストは、ANDで衚珟するこずもできたす。



 SELECT ID,Name,Salary FROM Employees WHERE PositionID<>3 AND PositionID<>4 --  PositionID NOT IN(3,4)
      
      







INコンストラクトでNULL倀を怜玢するこずは機胜しないこずに泚意しおください。NULL = NULLをチェックするず、TrueではなくNULLも返されたす。



 SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID IN(1,2,NULL) -- NULL     
      
      







この堎合、テストをいく぀かの条件に分割したす。



 SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID IN(1,2) -- 1  2 OR DepartmentID IS NULL --  NULL
      
      







たたは、次のように曞くこずができたす。



 SELECT ID,Name,DepartmentID FROM Employees WHERE ISNULL(DepartmentID,-1) IN(1,2,-1) --   ,         ID=-1
      
      







この堎合、最初のオプションはより正確で信頌性が高いず思いたす。さお、これは他の構造を構築できるこずを瀺すための単なる䟋です。



たた、NULLに関連するさらに陰湿な゚ラヌに蚀及する䟡倀がありたす。これは、NOT IN構文を䜿甚するず発生する可胜性がありたす。たずえば、郚門が1であるか、郚門がたったく指定されおいない埓業員を陀く、すべおの埓業員を遞択しおみたしょう。nullに等しい。解決策ずしお、オプションはそれ自䜓を提案したす



 SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID NOT IN(1,NULL)
      
      







しかし、リク゚ストを実行するず、次のように衚瀺されるず予想されおいたしたが、1行は取埗されたせん。

ID お名前 DepartmentID
1001 ペトロフP.P. 3
1002 シドロフS.S. 2
1003 アンドレ゚フA.A. 3
1004 ニコラ゚フN.N. 3


繰り返したすが、倀のリストで指定されたNULLがここで冗談を挔じたした。



この堎合、論理゚ラヌが発生した理由を分析したす。ANDを䜿甚しおク゚リを展開したす。



 SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID<>1 AND DepartmentID<>NULL --  -    NULL -     NULL
      
      







正しい条件DepartmentID <> NULLは、ここで垞に䞍確実性を䞎えたす。NULL ここで、TRUE AND NULLがNULLを䞎えるAND挔算子の真理倀衚を思い出しおください。぀たり未定矩の右条件により巊の条件DepartmentID <> 1が満たされるず、結果ずしお匏党䜓の䞍定倀DepartmentID <> 1 AND DepartmentID <> NULLが取埗されるため、行は結果に含たれたせん。



条件は次のように正しく曞き換えられたす。



 SELECT ID,Name,DepartmentID FROM Employees WHERE DepartmentID NOT IN(1) --      DepartmentID<>1 AND DepartmentID IS NOT NULL --     NOT NULL
      
      







INは匕き続きサブク゚リで䜿甚できたすが、このチュヌトリアルの以降の郚分で既にこのフォヌムに戻りたす。



LIKE-パタヌンによる文字列の確認



この挔算子に぀いおは、最も単玔な圢匏でのみ説明したす。これは暙準であり、SQL蚀語のほずんどの方蚀でサポヌトされおいたす。この圢匏でも、文字列の内容を確認する必芁がある倚くの問題を解決するために䜿甚できたす。



この挔算子の圢匏は次のずおりです。



 _ [NOT] LIKE _ [ESCAPE _]
      
      







次の特殊文字をpattern_stringで䜿甚できたす。

  1. アンダヌスコア「_」-代わりに任意の単䞀文字を䜿甚できるこずを瀺したす
  2. パヌセント蚘号「」-代わりに、単䞀の文字を含め、任意の数の文字を䜿甚できるこずを瀺したす


蚘号「」の䟋を怜蚎したす実際には、より頻繁に䜿甚される方法で。



 SELECT ID,Name FROM Employees WHERE Name LIKE '%' --       "" SELECT ID,LastName FROM Employees WHERE LastName LIKE '%' --      "" SELECT ID,LastName FROM Employees WHERE LastName LIKE '%%' --      ""
      
      







蚘号「_」の䟋を怜蚎しおください。



 SELECT ID,LastName FROM Employees WHERE LastName LIKE '_' --            "" SELECT ID,LastName FROM Employees WHERE LastName LIKE '____' --            ""
      
      







ESCAPEを䜿甚するず、特殊文字「_」ず「」のチェックアクションをキャンセルするキャンセル文字を指定できたす。この文は、行のパヌセント蚘号たたはアンダヌスコアを盎接確認する必芁がある堎合に䜿甚されたす。



ESCAPEを瀺すために、ゎミを1぀の゚ントリに入れたしょう。



 UPDATE Employees SET FirstName='_,  %' WHERE ID=1005
      
      







そしお、次のク゚リが返すものを確認しおください。



 SELECT * FROM Employees WHERE FirstName LIKE '%!%%' ESCAPE '!' --    "%" SELECT * FROM Employees WHERE FirstName LIKE '%!_%' ESCAPE '!' --    "_"
      
      







文字列の完党な䞀臎を確認する堎合は、LIKEの代わりに、単に「=」蚘号を䜿甚するこずをお勧めしたす。



 SELECT * FROM Employees WHERE FirstName=''
      
      







メモぞ。

MS SQLでは、LIKE挔算子テンプレヌトで正芏衚珟を怜玢するこずもできたす;この挔算子の暙準機胜では䞍十分な堎合は、むンタヌネットでそれを読んでください。



ORACLEは、REGEXP_LIKE関数を䜿甚しお正芏衚珟で怜玢したす。





行に぀いお少し



Unicode文字の存圚に぀いお文字列をチェックする堎合、匕甚笊の前にN文字を眮く必芁がありたす。 N '...'。ただし、テヌブルにはすべおの文字フィヌルドがUnicode圢匏nvarchar型であるため、これらのフィヌルドには垞にこの圢匏を䜿甚できたす。䟋



 SELECT ID,Name FROM Employees WHERE Name LIKE N'%' SELECT ID,LastName FROM Employees WHERE LastName=N''
      
      







正しく行われた堎合、varchar型ASCIIのフィヌルドず比范する堎合、「...」を䜿甚しおチェックを䜿甚する必芁があり、nvarchar型Unicodeのフィヌルドず比范する堎合は、N「...」を䜿甚しおチェックを䜿甚する必芁がありたす。これは、ク゚リ実行䞭の暗黙的な型倉換を回避するために行われたす。フィヌルドに倀を挿入INSERTたたは曎新UPDATEするずきに同じルヌルを䜿甚したす。



文字列を比范するずき、デヌタベヌス構成照合に応じお、文字列は倧文字ず小文字を区別しない「ペトロフ」=「PETROV」の堎合たたは倧文字ず小文字を区別する「ペトロフ」<>の堎合ペトロフ '。

倧文字ず小文字を区別する蚭定の堎合、倧文字ず小文字を区別しない怜玢を行うには、たずえば、右匏ず巊匏を1぀の倧文字たたは小文字に予備倉換したす。



 SELECT ID,Name FROM Employees WHERE UPPER(Name) LIKE UPPER(N'%') --  LOWER(Name) LIKE LOWER(N'%') SELECT ID,LastName FROM Employees WHERE UPPER(LastName)=UPPER(N'') --  LOWER(LastName)=LOWER(N'')
      
      







日付に぀いお少し



日付を確認するずきは、文字列ず同様に、単䞀匕甚笊「...」を䜿甚できたす。



MS SQLの地域蚭定に関係なく、次の日付構文 'YYYYMMDD'幎、月、日をスペヌスなしでマヌゞを䜿甚できたす。そのようなMS SQLの日付圢匏は垞に理解したす



 SELECT ID,Name,Birthday FROM Employees WHERE Birthday BETWEEN '19800101' AND '19891231' --  80-  ORDER BY Birthday
      
      







堎合によっおは、DATEFROMPARTS関数を䜿甚しお日付を蚭定する方が䟿利です。



 SELECT ID,Name,Birthday FROM Employees WHERE Birthday BETWEEN DATEFROMPARTS(1980,1,1) AND DATEFROMPARTS(1989,12,31) ORDER BY Birthday
      
      







たた、同様の関数DATETIMEFROMPARTSがありたす。これは、日時を蚭定するのに圹立ちたすdatetime型の堎合。



文字列をdate型たたはdatetime型の倀に倉換する堎合は、CONVERT関数を䜿甚するこずもできたす。



 SELECT CONVERT(date,'12.03.2015',104), CONVERT(datetime,'2014-11-30 17:20:15',120)
      
      







倀104および120は、文字列で䜿甚される日付圢匏を瀺したす。怜玢で「MS SQL CONVERT」を蚭定するず、MSDNラむブラリですべおの有効な圢匏の説明を芋぀けるこずができたす。



MS SQLで日付を操䜜するための関数はたくさんありたす。「日付を操䜜するためのms sql関数」を探しおください。



ご泚意 SQL蚀語のすべおの方蚀には、日付を操䜜するための独自の関数セットがあり、日付を操䜜する独自のアプロヌチを適甚したす。




数字ずその倉換に぀いお少し



このセクションの情報は、おそらくITプロフェッショナルにずっおより圹立぀でしょう。あなたが1人ではなく、デヌタベヌスから必芁な情報を取埗するためのク゚リの曞き方を孊ぶこずが目暙である堎合、そのような埮劙なこずは必芁ないかもしれたせんが、いずれにしおもテキストをざっず読んで䜕かを考慮するこずができたす。 SQLの勉匷を始めたのであれば、すでにITに携わっおいたす。



CAST倉換関数ずは異なり、CONVERT関数では、倉換スタむルフォヌマットを担圓する3番目のパラメヌタヌを蚭定できたす。さたざたなタむプのデヌタに察しお、独自のスタむルセットを䜿甚できたす。これは、返される結果に圱響を䞎える可胜性がありたす。 CONVERT関数を䜿甚しお文字列を日付型および日付時刻型に倉換するこずを怜蚎する堎合、スタむルの䜿甚に぀いおは既に觊れたした。



CAST、CONVERT関数、およびスタむルの詳现に぀いおは、MSDNの「CASTおよびCONVERT関数Transact-SQL」を参照しおください。msdn.microsoft.com / en - us / library / ms187928.aspx



ここでは䟋を簡単にするために、Transact蚀語の指瀺を䜿甚したす。 SQL-DECLAREおよびSET。



もちろん、敎数を実数に倉換する堎合敎数ず実数の陀算の違いを瀺すために、このレッスンの冒頭で匕甚したした、倉換のニュアンスに関する知識はそれほど重芁ではありたせん。そこで、敎数を実数に倉換したしたその範囲は敎数の範囲よりはるかに倧きいです



 DECLARE @min_int int SET @min_int=-2147483648 DECLARE @max_int int SET @max_int=2147483647 SELECT -- (-2147483648) @min_int,CAST(@min_int AS float),CONVERT(float,@min_int), -- 2147483647 @max_int,CAST(@max_int AS float),CONVERT(float,@max_int), -- numeric(16,6) @min_int/1., -- (-2147483648.000000) @max_int/1. -- 2147483647.000000
      
      







おそらく1.で割るこずによっお埗られる暗黙的な倉換の方法を瀺す必芁はなかったでしょう。取埗する結果のタむプをさらに制埡するために、明瀺的な倉換を行うこずをお勧めしたす。ただし、小数点以䞋の指定桁数で数倀型の結果を取埗する堎合は、敎数倀に1.、1.0、1.00などを掛けおMS SQLでトリックを適甚できたす。



 DECLARE @int int SET @int=123 SELECT @int*1., -- numeric(12, 0) - 0    @int*1.0, -- numeric(13, 1) - 1  @int*1.00, -- numeric(14, 2) - 2  --       CAST(@int AS numeric(20, 0)), -- 123 CAST(@int AS numeric(20, 1)), -- 123.0 CAST(@int AS numeric(20, 2)) -- 123.00
      
      







堎合によっおは、倉換の詳现が非垞に重芁になるこずがありたす。たずえば、数倀の文字列varcharぞの倉換が行われる堎合、結果の正確性に圱響したす。money型ずfloat型の倀をvarcharに倉換する䟋を考えおみたしょう。



 --    money  varchar DECLARE @money money SET @money = 1025.123456789 --     1025.1235, ..  money   4    SELECT @money, -- 1025.1235 --   CAST  CONVERT    (..     0) CAST(@money as varchar(20)), -- 1025.12 CONVERT(varchar(20), @money), -- 1025.12 CONVERT(varchar(20), @money, 0), -- 1025.12 ( 0 -     2    (  )) CONVERT(varchar(20), @money, 1), -- 1,025.12 ( 1 -     2   ) CONVERT(varchar(20), @money, 2) -- 1025.1235 ( 2 -    4   )
      
      







 --    float  varchar DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 SELECT @float1, -- 1025.123456789 @float2, -- 1231025.12345679 --   CAST  CONVERT    (..     0) --  0 -   6 .       --    varchar      CAST(@float1 as varchar(20)), -- 1025.12 CONVERT(varchar(20), @float1), -- 1025.12 CONVERT(varchar(20), @float1, 0), -- 1025.12 CAST(@float2 as varchar(20)), -- 1.23103e+006 CONVERT(varchar(20), @float2), -- 1.23103e+006 CONVERT(varchar(20), @float2, 0), -- 1.23103e+006 --  1 -  8 .     . --    float     CONVERT(varchar(20), @float1, 1), -- 1.0251235e+003 CONVERT(varchar(20), @float2, 1), -- 1.2310251e+006 --  2 -  16 .     . --      CONVERT(varchar(30), @float1, 2), -- 1.025123456789000e+003 - OK CONVERT(varchar(30), @float2, 2) -- 1.231025123456789e+006 - OK
      
      







䟋からわかるように、特に文字列に蒞留するずき、たたはその逆の堎合、実際には倧きな浮動小数点゚ラヌが発生するこずがありたすたずえば、あるシステムから別のシステムにデヌタがテキストファむルで転送される堎合、さたざたな皮類の統合が可胜です 。



特定の文字4文字以䞊の粟床を明瀺的に制埡する必芁がある堎合は、デヌタを栌玍するために、decimal / numeric型を䜿甚した方がよい堎合がありたす。十分な4文字がある堎合、タむプmoneyを䜿甚できたす。これはおおよそ数倀20,4に察応したす。



 -- decimal  numeric DECLARE @money money SET @money = 1025.123456789 -- 1025.1235 DECLARE @float1 float SET @float1 = 1025.123456789 DECLARE @float2 float SET @float2 = 1231025.123456789 DECLARE @numeric numeric(28,9) SET @numeric = 1025.123456789 SELECT CAST(@numeric as varchar(20)), -- 1025.12345679 CONVERT(varchar(20), @numeric), -- 1025.12345679 CAST(@money as numeric(28,9)), -- 1025.123500000 CAST(@float1 as numeric(28,9)), -- 1025.123456789 CAST(@float2 as numeric(28,9)) -- 1231025.123456789
      
      







ご泚意

MS SQL 2008の時点では、以䞋を構築する代わりに䜿甚できたす。



 DECLARE @money money SET @money = 1025.123456789
      
      







より短い倉数初期化構文



 DECLARE @money money = 1025.123456789
      
      









第二郚の結論



このパヌトでは、基本的な構文に関する最も重芁な点を思い出しお反映しようずしたした。基本的な構造はバックボヌンであり、これがないず、SQL蚀語のより耇雑な構造の孊習を開始できたせん。



この資料が、SQL蚀語を孊習する最初の䞀歩を螏み出すのに圹立぀こずを願っおいたす。



この蚀語を孊習し、実践に移しおください。



パヌト3-habrahabr.ru/post/255825



All Articles