実務で頻繁に使用するSQL操作集

データ操作基本

データ挿入

-- 顧客情報登録
INSERT INTO CustomerInfo(CustomerID, LoginName, FullName, ContactEmail, Phone)
VALUES(5001, 'tanaka_t', '田中太郎', 't.tanaka@example.co.jp', '080-XXXX-XXXX')

-- 商品マスタ登録
INSERT INTO ProductMaster(ProductCode, ItemName, UnitPrice, StockQty)
VALUES('PRD_300', 'デジタルカメラ', 79800.0, 150)

-- 注文登録(動的ID生成)
DECLARE @NewOrderID VARCHAR(20)
SET @NewOrderID = FORMAT(GETDATE(), 'yyyyMMddHHmmssfff')
INSERT INTO OrderData(OrderID, CustomerID, ProductCode, Quantity, OrderDate)
VALUES(@NewOrderID, 5001, 'PRD_300', 2, GETDATE())

データ更新

UPDATE CustomerInfo 
SET FullName = '鈴木一郎' 
WHERE CustomerID = 5002

データ削除

DELETE FROM CustomerInfo 
WHERE CustomerID = 5003

データ検索

SELECT * FROM ProductMaster
SELECT * FROM OrderData WHERE OrderID > '20230101000000000'

テーブル結合操作

内部結合

SELECT * 
FROM OrderData AS O
INNER JOIN CustomerInfo AS C ON O.CustomerID = C.CustomerID
WHERE C.CustomerID = 5001

左外部結合

SELECT *
FROM CustomerInfo AS C
LEFT JOIN OrderData AS O ON C.CustomerID = O.CustomerID

完全外部結合

SELECT *
FROM OrderData AS O
FULL JOIN ProductMaster AS P ON O.ProductCode = P.ProductCode

データ集計と整列

-- 顧客別注文件数
SELECT CustomerID, COUNT(OrderID) AS TotalOrders
FROM OrderData
GROUP BY CustomerID

-- 注文件数3件以上の顧客
SELECT CustomerID, COUNT(OrderID) AS OrderCount
FROM OrderData
GROUP BY CustomerID
HAVING COUNT(OrderID) >= 3

-- 注文件数降順ソート
SELECT CustomerID, COUNT(OrderID) AS OrderCount
FROM OrderData
GROUP BY CustomerID
ORDER BY OrderCount DESC

パターン検索

-- 特定ドメインのメール検索
SELECT * FROM CustomerInfo
WHERE ContactEmail LIKE '%@example.co.jp'

-- 文字列パターン検索
SELECT * FROM CustomerInfo
WHERE ContactEmail LIKE 'suzuki%'

-- 否定条件検索
SELECT * FROM CustomerInfo
WHERE ContactEmail NOT LIKE '%@gmail.com'

ビュー定義

-- 既存ビュー削除
IF OBJECT_ID('V_OrderSummary', 'V') IS NOT NULL
    DROP VIEW V_OrderSummary

-- 注文概要ビュー作成
CREATE VIEW V_OrderSummary AS
SELECT 
    O.OrderID, 
    O.CustomerID,
    O.ProductCode,
    O.OrderDate,
    C.FullName,
    C.ContactEmail,
    P.ItemName,
    P.UnitPrice
FROM OrderData AS O
JOIN CustomerInfo AS C ON O.CustomerID = C.CustomerID
JOIN ProductMaster AS P ON O.ProductCode = P.ProductCode

ストアドプロシージャとトランザクション

CREATE PROCEDURE DeleteProduct
    @ProductCode NVARCHAR(20),
    @Result INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRANSACTION
    BEGIN TRY
        DELETE FROM OrderData WHERE ProductCode = @ProductCode
        DELETE FROM ProductMaster WHERE ProductCode = @ProductCode
        SET @Result = 1
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        SET @Result = -1
        ROLLBACK TRANSACTION
    END CATCH
END

カーソル操作

CREATE PROCEDURE GetProductList
    @ProductNames NVARCHAR(MAX) OUTPUT
AS
BEGIN
    DECLARE @CurrentName NVARCHAR(100)
    DECLARE product_cursor CURSOR FOR
        SELECT ItemName FROM ProductMaster
    
    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @CurrentName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @ProductNames = CONCAT_WS('|', @ProductNames, @CurrentName)
        FETCH NEXT FROM product_cursor INTO @CurrentName
    END
    
    CLOSE product_cursor
    DEALLOCATE product_cursor
END

トリガー実装

削除時トリガー

CREATE TRIGGER tr_CustomerDelete
ON CustomerInfo
INSTEAD OF DELETE
AS
BEGIN
    DELETE FROM OrderData 
    WHERE CustomerID IN (SELECT CustomerID FROM DELETED)
    
    DELETE FROM CustomerInfo 
    WHERE CustomerID IN (SELECT CustomerID FROM DELETED)
END

登録時トリガー

CREATE TRIGGER tr_OrderInsert
ON OrderData
AFTER INSERT
AS
BEGIN
    UPDATE P
    SET P.StockQty = P.StockQty - I.Quantity
    FROM ProductMaster P
    INNER JOIN INSERTED I ON P.ProductCode = I.ProductCode
END

タグ: SQLServer データ操作 テーブル結合 ストアドプロシージャ トリガー

7月28日 01:16 投稿