SQLプログラミング言語の構文は、 ISO/IEC 9075の一部としてISO/IEC SC 32によって定義および維持されています。この規格は無料で入手できるものではありません。規格が存在するにもかかわらず、SQLコードは調整なしに異なるデータベースシステム間で完全に互換性があるとは限りません。
SQL言語は、以下のようないくつかの言語要素に細分化されます。
SELECT、COUNTおよびYEAR) と非予約語 (例: ASC、DOMAINおよび) があります。SQL予約語KEYの一覧。YEARとして指定されます"YEAR"。 スカイライン演算子(他のどの行よりも「劣っていない」行のみを見つけるための演算子)など、他の演算子が提案または実装されたこともあります。
SQLには、 SQL-92caseで導入された式があります。最も一般的な形式は、SQL標準では「検索ケース」と呼ばれています。
CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' ENDSQL は、WHENソースに記述されている順序で条件をテストします。ソースで式が指定されていない場合ELSE、SQL はデフォルトで をELSE NULL使用します。また、「単純ケース」と呼ばれる省略構文も使用できます。
CASE n WHEN 1 THEN 'One' WHEN 2 THEN 'Two' ELSE 'I cannot count that high' ENDこの構文は暗黙的な等価比較を使用しますが、NULL との比較に関する通常の注意点があります。
CASE特殊表現には 2 つの短縮形があります:COALESCEとNULLIF。
このCOALESCE式は、左から右に調べて最初に見つかったNULL以外のオペランドの値を返します。すべてのオペランドがNULLの場合はNULLを返します。
COALESCE ( x1 , x2 )は以下と同等です。
CASE WHEN x1 IS NOT NULL THEN x1 ELSE x2 ENDこのNULLIF式は2つのオペランドを持ち、オペランドの値が同じ場合はNULLを返し、そうでない場合は最初のオペランドの値を返します。
NULLIF ( x1 , x2 )と同等
CASE WHEN x1 = x2 THEN NULL ELSE x1 END標準SQLでは、コメントに2つの形式が認められています。1-- commentつは最初の改行で終了する形式、/* comment */もう1つは複数行にわたる形式です。
SQL で最も一般的な操作であるクエリは、宣言SELECT文を使用します。クエリは、 SELECT1 つ以上のテーブルまたは式からデータを取得します。標準のステートメントは、データベースに永続的な影響を与えません。一部のデータベースで提供されている構文など、SELECT非標準の実装は永続的な影響を与える場合があります。 [ 2 ]SELECTSELECT INTO
クエリを使用すると、ユーザーは必要なデータを記述でき、データベース管理システム(DBMS)は、その結果を生成するために必要な計画、最適化、および物理的な操作を、DBMSが選択した方法で実行します。
クエリには、最終結果に含める列のリストが含まれ、通常はSELECTキーワードの直後に続きます。アスタリスク(" *")、または「ワイルドカード」を使用すると、クエリがクエリ対象テーブルのすべての列を返すように指定できます。SELECTは、SQLで最も複雑なステートメントであり、オプションのキーワードと句には以下が含まれます。
FROMデータを取得するテーブルを示す句。[ 3 ]: 400この句には、テーブルを結合するためのルールを指定するFROMオプションのサブ句を含めることができます。JOINWHERE句には、クエリによって返される行を制限する条件が含まれています。この句は、条件が真と評価されないすべての行を結果セットWHEREから除外します。 [ 3 ] : 402GROUP BY句は、共通の値を持つ行をより小さな行のセットに投影します。は、SQL 集計関数と組み合わせて使用したり、結果セットから重複行を削除したりするためによく使用されます。 この句は、 句の前に適用されます。GROUP BYWHEREGROUP BYHAVING句には、句の結果として得られる行をフィルタリングするために使用される述語が含まれていますGROUP BY。この述語は句の結果に対して作用するためGROUP BY、集計関数を句の述語内で使用できますHAVING。ORDER BY句は、結果データをソートするために使用する列と、ソート方向(昇順または降順)を指定します。このORDER BY句がない場合、SQLクエリによって返される行の順序は定義されません。DISTINCTキーワードは重複データを排除します。[ 4 ]OFFSET句は、データの返送を開始する前にスキップする行数を指定します。FETCH FIRST句は、返される行数を指定します。一部の SQL データベースでは、代わりにLIMIT、TOPやなどの非標準の代替手段がありますROWNUM。クエリの句には特定の実行順序があり、[ 5 ]右側の数字で示されます。それは次のとおりです。
次のSELECTクエリ例は、高価な書籍のリストを返します。このクエリは、Bookテーブルから、価格列の値が 100.00 より大きいすべての行を取得します。結果は、タイトルの昇順でソートされます。選択リストのアスタリスク (*) は、Bookテーブルのすべての列を結果セットに含める必要があることを示しています。
SELECT * FROM Book WHERE price > 100.00 ORDER BY title ;以下の例は、複数のテーブルに対するクエリ、グループ化、および集計を行い、書籍のリストと各書籍に関連付けられた著者の数を返す方法を示しています。
SELECT Book.title AS Title , count ( * ) AS Authors FROM Book JOIN Book_author ON Book.isbn = Book_author.isbn GROUP BY Book.title ;出力例は以下のようになるでしょう。
タイトル 著者 ---------------------- ------- SQLの例とガイド4 SQLの楽しさ 1 SQL入門2 SQLの落とし穴 1
isbn が2 つのテーブルに共通する唯一の列名であり、 titleという名前の列はBookテーブルにのみ存在するという前提条件の下では、上記のクエリを次の形式で書き直すことができます。
SELECT title , count ( * ) AS Authors FROM Book NATURAL JOIN Book_author GROUP BY title ;しかし、多くのベンダーはこのアプローチをサポートしていないか、自然結合を効果的に機能させるために特定の列命名規則を要求します。
SQLには、格納された値に対して値を計算するための演算子と関数が含まれています。SQLでは、次の例のように、 SELECTリストで式を使用してデータを投影することができます。この例では、価格が100.00を超える書籍のリストが返され、さらに価格の6%で計算された売上税額を含むsales_tax列が追加されます。
SELECT isbn , title , price , price * 0 . 06 AS sales_tax FROM Book WHERE price > 100 . 00 ORDER BY title ;クエリはネストできるため、あるクエリの結果を関係演算子または集計関数を介して別のクエリで使用できます。ネストされたクエリはサブクエリとも呼ばれます。結合やその他のテーブル操作は多くの場合、計算効率に優れた(つまり高速な)代替手段となりますが、サブクエリを使用すると、実行時に階層構造が導入され、それが有用または必要となる場合があります。次の例では、集計関数はAVG入力としてサブクエリの結果を受け取ります。
SELECT isbn , title , price FROM Book WHERE price < ( SELECT AVG ( price ) FROM Book ) ORDER BY title ;サブクエリは外部クエリの値を使用できます。この場合、相関サブクエリと呼ばれます。
1999年以降、SQL標準ではWITHサブクエリ、つまり名前付きサブクエリ(通常は共通テーブル式(サブクエリファクタリングとも呼ばれる))の句が認められています。CTEは自身を参照することで再帰的にもなり得ます。この仕組みにより、ツリーやグラフの走査(リレーションとして表現した場合)、そしてより一般的には不動点計算が可能になります。
派生テーブルとは、FROM句でSQLサブクエリを参照する機能のことです。基本的に、派生テーブルは選択または結合できるサブクエリです。派生テーブル機能を使用すると、サブクエリをテーブルとして参照できます。派生テーブルは、インラインビューまたはサブセレクトと呼ばれることもあります。
次の例では、SQL文は元の「Book」テーブルと派生テーブル「sales」の結合を含んでいます。この派生テーブルは、ISBNを使用して「Book」テーブルと結合することで、関連する書籍の販売情報を取得します。その結果、派生テーブルは、追加の列(販売されたアイテム数と書籍を販売した会社)を含む結果セットを提供します。
SELECT b.isbn , b.title , b.price , sales.items_sold , sales.company_nm FROM Book b JOIN ( SELECT SUM ( Items_Sold ) Items_Sold , Company_Nm , ISBN FROM Book_Sales GROUP BY Company_Nm , ISBN ) sales ON sales.isbn = b.isbnNullの概念により、SQL はリレーショナル モデルにおける欠落情報を処理できます。この単語NULLは SQL の予約語であり、Null 特殊マーカーを識別するために使用されます。WHERE 句での等号 (=) など、Null との比較は、真偽値 Unknown を返します。SELECT 文では、SQL は WHERE 句が True を返す結果のみを返します。つまり、値が False の結果と、値が Unknown の結果は除外されます。
真と偽に加えて、Null との直接比較から生じる不明も、3 値論理の断片をSQL にもたらす。SQL が AND、OR、NOT に使用する真理値表は、クリーネとルカシェヴィッチの 3 値論理の共通の断片に対応する (ただし、含意の定義は異なるが、SQL ではそのような演算は定義されていない)。[ 6 ]
しかし、直接比較以外でのNULLの扱い方から、SQLにおけるNULLの意味論的解釈については議論があります。上の表に示すように、SQLで2つのNULLを直接等価比較すると(例NULL = NULL:)、真偽値はUnknownになります。これは、NULLには値がなく(どのデータドメインにも属さない)、欠落した情報のプレースホルダーまたは「マーク」であるという解釈と一致しています。しかし、2つのNULLが等しくないという原則は、NULL同士を識別するSQLのUNIONand演算子の仕様で事実上破られています。 [ 7 ]その結果、SQLのこれらの集合演算は、 NULLとの明示的な比較を含む演算(上記で説明した句の演算など)とは異なり、確実な情報を表さない結果を生成する可能性があります。Coddの1979年の提案(基本的にSQL92で採用された)では、集合演算における重複の削除は「検索操作の評価における等価性テストよりも低いレベルで行われる」と主張することで、この意味論的矛盾を合理化しています。[ 6 ]しかし、コンピュータサイエンス教授のロン・ファン・デル・メイデンは、「SQL標準の矛盾により、SQLにおけるヌル値の扱いに直感的な論理的意味論を割り当てることは不可能である」と結論付けた。[ 7 ]INTERSECTWHERE
さらに、SQL 演算子は、何かを直接 Null と比較すると Unknown を返すため、SQL は 2 つの Null 固有の比較述語を提供します。IS NULLと はIS NOT NULL、データが Null であるかどうかをテストします。[ 8 ] SQL は全称量化を明示的にサポートしていないため、否定された存在量化として処理する必要があります。[ 9 ] [ 10 ] [ 11 ]また、中置比較演算子もあり<row value expression> IS DISTINCT FROM <row value expression>、両方のオペランドが等しいか、両方が NULL でない限り TRUE を返します。同様に、IS NOT DISTINCT FROM は として定義されますNOT (<row value expression> IS DISTINCT FROM <row value expression>)。SQL :1999では、標準によれば null 許容であれば Unknown 値も保持できるデータ型も導入されましたBOOLEAN。実際には、多くのシステム ( PostgreSQLなど) が BOOLEAN Unknown を BOOLEAN NULL として実装しており、標準では NULL BOOLEAN と UNKNOWN は「まったく同じ意味を表すために互換的に使用できる」とされています。[ 12 ] [ 13 ]
データ操作言語(DML)は、データの追加、更新、削除に使用されるSQLのサブセットです。
INSERT INTO example ( column1 , column2 , column3 ) VALUES ( 'test' , 'N' , NULL );UPDATEの例SET column1 = 'updated value' WHERE column2 = 'N' ;DELETE FROM example WHERE column2 = 'N' ;MERGE INTO table_name USING table_reference ON ( condition ) WHEN MATCHED THEN UPDATE SET column1 = value1 [ , column2 = value2 ... ] WHEN NOT MATCHED THEN INSERT ( column1 [ , column2 ... ] ) VALUES ( value1 [ , value2 ... ] )トランザクションが利用可能な場合は、DML操作をラップします。
START TRANSACTION(またはBEGIN WORK、 SQL の方言によっては、)はデータベース トランザクションBEGIN TRANSACTIONの開始を示し、完全に完了するか、まったく完了しないかのどちらかです。SAVE TRANSACTION(またはSAVEPOINT)トランザクションの現在の時点でのデータベースの状態を保存しますCREATE TABLE tbl_1 ( id int ); INSERT INTO tbl_1 ( id ) VALUES ( 1 ); INSERT INTO tbl_1 ( id ) VALUES ( 2 ); COMMIT ; UPDATE tbl_1 SET id = 200 WHERE id = 1 ; SAVEPOINT id_1upd ; UPDATE tbl_1 SET id = 1000 WHERE id = 2 ; ROLLBACK to id_1upd ; SELECT id from tbl_1 ;COMMITトランザクション内のすべてのデータ変更を永続化します。ROLLBACK前回COMMITまたは以降のすべてのデータ変更を破棄しROLLBACK、変更前のデータ状態に戻します。COMMITステートメントが完了すると、トランザクションの変更はロールバックできません。COMMITそして、ROLLBACK現在のトランザクションを終了し、データロックを解放します。 または同様のステートメントがない場合START TRANSACTION、SQL のセマンティクスは実装に依存します。次の例は、あるアカウントからお金が引き出され、別のアカウントに追加される、典型的な資金移動トランザクションを示しています。引き落としまたは追加のいずれかが失敗した場合、トランザクション全体がロールバックされます。
トランザクション開始;アカウント番号が1234の場合、アカウントの金額をamount - 200に更新;アカウント番号が2345の場合、アカウントの金額をamount + 200に更新;エラーが0の場合はコミット、エラーが0でない場合はロールバック。データ定義言語(DDL)は、テーブルとインデックスの構造を管理します。DDLの最も基本的な要素はCREATE、、、、およびステートメントです。ALTERRENAMEDROPTRUNCATE
CREATEデータベース内にオブジェクト(例えばテーブル)を作成します。例:CREATE TABLE example ( column1 INTEGER , column2 VARCHAR ( 50 ), column3 DATE NOT NULL , PRIMARY KEY ( column1 , column2 ) );ALTER既存のオブジェクトの構造をさまざまな方法で変更します。たとえば、既存のテーブルに列を追加したり、制約を追加したりします。例:ALTER TABLE example ADD column4 INTEGER DEFAULT 25 NOT NULL ;TRUNCATEテーブル内のすべてのデータを非常に高速に削除します。テーブル自体ではなく、テーブル内のデータのみを削除します。通常、後続の COMMIT 操作を伴うため、ロールバックはできません (DELETE とは異なり、後でロールバックするためのログへのデータ書き込みは行われません)。TRUNCATE TABLE の例;DROPデータベース内のオブジェクトを削除します。通常は復元不可能で、ロールバックできません。例:DROP TABLEの例;SQL テーブルの各列は、その列が格納できる型を宣言します。ANSI SQL には、次のデータ型が含まれます。[ 14 ]
CHARACTER(n)(または):必要に応じてスペースで埋められた、固定幅のn文字の文字列CHAR(n)CHARACTER VARYING(n)(または):最大サイズがn文字の可変長文字列VARCHAR(n)CHARACTER LARGE OBJECT(n[K|M|G|T])(または):最大サイズn [K|M|G|T]文字のラージオブジェクトCLOB(n[K|M|G|T])NATIONAL CHARACTER(n)(または):国際文字セットをサポートする固定幅文字列NCHAR(n)NATIONAL CHARACTER VARYING(n)(または):可変長文字列NVARCHAR(n)NCHARNATIONAL CHARACTER LARGE OBJECT(n[K|M|G|T])(または):最大サイズn [K|M|G|T]文字の国家文字ラージオブジェクトNCLOB(n[K|M|G|T])CHARACTER LARGE OBJECTおよびデータ型の場合NATIONAL CHARACTER LARGE OBJECT、乗数K(1024 )、M(1 048 576 )、G(1 073 741 824 ) およびT(長さを指定する際に、オプションで1 099 511 627 776を使用できます。
BINARY(n): 固定長バイナリ文字列、最大長n。BINARY VARYING(n)(または):可変長バイナリ文字列、最大長n。VARBINARY(n)BINARY LARGE OBJECT(n[K|M|G|T])(または):最大長n [K|M|G|T]のバイナリラージオブジェクト。BLOB(n[K|M|G|T])データ型の場合BINARY LARGE OBJECT、乗数K(1024 )、M(1 048 576 )、G(1 073 741 824 ) およびT(長さを指定する際に、オプションで1 099 511 627 776を使用できます。
BOOLEANデータBOOLEAN型は値TRUEとを格納できますFALSE。
INTEGER(またはINT)、SMALLINTそしてBIGINTFLOAT、REALそしてDOUBLE PRECISIONNUMERIC(precision, scale)またはDECIMAL(precision, scale)DECFLOAT(precision)例えば、数値 123.45 は精度が 5、スケールが 2 です。精度は、特定の基数 (2 進数または 10 進数) における有効桁数を決定する正の整数です。スケールは非負の整数です。スケールが 0 の場合、数値は整数であることを示します。スケール S の 10 進数の場合、正確な数値は、有効桁の整数値を 10 Sで割った値です。
CEILINGSQLには、FLOOR数値の丸めを行うための関数が用意されています。(よく使われるベンダー固有の関数としてはTRUNC、Informix、DB2、PostgreSQL、Oracle、MySQL、ROUNDInformix、SQLite、Sybase、Oracle、PostgreSQL、Microsoft SQL Server、Mimer SQLなどがあります。)
DATE: 日付値の場合 (例2011-05-03)。TIME: 時間値の場合 (例15:51:36)。TIME WITH TIME ZONE: と同じですTIMEが、該当するタイムゾーンに関する詳細情報が含まれています。TIMESTAMPこれは、DATEと をTIME1 つの値にまとめたものです (例2011-05-03 15:51:36.123456)。TIMESTAMP WITH TIME ZONE: と同じですTIMESTAMPが、該当するタイムゾーンに関する詳細情報が含まれています。SQL関数は、EXTRACT日時または間隔値から単一のフィールド(例えば秒数)を抽出するために使用できます。データベースサーバーの現在のシステム日時は、、、、などの関数を使用して呼び出すことができます。(よくCURRENT_DATE使われるベンダー固有の関数は、、、、、、、、、、、およびです。)CURRENT_TIMESTAMPLOCALTIMELOCALTIMESTAMPTO_DATETO_TIMETO_TIMESTAMPYEARMONTHDAYHOURMINUTESECONDDAYOFYEARDAYOFMONTHDAYOFWEEK
YEAR(precision)数年YEAR(precision) TO MONTH数年と数ヶ月MONTH(precision)数ヶ月DAY(precision)数日間DAY(precision) TO HOUR: 日数と時間DAY(precision) TO MINUTE日数、時間、分DAY(precision) TO SECOND(scale)日、時間、分、秒の数HOUR(precision)数時間HOUR(precision) TO MINUTE: 時間と分HOUR(precision) TO SECOND(scale)時間、分、秒の数MINUTE(precision): 分数MINUTE(precision) TO SECOND(scale)分と秒の数データ制御言語(DCL)は、ユーザーがデータにアクセスして操作することを許可します。主なステートメントは次の2つです。
GRANTオブジェクトに対して、1人または複数のユーザーが操作または一連の操作を実行することを許可します。REVOKEデフォルトの助成金である可能性のある助成金を削除します。例:
GRANT SELECT , UPDATE ON example TO some_user , another_user ;REVOKE SELECT , UPDATE ON example FROM some_user , another_user ;[...]キーワードDISTINCT[...]は結果セットから重複を削除します。