SQL変数定義とデータ型の基礎から実践的な活用方法まで

SQLでの変数定義について、基本的な宣言方法からパフォーマンスを考慮した実践的な使い方まで、具体的なコード例を交えて解説します。あなたのSQLスキルを次のレベルに引き上げる方法とは?

SQL変数定義の基礎と実践

SQL変数定義の基本ポイント
📝
変数の役割

データの一時保存や計算結果の格納に使用する重要な要素です

🔄
スコープ

バッチやストアドプロシージャ内での有効範囲を理解することが重要です

パフォーマンス

適切な変数定義と使用方法でクエリの実行効率が向上します

SQL変数の基本的な宣言方法とデータ型

変数を宣言する基本的な構文について説明します。SQL Serverでは、変数名の前に「@」を付けることが必要です。


-- 基本的な変数宣言
DECLARE @age INT
DECLARE @name VARCHAR(100)
DECLARE @price DECIMAL(10,2)
-- 初期値を設定した変数宣言
DECLARE @counter INT = 1
DECLARE @status BIT = 0

 

データ型の選択は重要で、以下の点に注意が必要です:

  • 数値型:INT, BIGINT, DECIMAL, FLOAT
  • 文字列型:VARCHAR, NVARCHAR, CHAR, NCHAR
  • 日付型:DATE, DATETIME, TIMESTAMP
  • 論理型:BIT

SQL変数への値の代入と更新手法

変数への値の代入には主に3つの方法があります:


-- 1. SET文を使用した代入
DECLARE @total INT
SET @total = 100
-- 2. SELECT文を使用した代入
DECLARE @max_price DECIMAL(10,2)
SELECT @max_price = MAX(price) FROM products
-- 3. 複数の変数への一括代入
DECLARE @first_name VARCHAR(50), @last_name VARCHAR(50)
SELECT 
    @first_name = first_name,
    @last_name = last_name
FROM employees
WHERE employee_id = 1

SQL変数のスコープとライフサイクル管理

変数のスコープは宣言されたバッチまたはストアドプロシージャ内に限定されます。


-- バッチ1
DECLARE @counter INT = 1
PRINT @counter
GO
-- バッチ2(エラーになる)
PRINT @counter -- 変数が認識されない

 

スコープを効果的に管理するためのポイント:

  • バッチ間で値を共有する場合は一時テーブルを使用
  • ストアドプロシージャ内での変数は終了時に自動的に破棄
  • ネストされたプロシージャでは新しいスコープが作成される

SQL変数定義のパフォーマンス最適化テクニック

変数の使用方法によってクエリのパフォーマンスが大きく変わります:


-- 効率的な変数宣言方法
DECLARE @id INT,
        @name VARCHAR(100),
        @date DATETIME
-- パフォーマンスを考慮した代入
SELECT @id = id,
       @name = name,
       @date = created_at
FROM users
WHERE user_id = 1

 

パフォーマンス最適化のポイント:

  • 適切なデータ型の選択
  • 必要最小限のサイズ指定
  • インデックスを活用した検索条件での使用

SQL変数を活用した実践的なクエリ例

実務で役立つ変数の活用例を紹介します:


-- 動的な日付範囲の指定
DECLARE @start_date DATE = DATEADD(MONTH, -1, GETDATE())
DECLARE @end_date DATE = GETDATE()
SELECT *
FROM sales
WHERE sale_date BETWEEN @start_date AND @end_date
-- 条件分岐での活用
DECLARE @user_type VARCHAR(10) = 'premium'
DECLARE @discount DECIMAL(5,2)
SET @discount = 
    CASE @user_type
        WHEN 'premium' THEN 0.20
        WHEN 'regular' THEN 0.10
        ELSE 0.05
    END
SELECT 
    product_name,
    price,
    price * (1 - @discount) as discounted_price
FROM products

 

Microsoft公式ドキュメント - SQL Server変数の詳細な解説