Tracks
T-SQL(Transact-SQL)は、標準SQLをMicrosoftが拡張したもので、Microsoft SQL Serverでの利用に特化して設計されています。データのクエリや管理に必要なSQLの中核機能をすべて備えつつ、T-SQLは手続き型プログラミングの機能を追加し、より強力で動的なデータベースロジックを記述できるようにします。
本ガイドでは、T-SQLの仕組みと、実務で効果的に使う方法を紹介します。データベースのクエリ、ストアドプロシージャの作成、日常的なワークフローの自動化といった一般的なユースケースも、実用的な例とともに取り上げます。
SQLが初めての場合は、まずはIntroduction to SQLコースから始めてください。ある程度の経験がある場合はIntermediate SQLコースがおすすめです。また、ダウンロードできるSQL Basics Cheat Sheetは、よく使うSQL関数が網羅されているため、便利なリファレンスとして役立ちます。
T-SQLとは何か、SQLとどう違うのか
T-SQLを理解するには、SQLを「共通語」、T-SQLを「専門職向けの方言」と考えるとよいでしょう。
SQL(Structured Query Language)は、リレーショナルデータベースとやり取りするための標準言語です。宣言的(declarative)であり、データの選択やフィルタリングなど「何を」得たいかを記述すると、データベースエンジンが「どのように」実行するかを決定します。
一方T-SQLは、Microsoft SQL Serverで使用されるMicrosoft独自のSQL拡張です。標準SQLに手続き型プログラミング機能を加え、処理を段階的にどのように実行するかを制御できます。
この定義から、T-SQLは基本的なクエリを超える強力な機能をいくつか追加していることがわかります。例えば次のとおりです。
-
変数:
DECLAREやSETキーワードを使ってメモリにデータを保持し、スクリプト内で再利用できます。 -
制御フロー:
IF、WHILE、BEGIN...ENDといったロジックで実行を制御し、どのコードを動かすかを判断できます。 -
エラー処理: T-SQLは
TRY...CATCHブロックを導入しており、データベースがエラーを捕捉して、全体の処理を落とさずに適切に対応できます。 -
ストアドプロシージャ: データベース内で実行される再利用可能なロジックブロックを作成できます。
SQL Serverを扱う機会があるなら、DataCampには学習に役立つ優れたリソースが多数あります。まずはデータ分析のためのSQL Serverの基礎を身につけるために、DataCampのIntroduction to SQL Serverコースを受講することをおすすめします。
T-SQLの基本構文と構成
T-SQLは標準SQLと同じ中核構文を用いるため、すでにSQLに慣れていれば容易に理解できます。このセクションでは、T-SQLで最もよく使われるステートメントを、シンプルで実用的な例とともに説明します。
SELECT、INSERT、UPDATE、DELETE
これらのコマンドは、T-SQLが使われるMicrosoft SQL Serverを含むほとんどのSQL方言で共通です。
SELECT
特定のテーブルからデータを取得するコマンドです。例えば次のクエリは、CustomersテーブルからFirstNameとLastNameを取得します。
-- Retrieve data from the Customers table
SELECT FirstName, LastName
FROM Customers
WHERE Country = ‘USA’; -- Filters rows to only customers in the USA
INSERT
テーブルに新しいデータを挿入するコマンドです。次のクエリはcustomersテーブルに新しい行を挿入します。
-- Insert a new row into a table
INSERT INTO customers (FirstName, city)
VALUES (‘Alice’, ‘Nairobi’);
UPDATE
データベース内の既存データを更新するコマンドです。例えば次のクエリは、ユーザー「Alice」の都市名を「Mombasa」に変更します。
-- Update existing data
UPDATE customers
SET city = ‘Mombasa’
WHERE FirstName= ‘Alice’; -- Always use WHERE to avoid updating all rows
DELETE
データベースからデータを削除するコマンドです。例えば次のクエリは、FirstNameが「Alice」の行を削除します。
-- Delete data from a table
DELETE FROM customers
WHERE FirstName= ‘Alice’; -- Filters which rows to remove
SQL Serverの関数を使ってデータを要約・分析する方法を学ぶには、SQL Server Fundamentalsスキルトラックを試してみてください。
バッチ実行
T-SQLの特徴のひとつに、コードをバッチ単位で実行する点があります。バッチとは、1つ以上のSQLステートメントをまとめ、SQL Serverにひとまとまりとして送るものです。
GOキーワードは、バッチの区切りに使われます。
-- First batch
SELECT * FROM Customers;
GO
-- Second batch (executed separately)
SELECT * FROM Orders;
GO
重要なポイントは次のとおりです。
-
GOはT-SQLコマンドではありませんが、SQL Server Management Studioなどのツールで認識されます。 -
あるバッチの終わりと、次のバッチの始まりを示します。
-
変数はバッチ間で持続しません。同一セッション内であれば、一時オブジェクトはバッチをまたいで保持されます。
コメントとフォーマット
T-SQLではコメントを使って、SQLコードの可読性と保守性を高められます。以下のように、1行コメントと複数行コメントのいずれも使用できます。
-- This query retrieves all customers
SELECT * FROM Customers;
/* This query retrieves customers
from the USA and Canada */
SELECT *
FROM Customers
WHERE Country IN ('USA', 'Canada');
T-SQLの変数とデータ型
T-SQLでは、値を変数に格納してクエリで使用できるため、スクリプトをより柔軟かつ動的にできます。ここでは変数の作り方を見ていきます。
変数の宣言
変数を作成するにはDECLAREキーワードを使用します。慣習として、すべてのT-SQLの変数名は@で始める必要があります。
-- Declares a variable to store text
DECLARE @CustomerName VARCHAR(50);
値の代入
SET(単一値に推奨)またはSELECT(テーブルから取得する際に有用)のいずれかで値を代入できます。
-- Assign using SET
SET @CustomerName = 'Alice';
-- Assign using SELECT
SELECT @Age = 30;
例えば次のクエリは、値を直接書き込む代わりに変数を使って、ロンドン在住の顧客一覧を返します。
-- Assign the variable city
DECLARE @City VARCHAR(50);
SET @City = 'London';
-- Use the variable in a query
SELECT name, city
FROM customers
WHERE city = @City; -- Filters results based on variable value
一般的なデータ型
以下は、SQLのデータ型で標準的に使われる、T-SQLの代表的なデータ型です。
-
INT: 1、100のような整数。 -
VARCHAR(n): 名前やメールなどの可変長テキスト。 -
DATETIME: 日付と時刻の値。 -
DECIMAL(p, s): 通貨などの固定小数点数。
T-SQLの制御フロー(IF、WHILE、BEGIN...END)
T-SQLの利点のひとつは、クエリにプログラミングロジックを加えられることです。単にデータを取得するだけでなく、コードの実行タイミングや方法を制御できます。以下に制御フローロジックの例を示します。
IF...ELSE(条件付き実行)
IFステートメントは、特定の条件が満たされたときだけコードブロックを実行します。条件が偽の場合は、ELSEで代替の処理を記述できます。
例えば次のクエリは、注文数の合計を数え、100件を超えたら「High order volume」、それ以下なら「Low order volume」と出力します。
DECLARE @TotalOrders INT;
SELECT @TotalOrders = COUNT(*)
FROM Orders; -- Count total number of orders
IF @TotalOrders > 100
BEGIN
PRINT 'High order volume'; -- Runs if condition is true
END
ELSE
BEGIN
PRINT 'Low order volume'; -- Runs if condition is false
END
WHILEループ(反復処理)
WHILEループは、条件が真である間、コードブロックを繰り返し実行します。バッチ処理やテストデータの生成など、「塊」に分けて処理したいタスクに便利です。
次のクエリはカウンタを1で初期化し、5に達するまで現在の数を出力して1ずつ増やします。
DECLARE @Counter INT = 1;
WHILE @Counter <= 5
BEGIN
PRINT @Counter; -- Prints numbers from 1 to 5
SET @Counter = @Counter + 1; -- Increment counter
END
BEGIN...END(ステートメントのグループ化)
BEGIN...ENDは、複数のステートメントを1つのブロックにまとめ、グループ化したコードが原子的に一緒に実行されるようにします。
例えば次のクエリは、「Customers found in USA」と「Proceeding with operation.」の両方を出力します。BEGIN...ENDがなければ、IFの直後の最初のステートメントだけが実行されます。
IF EXISTS (SELECT 1 FROM Customers WHERE Country = 'USA')
BEGIN
PRINT 'Customers found in USA';
PRINT 'Proceeding with operation'; -- Both statements run together
END
制御フローはいつ有用か
T-SQLの制御フローは、以下の用途でよく使われます。
- 自動化: スケジュールされたスクリプトやメンテナンスタスクの実行
- データ検証: 挿入や更新の前に条件をチェック
- バッチ処理: データをステップやループで処理
- ビジネスロジック: 規則をデータベース内に直接実装
T-SQLのストアドプロシージャ
ストアドプロシージャは、再利用可能なT-SQLステートメント群を保存したものです。毎回アプリケーションから大量のコードをサーバーへ送る代わりに、サーバー側にコードを保存して名前で呼び出せます。
ストアドプロシージャは、何度も再利用できる点が有用です。事前コンパイルされた実行プランにより効率が向上し、複雑なロジックをシンプルなインターフェースの裏側に隠せます。
例えば次のストアドプロシージャは、指定したIDに基づいて顧客の名と姓を取得します。
-- Create a stored procedure named GetCustomerByID
CREATE PROCEDURE GetCustomerByID
@CustomerID INT -- Input parameter to pass a customer ID
AS
BEGIN
-- Select the first and last name of a customer
SELECT FirstName, LastName
FROM Customers
WHERE CustomerID = @CustomerID; -- Filter to match the given ID
END;
その後、次のクエリでストアドプロシージャを実行できます。
-- Calls the procedure
EXEC GetCustomerByID @CustomerID = 1; T-SQLの関数
T-SQLには、データ変換に用いる組み込み関数とユーザー定義関数(UDF)の両方が含まれます。
組み込み関数
これらの関数はSQL Serverにあらかじめ用意されており、クエリで直接使用できます。
文字列関数
文字列データ型を変換する関数です。例えば次のクエリは、Customersテーブルの名をすべて大文字に変換して取得します。
-- Converts text to uppercase
SELECT UPPER(FirstName)
FROM Customers;
日付関数
日付を扱う関数です。次のクエリは、現在のシステム日付と時刻を返します。
-- Returns current date and time
SELECT GETDATE();
集約関数
テーブル内の値を集約する関数です。例えば次のクエリは、Customersテーブルの行(顧客)数の合計を数えます。
-- Counts rows
SELECT COUNT(*) AS TotalCustomers
FROM Customers;
ユーザー定義関数(UDF)
独自の関数を作成して、複数のクエリでロジックを再利用することもできます。
スカラー関数
スカラー関数は単一の値を返します。フォーマットや計算など、単一の算出値が必要なときに有用です。次のクエリでは、名と姓を入力として受け取り、1つのフルネームとして返します。
-- Create a function that combines the first and last name
CREATE FUNCTION GetFullName
(@FirstName VARCHAR(50), @LastName VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
RETURN @FirstName + ' ' + @LastName; -- Concatenates the two values
END;
テーブル値関数
テーブル値関数はテーブルを返します。例えば次の関数は、指定した国に属するすべての顧客のテーブルを返します。
-- Create a table-valued function named GetCustomersByCountry
CREATE FUNCTION GetCustomersByCountry (@Country VARCHAR(50))
RETURNS TABLE -- Specifies that the function returns a table
AS
RETURN
(
-- Select all columns from the Customers table
SELECT *
FROM Customers
WHERE Country = @Country -- Filter rows by the given country
);
ストアドプロシージャの作成・更新・実行に加え、集約関数、結合、挿入、削除なども身につく、完全版のSQL Server Developerキャリアトラックをぜひお試しください。
T-SQLのエラー処理
T-SQLはTRY...CATCHブロックを用いて、スクリプト全体を停止させずにエラー処理を行います。これにより、想定外のクラッシュを防ぎ、デバッグやログ用に意味のあるメッセージを返すことができます。
例えば次のクエリは、エラーを引き起こす計算を試み、エラーを捕捉し、クラッシュの代わりに読みやすいエラーメッセージを出力します。
BEGIN TRY
-- Attempt to run this code
SELECT 1 / 0; -- This causes a divide-by-zero error
END TRY
BEGIN CATCH
-- Runs if an error occurs in the TRY block
PRINT 'An error occurred: ' + ERROR_MESSAGE(); -- Displays the error message
END CATCH;
T-SQLのトランザクション
トランザクションは、一連の処理がすべて成功するか、あるいはすべて失敗するかを保証します。これはACID特性に従っており、更新の途中で停電が起きてもデータベースの整合性が保たれることを意味します。
以下の例では、トランザクション内で一方の口座からもう一方へ資金を移動し、両方の変更をまとめて保存します。
BEGIN TRANSACTION; -- Start the transaction
-- Deduct money from Account 1
UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 1;
-- Add money to Account 2
UPDATE Accounts
SET Balance = Balance + 100
WHERE AccountID = 2;
COMMIT; -- Save all changes permanently
問題が発生した場合は、ROLLBACKでトランザクションを取り消し、データを以前の状態に戻せます。
-- Undo all changes made in the current transaction
ROLLBACK;
T-SQLにおけるトランザクションは、特に金融アプリケーションのようなクリティカルなシステムで重要です。部分的な更新は不整合につながる可能性があるためです。
SQL Serverのトランザクションとエラー処理を扱うTransactions and Error Handling in SQL Serverキャリアトラックもお試しください。
データ分析で役立つT-SQLの一般的な機能
T-SQLには、データプロフェッショナルにとって特に有用なツールがいくつか含まれます。ここでは、データ分析での適用例を見ていきます。
ウィンドウ関数
ウィンドウ関数は、行をひとつにまとめずに横断的な計算を行います。ランキング、累計、先進的な分析で主に用いられます。
以下の例では、CustomerIDに基づいて各顧客に一意の行番号を割り当てます。
-- Assigns row numbers to customers
SELECT
FirstName,
ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNum -- Assigns row numbers
FROM Customers;
このクエリでは、
-
ROW_NUMBER(): 一意の行番号を割り当て
-
RANK(): 同順位にギャップのあるランクを割り当て -
OVER(): ウィンドウ(並べ替え/パーティション)を定義
ダウンロード可能なSQL Window Functions Cheat Sheetもぜひご覧ください。SQLのさまざまなウィンドウ関数を手早く参照できます。また、T-SQLを用いたデータ分析(集約に役立つウィンドウ関数を含む)を学ぶには、Intermediate SQL Serverコースもおすすめです。
共通テーブル式(CTE)
CTE(Common Table Expressions)は、クエリ内で再利用できる一時的な結果セットを作成します。次のクエリは、米国の顧客の一時リストを作成し、そのデータを取得します。
-- Define a CTE
WITH CustomerCTE AS (
SELECT FirstName, Country
FROM Customers
WHERE Country = 'USA' -- Filter only USA customers
)
-- Query the CTE
SELECT *
FROM CustomerCTE;
一方、再帰CTEは定義内で自分自身を参照する特殊なCTEで、繰り返し処理を可能にします。これにより、組織図のような階層データを扱うのに最適です。
SQL ServerでCTEや再帰CTEを用いた高度なクエリを実例とともに学ぶには、Hierarchical and Recursive Queries in SQL Serverコースの受講をおすすめします。
一時テーブル
一時テーブルは、セッション中の短期間だけデータを保持します。データのステージングや、多段の変換の単純化、複雑なクエリでのパフォーマンス向上に役立ちます。
t-SQLでの一時テーブルの動作を示すため、以下の3つのクエリブロックを考えます。最初に一時テーブルを作成し、次に顧客データで埋め、同一セッション内でクエリします。
-- Create a temporary table
CREATE TABLE #TempCustomers (
FirstName VARCHAR(50),
Country VARCHAR(50)
);
-- Insert data into the temporary table
INSERT INTO #TempCustomers
SELECT FirstName, Country
FROM Customers;
-- Retrieve data from the temporary table
SELECT * FROM #TempCustomers;
一時テーブルは#で始まり、セッション終了時に自動で削除される点に注意してください。
T-SQLと他のSQL方言の比較
SQLの各方言は共通の基盤を共有しますが、各データベース製品が独自の構文や機能を追加しています。T-SQLはMicrosoft SQL Server向けに特化しており、その動作や最適な用途に影響しています。
T-SQL vs. PostgreSQL(PL/pgSQL)
PostgreSQL は手続き型ロジックにPL/pgSQLを用います。T-SQLと似ていますが、構文や強みが異なります。以下の表に相違点をまとめます。
|
カテゴリー |
T-SQL(SQL Server) |
PostgreSQL(PL/pgSQL) |
|
手続き言語 |
T-SQLに内蔵 |
PL/pgSQLを使用 |
|
変数の構文 |
|
|
|
変数の命名 |
|
接頭辞なし(例: |
|
ブロック構造 |
よりシンプルで、しばしば暗黙的または |
明示的: |
|
例のブロック |
標準的なT-SQLバッチ |
|
|
先進的なデータ型 |
限定的 |
高度なネイティブ対応(JSONB、配列、幾何) |
|
ツールと統合 |
SQL Serverツールと密接に統合 |
プラットフォーム横断で柔軟 |
|
エコシステム |
Windows、Azure、SSMS、Power BIに最適化 |
オープンソースでクロスプラットフォーム |
リレーショナルデータベースの設計や、パフォーマンス向上のためのクエリ設計を学ぶには、SQL for Database Administratorsスキルトラックをご覧ください。
T-SQL vs. MySQL
MySQL も手続き型SQLをサポートしますが、よりシンプルで制限のあるアプローチです。以下の表は両者の構文と機能の違いを比較したものです。
|
カテゴリー |
T-SQL(Microsoft) |
MySQL |
|
行数制限 |
|
|
|
エラー処理 |
堅牢な |
より限定的なDECLARE HANDLER構文 |
|
手続きロジック |
豊富で構造化され、高度にプログラム可能 |
よりシンプルで制限のある手続き機能 |
|
分析機能 |
ウィンドウ関数とCTE |
基本的な分析機能(新しいバージョンで改善中) |
|
エコシステム |
SQL Serverとエンタープライズツールに密接 |
軽量で、LAMPスタック(Linux、Apache等)の中心 |
|
最適な用途 |
複雑なビジネスロジックやデータウェアハウジング |
Webアプリケーションや高速な読み取り処理 |
T-SQLの実務での活用例
T-SQLは単なるデータクエリにとどまらず広く使われています。以下は、データプロフェッショナルとして有用だと感じた例です。
レポート用クエリ
T-SQLは、データベースから直接レポートを生成する用途で一般的に使われます。例えば、地域別に売上を集計したり、ウィンドウ関数を使って上位商品のランキングを作成したりできます。
ETLプロセス(抽出・変換・格納)
T-SQLはデータエンジニアによってデータパイプラインで使用され、データの準備や移送に用いられます。例えば、ステージングテーブルからの抽出、フォーマット変換、不整合のクレンジング、最終的なレポート用テーブルへのロードなどです。
データクレンジングスクリプト
住所表記が不統一な数百万行のデータベースがある場合、WHILEループやCTEを使ったT-SQLスクリプトで、重複の特定、欠損値の補完、表記の標準化を行えます。
アプリケーションのバックエンドロジック
多くのアプリケーションは、ビジネスロジックをデータベース内で処理するためにT-SQLに依存しています。CRUD操作にストアドプロシージャを用いたり、挿入前に検証を行ったり、重要処理ではトランザクション処理を用いるといった使い方が可能です。
よくあるミスとベストプラクティス
T-SQLは高度なデータベースクエリに有用ですが、いくつかの典型的な問題に遭遇しがちです。以下は、T-SQLを使う際によく見かけるミスです。
-
集合指向ロジックの代わりにループを多用する:
WHILEのようなループで行ごとの処理を行うと、パフォーマンスが低下しがちです。SQLは一度に集合としてデータを扱うよう設計されています。 -
インデックスへの理解不足: 適切にインデックスを使わないと、特に大規模テーブルでクエリが遅くなります。
-
トランザクションの不適切な使用: 関連する複数の処理をトランザクションで囲まずに実行すると、途中で失敗した場合にデータが不整合のまま残る恐れがあります。
-
エラー処理の軽視:
TRY...CATCHブロックを省くと、デバッグが困難になり、本番環境でサイレントに、あるいは予期せず失敗する原因になります。
以下は、より効率的で信頼性の高いクエリを書くためのおすすめのベストプラクティスです。
-
集合指向のクエリを優先する: 可能な限り
JOIN、GROUP BY、ウィンドウ関数を使い、ループを避けましょう。これはSQL Serverのデータ処理設計に合致します。 -
読みやすく保守しやすいコードを書く: 明確な命名規則を用い、クエリのフォーマットを一貫させ、必要に応じてコメントを追加しましょう。可読性が上がり、デバッグや共同作業が容易になります。
-
プロシージャをテストする: さまざまな入力でストアドプロシージャやクエリを常にテストし、正しく動作し、端境ケースも扱えることを確認しましょう。
まとめ
T-SQLは標準SQLにプログラミング機能を追加し、自動化、データ処理、分析において柔軟で強力なツールとなります。変数、ストアドプロシージャ、エラー処理などの機能により、より動的で効率的なデータベースソリューションを構築できます。
次のステップとして、熟練のデータアナリストを目指せるAssociate Data Analyst in SQLキャリアトラックに挑戦してみてください。さらに、複雑なレポート作成に習熟するにはReporting in SQLコースが役立ちます。最後に、ビジネス課題をSQLで解決するスキルを証明して他のプロフェッショナルと差別化するために、SQL Associate Certificationの取得もおすすめします。
T-SQLのFAQ
T-SQLは標準SQLとどう違いますか?
SQLは主に宣言的であるのに対し、T-SQLは宣言的なクエリと手続き型プログラミングを組み合わせ、処理の実行方法を制御できます。
T-SQLを学ぶ前にSQLを学ぶ必要はありますか?
はい。T-SQLはSELECT、INSERT、UPDATE、DELETEといったコア概念の上に成り立っているため、SQLの基礎理解は重要です。
T-SQLはすべてのSQL方言で利用できますか?
いいえ。T-SQLはMicrosoftのエコシステムに特化しており、主にMicrosoft SQL ServerやAzure SQLなどで使用されます。
ストアドプロシージャとは何ですか?なぜ有用なのですか?
ストアドプロシージャは、データベース内で実行される再利用可能なT-SQLコードのブロックです。パフォーマンスの向上、一貫性の確保、アプリケーションロジックの単純化に役立ちます。
T-SQLのウィンドウ関数は何に使いますか?
ウィンドウ関数は、データをグループ化せずに行をまたいだ高度な分析(ランキング、累計、値の比較など)に用いられます。