Transact-SQL(T-SQL)の概要
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
Transact SQL(T-SQL)の概要
SQLは、データベースの世界で使用される一般的な言語です。最新のRDBMS製品のほとんどは、主要なクエリ言語としてある種のSQLダイアレクトを使用しています。 SQLを使用して、データベースサーバー上のテーブルなどのオブジェクトを作成または破棄し、それらのオブジェクトへのデータの追加、編集、削除、またはオブジェクトからのデータの取得などのオブジェクトを操作できます。
Transact-SQL(T-SQL)は、Microsoftによって継承および開発されたT-SQLと呼ばれるSQLのバージョンであり、この言語は、データベースとの通信の標準化された方法を実装するために実装されています。
Transact-SQLは、データ型、一時オブジェクト、拡張ストアドプロシージャなどの機能を提供する強力な言語です。 Transact-SQLでは、スクロール可能なカーソル、条件付き処理、トランザクション制御、例外、およびエラー処理もサポートされています。
SQL Server 2019のT-SQLは、以前のバージョンよりもパフォーマンスを向上させ、機能を増やし、多くの高度な機能をサポートします。改善には、スカラー関数、ページネーション、順序付け、メタデータ割り当て、およびより優れたエラー処理サポートが含まれます…
以下の例はすべてAdventureWorks2019を使用しており、マシンにAdventureWorks2019をインストールして例をテストします。
以下のTransact-SQLステートメントについて考えてみます。これはSELECTステートメントであり、Employeeテーブルの「DesignEngineer」としてJobTitleを使用してemployeeテーブルのloginID列のデータを取得するために使用されます。
USE AdventureWorks2019 SELECT LoginID FROM HumanResources.Employee WHERE JobTitle = 'Design Engineer'
T-SQLには、ほとんどのステートメントで使用される、またはほとんどのステートメントに影響を与える多くの構文要素が含まれています。これらの要素には、データ型、述語、関数変数、式、フロー制御、コメント、およびバッチ区切り文字が含まれます。
T-SQLステートメントタイプのリスト
SQL Serverは、DDL、DML、およびDCLの3種類のT-SQLステートメントをサポートします。
データ定義言語(DDL)
RDBMSの一部であるDDLは、行レイアウト、列定義、主キー列、ファイルの場所、ストレージなど、データのすべてのプロパティを定義および管理するために使用されます。 DDLコマンドは、ビュートリガー、ストアドプロシージャなど、テーブルとオブジェクトの構造を構築および変更するために使用されます。オブジェクトごとに、キーワードCREATE 、 ALTER 、 DROPがあります。例: CREATE TABLE、ALTER TABLE、DROP TABLE
ほとんどのDDLステートメントは、次のように、object_nameがテーブル、ビュー、トリガー、ストアドプロシージャの名前である標準に準拠しています。
- CREATE object_name
- ALTER object_name
- DROP object_name
データ操作言語(DML)
DMLは、DDLで定義されたオブジェクト(オブジェクト)のデータを選択(取得)、挿入(追加)、更新(更新)、または削除(削除)するために使用されます。データベース内のすべてのユーザーは、データベースの操作でこれらのステートメントを使用できます。
次のキーワードを含むDMLステートメント:
- 選択する
- 入れる
- アップデート
- 消去
データ制御言語(DCL)
データはデータベースの重要な部分であるため、無効なユーザーがデータにアクセスできないことを確認するために適切な手順を実行する必要があります。データ制御言語は、データベースオブジェクトのアクセス許可を制御するために使用されます。権限は、GRANT、REVOKE、DENYステートメントを使用して制御されます。 DCLステートメントは、データベースを保護するためにも使用されます。 3つの基本的なDCLステートメントは次のとおりです。
- GRANT(割り当て)
- REVOKE(リコール)
- 拒否(拒否)
データ型
データ型は、含めることができるデータまたはオブジェクトの型を定義する属性です。列、パラメーター、変数、関数の戻りデータ値、および戻り値のあるsctoredプロシージャーには、データ型を指定する必要があります。 T-SQLには、varchar、text、intなどの多数のデータ型が含まれています。SQLServerに格納されるすべてのデータは、基本的なデータ型の1つと互換性がある必要があります。
オブジェクトには次のデータ型があります。
- 列(列)は、テーブルとビューで表されます
- ストアドプロシージャのパラメータ
- 変数(変数)
- 指定されたデータ型で1つ以上の値を返す関数
- 整数型のコードを返すストアドプロシージャ
SQL Serverは、次の3種類のデータ型をサポートしています。
システム定義のデータ型
このデータ型は、次の表に示すSQLServerによって提供されます。
カテゴリー | データ・タイプ | このデータ型の列 |
正確な数(正確な数/自然数) | int | 整数値を格納するために使用される4バイトのメモリを占有し、-2 ^ 31(-2,147,483,648)から2 ^ 31-1(2,147,483,647)までの値を格納できます |
smallint | 2バイトのメモリを占有し、-32.768から32m.767までの整数値を格納できます | |
tinyint | 1バイトのメモリを占有し、0から255までの値を含みます | |
bigint | 8バイトのメモリを使用します。 -2^63から2^63-1までのデータを保持します | |
ナンバーニック | 固定の精度とスケールがあります | |
お金 | 8バイトのメモリスペースを占有します。 -2^63/1000と2^63-1の間の通貨データ値を表します | |
おおよその数(概数/実数) | 浮く | 8バイトのメモリを占有します。 -1.79E+308から1.79E+38までの浮動小数点後の数値表現 |
本物 | 4バイトのメモリを占有します。 -3.40E+38から3.40E+38までの浮動小数点後の数値を表します | |
日時 | 日付時刻 | 日時を表し、メモリ内で8バイトを占有します(4バイトの2倍-整数) |
smalldatetime | 日時パフォーマンス | |
文字列 | char | 指定された長さと非Unicodeの文字データを格納します |
varchar | 最大8,000文字の可変長および非Unicode文字データを格納します | |
文章 | 最大長が2^31-1(2,147,483,647)文字の可変長および非Unicode文字データを格納します | |
nchar | 指定された長さのUnicode文字を格納します | |
nvarchar | 可変Unicode文字データを格納します。 | |
その他のデータ型 | タイムスタンプ | 8バイトのメモリを使用します。保存された値は自動的に生成され、一意の2進数値が生成され、リアルタイムのUNIXタイムスタンプシミュレーションデータベースに保存されます。 |
バイナリ(n) | 最大8000バイトの指定された長さのバイナリデータを格納します。 | |
varbinary(n) | 最大8000バイトの可変長のバイナリデータを格納します。 | |
画像 | 最大長が2^30-1(1,073,741,823)バイトの可変バイナリ値を格納します。 | |
uniqueidentifier | 16バイトのメモリを占有すると、グローバル一意識別子(GUID)である一意の値が自動的に生成されます |
エイリアスデータ型(エイリアスデータ型)
これらのデータ型は、システムによって提供されるデータ型に基づいています。エイリアスデータ型は、複数のテーブルが同じデータ型を列に格納し、長さ、null可能性、データ型などの類似した特性を持つ場合に使用されます。このような場合、これらすべてのテーブルで普遍的に使用できるエイリアスデータ型を作成できます。
エイリアスデータ型は、CREATETYPEステートメントを介して作成できます。 CREATETYPEステートメントの構文は次のとおりです。
CREATE TYPE [schema_name.]type_name FROM base_type [NULL/NOTNULL];
例えば:
CREATE TYPE usertype from varchar(20) NOT NULL
ユーザー定義タイプ
ユーザーは、.NETFrameworkでサポートされているプログラミング言語を使用して独自のデータ型を定義できます。
Transact-SQL言語要素
Transact-SQL言語要素はSQLServer2019で使用され、SQLServerデータベースにインポートされたデータを処理します。 Transact-SQL言語要素には、述語、演算子、変数、関数、式、フローの制御、エラー(エラー)、トランザクション、コメント、バッチ区切り文字が含まれます。
述語(述語)
述語は、式がTRUE、FALSE、またはUNKNOWNを返すかどうかを評価するために使用される論理式として理解できます。
Transact-SQ1の句は、次の場合に使用されます。
- 指定された値がサブクエリまたはリストのいずれかの値と一致するかどうかを判別します
- チェックする値の範囲を指定します
- 指定されたパターンの文字を照合するために使用されます
- 単一の単語やフレーズ、互いに一定の距離内にある単語、または加重一致との完全一致または非正確一致を検索します
述語句の例:
述語 | 例えば |
印刷 | SELECT PersonType、Title、FirstName、LastName FROM AdventureWorks2019.Person.Person WHERE PersonType IN(’EM’、’SC’) |
の間に | SELECT BusinessEntityID、NationalIDNumber、LoginID、JobTitle、HireDate FROM AdventureWorks2019.HumanResources.Employee WHERE HireDate BETWEEN ’01 -01-2010′ AND ’01 -01-2013′ |
お気に入り | SELECT DepartmentID、Name、GroupName、ModifiedDate FROM AdventureWorks2019.HumanResources.Department WHERE Name LIKE’P%’ |
含む | SELECT * FROM AdventureWorks2019.Person.Address WHERE CONTAINS(AddressLine1、’Street’) |
オペレーター(オペレーター)
演算子は、算術、比較、連結、または値の割り当てを実行するために使用されます。たとえば、データをチェックして、顧客データのCOUNTRY列にデータが入力されている(またはNOT NULL値がある)ことを確認できます。クエリでは、オペレーターを必要とするテーブル内のデータを見ることができる人なら誰でも操作を実行できます。データを正常に変更するには、適切な権限が必要です。 SQL Serverには、次の7種類の演算子があります。
オペレーター | 説明 | 例 |
比較 | 式の値を別の値と比較します | =、<、>、> =、<=、!= ,!> |
論理的 | 条件の真の(論理的な)結果を確認する | AND、OR、NOT |
算術 | 足し算、引き算、掛け算、割り算などの算術演算を実行します | +、-、*、/、% |
連結 | 2つのチェーンを1つのストリングに結合します | + |
割り当て | 変数に値を割り当てます | = |
演算子の優先順位:
注文 | オペレーター |
最初 | ()括弧 |
2 | *、/、% |
3 | +、- |
4 | =、<、>、> =、<=、!=、!> |
5 | いいえ |
6 | と |
7 | BETWEEN、IN、CONTAINS、LIKE、または |
8 | = |
演算子の優先順位の例:
DECLARE @Number int; SET @Number = 2 + 2 * (4 + (5 - 3)) SELECT @Number
結果には14が表示され、実行順序は次のようになります。
1. 2 + 2*(4+(5-3)) 2. 2 + 2*(4+2) 3. 2 + 2*6 4. 2 + 12 5. 14
機能(機能)
関数はステートメントのセットであり、T-SQLステートメントは、データの計算または操作に非常に役立つ関数のセットで構成されています。 SQLでは、関数はデータを処理し、データをグループ化して要求された値を返し、SELECT句を使用して式から返されたデータを取得できます。
SQL Serverには、次の4種類の関数があります。
行セット関数
transact-SQLでは、rowet関数を使用して、テーブル参照の代わりに使用できるオブジェクトを返します。たとえば、OPENDATASOURCE、OPENQUERY、OPENROWSET、およびOPENXMLは行セット関数です。
集計関数
T-SQLは、SUM、MIN、MAX、AVG、COUNT、COUNTBIGなどの大量のデータの要約をサポートする一連の関数を提供します。
ランキング機能
配列の作成、序数の生成、ランクの検索などの多くのタスクの処理は、ランク付け関数を使用することで、より簡単かつ迅速に実行できます。たとえば、RANK、DENSE_RANK、NTILE、ROW_NUMBERはランキング関数です。
スカラー関数
スカラー関数では、入力は単一の値であり、出力も単一の値です
SQLのいくつかのスカラー関数:
関数型 | 説明 | 例_ |
変換機能 | 変換関数は、あるデータ型の値を別のデータ型に変換するために使用されます。さらに、特別な日付形式を取得するために使用できます。 | 変換 |
日付と時刻の機能 | 日時関数は、時刻の計算に役立つ日時データを処理するために使用されます | GETDATE、SYSDATETIME、GETUTCDATE、DATEADD、DATEDIFF、YEAR、MONTH、DAY |
数学関数 | 数学関数は、数値に対して代数演算を実行します。 | ランド、ラウンド、パワー、ABS、セリング、フロア |
システム機能 | SQL Serverは、メタデータまたは構成設定を返すシステム関数を提供します | HOST_ID、HOST_NAME、ISNULL |
文字列関数 | 文字列関数は、charやnvarcharなどの入力を処理するために使用されます。出力は文字列または数値にすることができます | SUBSTRING、LEFT、RIGHT、LEN、DATALENGTH、REPLACE、REPLICATE、UPPER、LOWER、RTRIM、LTRIM |
SQL Serverには、カーソル関数、論理関数、メタデータ関数、セキュリティ関数など、他にもいくつかのスカラー関数があります。
変数(変数)
変数は、データ値を格納できるオブジェクトです。 T-SQLでは、変数をローカル変数とグローバル変数に分けることができます。
T-SQLでは、ローカル変数が作成され、SQLステートメントの実行時に一時ストレージとして使用されます。データは、ローカル変数を介してSQLステートメントを介して渡すことができます。ローカル変数の名前には、常にキーワード「@」が接頭辞として付けられます。
例えば:
DECLARE @Search NVARCHAR(30) SET @Search = N'hello'
以前のバージョンのSQLServerには、グローバル変数と呼ばれる概念が存在しました。これは、システムによって定義および維持される組み込み変数を指します。 SQL Server 2019では、置換は関数として分類されます。それらの前には2つの「@」記号が付いています。これらの関数の戻り値は、単純なSELECTクエリで取得できます。
例えば
SELECT @@LANGUAGE as 'Language'
SQLServerで使用される言語を返します
遭遇する可能性のある機能のいくつか:
- @@ DATEFIRST
- @@言語
- @@ LOCK_TIMEOUT
- @@ MAX_CONNECTIONS
- @@サーバー名
- @@バージョン
式(式)
式は、SQL Serverが結果を得るために評価できる識別子、値、および演算子の組み合わせです。式は、データにアクセスしたり変更したりするときに、さまざまな場所で使用できます。
SELECT句を組み合わせて、現在の年を取得し、次の年を計算する式の例
USE AdventureWorks2019 SELECT SalesOrderID, CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate) AS CurrentYear, YEAR(OrderDate) + 1 AS NextYear FROM Sales.SalesOrderHeader
フロー、エラー、トランザクションの制御
transact-SQLは主にデータアクセス言語ですが、実行およびエラー検出のためのフローの制御をサポートします。フローの制御は、transact-SQLステートメント、コードのブロック、ユーザー定義関数、およびストアプロシージャの実行フローを定義します。
T-SQLのフローの一般的な制御
制御構造ステートメント | 説明 |
IF … ELSE | 論理条件に基づく分岐制御 |
その間 | テスト条件が真である間、コマンドまたはステートメントのブロックを繰り返します |
BEGIN … END | T-SQLブロックのスコープ定義 |
試してください…キャッチ | 例外およびエラー処理の構造定義 |
トランザクションの開始 | 明示的なトランザクションの一部としてステートメントのブロックをマークします |
T-SQLでIFELSEを使用する例:
IF DATENAME(weekday, GETDATE()) IN (N'Saturday',N'Sunday') SELECT 'It is a Weekend'; ELSE SELECT 'It is Weekday';
コメント
コメントは、コンパイラによって無視されるプログラムコード内の説明テキストの文字列(コメントとも呼ばれます)です。コメントは、ステートメントのソースコード、コードブロック、またはストアドプロシージャ内に挿入できます。コメントは、プログラムの目的、特別な実行条件を説明し、改訂履歴情報を提供します。構文:
-- Day la comment inline -- Day la comment inline /*day la comment khoi lenh*/
バッチセパレーター
バッチは、1回のアプリケーション実行で送信される1つ以上のT-SQLステートメントのセットです。バッチ内のT-SQLのステートメントは、実行プランと呼ばれる実行単位(1回の実行)に再パッケージ化されます。バッチ内で命令セットを実行するプロセスは、バッチ処理と呼ばれます。
バッチセパレータは、コマンドを実行するためにSSMSなどのSQLServerクライアントツールによって制御されます。たとえば、GOをSSMSのバッチセパレータとして定義します。
バッチセパレーターの例:
USE AdventureWorks2019 SELECT * FROM HumanResources.Employee GO -- cau lenh tiep theo
セットと述語論理(セットと述語論理)
セットと述語論理は、SQL Server 2019で使用される2つの数学的基礎です。これらの理論は両方とも、SQLSever2019でデータをクエリするために使用されます。
集合論(集合論)
集合論は、リレーショナルデータベースモデルで使用される数学的基礎です。セットは、全体として考慮される個別のオブジェクトのコレクションです。たとえば、Employeeテーブル内のすべての従業員はセットと考えることができます。
集合論アプリケーション | SQLServerクエリのアプリケーション |
セット全体を一度に操作する | テーブル全体を一度にクエリする |
セットベースの処理と宣言 | SQL Serverのプロパティを使用して、特定のデータを取得します |
セット内の要素は一意である必要があります | テーブルの一意のキーを定義します |
並べ替え手順はありません | クエリの結果はどの順序でも取得されません |
集合演算子の1つはINTERSECT演算子です。左と右の両方の入力クエリ演算子によって生成された個別の行を返します。
INTERSECTの使用例:
USE AdventureWorks2019 GO SELECT ProductID FROM Production.Product INTERSECT SELECT ProductID FROM Production.WorkOrder;
述語論理(述語論理)
ロジック述語の概念については、こちらをご覧ください:https: //en.wikipedia.org/wiki/Logic_b%E1%BA%ADc_nh%E1%BA%A5t
述語論理は、結果を与える論理テストで構成される数学的フレームワークです。結果は常にtrueまたはfalseとして表示されます。 T-SQLでは、WHERE式やCASE式などの式は述語論理に基づいています。述語論理は、T-SQLの他の状況でも使用されます
T-SQLのいくつかの述語論理は次のとおりです。
- CHECK制約を使用してデータの機密性を強化する
- IFステートメントを使用したフロー制御
- ONを使用してテーブルを結合します。
- WHERE句とHAVING.句を使用してクエリ内のデータをフィルタリングする
- CASEの条件付きロジックを提供します。式
- サブクエリを定義する
SELECT.ステートメント内の演算子の論理的順序
さまざまなSQLServer要素の構文に加えて、SQLServerユーザーはクエリ全体がどのように実行されるかも知っている必要があります。このプロシージャは、クエリを中断し、事前定義された順序でクエリを実行する論理プロセスです。 SELECTステートメントは、クエリを実行する論理プロセスを説明するために使用されるクエリです。
SELECTステートメントの構文:
SELECT <select list> FROM <table source> WHERE <search condition> GROUP BY <group by list> HAVING <search condition> ORDER BY <order by list>
SELECTステートメントの要素の説明:
エレメント | 説明 |
SELECT<リストの選択> | 取得する列を定義します |
FROM<テーブルソース> | 照会されたテーブルの定義 |
WHERE<検索条件> | 述語で行をフィルタリングする |
GROUPBY<リストによるグループ化> | グループで行を並べ替える |
HAVING<検索条件> | 述語でグループをフィルタリングする |
ORDERBY<リストで注文> | 出力を並べ替えます。 |
以下の例を検討してください。
USE AdventureWorks2019 SELECT SalesPersonID,YEAR(OrderDate) AS OrderYear FROM Sales.SalesOrderHeader WHERE CustomerID=30084 GROUP BY SalesPersonID, YEAR(OrderDate) HAVINg COUNT(*) > 1 ORDER BY SalesPersonID,OrderYear;
上記の例では、SELECTステートメントの実行シーケンスは次のとおりです。
- FROM句が評価され、クエリ対象のソーステーブルが決定されます
- WHERE句は、WHERE句の後に記載されている述語によって定義されるソーステーブルの行をフィルタリングするために評価されます。
- 次に、GROUPBY句が評価されます。この句は、WHERE。句でフィルタリングされたデータを並べ替えます。
- HAVING句が評価されます
- SELECT句を実行して、同じクエリ結果を出力する列を指定します
- 最後に、ORDER BYステートメントを実行して、出力を表示します。
USE AdventureWorks2019 -- thu tu thuc thi cua cau lenh select 5.SELECT SalesPersonID,YEAR(OrderDate) AS OrderYear FROM 1.Sales.SalesOrderHeader 2.WHERE CustomerID=30084 3.GROUP BY SalesPersonID, YEAR(OrderDate) 4.HAVINg COUNT(*) > 1 6.ORDER BY SalesPersonID,OrderYear;