T-SQLデータベース操作の基礎と応用

データベースの作成

SQL Serverで新しいデータベースを作成するには、CREATE DATABASE文を使用します。主ファイルとログファイルの両方を明示的に定義できます。

CREATE DATABASE SampleDB
ON PRIMARY (
    NAME = 'SampleDB_Data',
    FILENAME = 'C:\Data\SampleDB.mdf',
    SIZE = 5MB,
    MAXSIZE = 30MB,
    FILEGROWTH = 5%
)
LOG ON (
    NAME = 'SampleDB_Log',
    FILENAME = 'C:\Data\SampleDB.ldf',
    SIZE = 1MB,
    MAXSIZE = 8MB,
    FILEGROWTH = 10%
);

データベース構造の変更

既存のデータベースに対してファイルサイズや最大容量の変更を行うにはALTER DATABASE文を使います。以下の例では主データファイルのサイズを拡張しています。

ALTER DATABASE SampleDB
MODIFY FILE (
    NAME = 'SampleDB_Data',
    SIZE = 15MB
);

注意点として、指定する新サイズは現在のサイズ以上である必要があります。

テーブルの管理

新しいテーブルを作成する基本構文は以下の通りです。IDENTITY列を利用して自動採番キーを実現できます。

USE SampleDB;
IF OBJECT_ID('ExamResults', 'U') IS NOT NULL
    DROP TABLE ExamResults;

CREATE TABLE ExamResults (
    ExamID INT IDENTITY(1,1) PRIMARY KEY,
    StudentCode CHAR(6) NOT NULL,
    WrittenScore INT NOT NULL,
    LabScore INT NOT NULL
);

列の追加と削除

既存のテーブルに列を追加または削除する場合はALTER TABLE文を利用します。

-- 列の追加
ALTER TABLE ExamResults ADD Description NVARCHAR(255);

-- 制約付きで列を追加
ALTER TABLE ExamResults ADD CONSTRAINT CK_Score CHECK (WrittenScore >= 0 AND LabScore >= 0);

-- 列の削除(事前に制約を除去)
ALTER TABLE ExamResults DROP CONSTRAINT CK_Score;
ALTER TABLE ExamResults DROP COLUMN Description;

制約の定義

データ整合性を保つために様々な制約が利用可能です。

  • PRIMARY KEY: 行の一意な識別子を保証
  • FOREIGN KEY: 他テーブルとの参照整合性を維持
  • UNIQUE: 特定列の値が重複しないことを保証
  • CHECK: 列の値に対する条件を定義
  • DEFAULT: 挿入時に値が省略された場合の既定値

外部キー制約の例:

ALTER TABLE Orders 
ADD CONSTRAINT FK_CustomerOrder 
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

データ操作言語(DML)

データの挿入、更新、削除に関する基本操作です。

-- データ挿入
INSERT INTO ExamResults (StudentCode, WrittenScore, LabScore)
VALUES ('S001', 85, 90), ('S002', 78, 88);

-- データ更新
UPDATE ExamResults SET WrittenScore = 80 WHERE StudentCode = 'S001';

-- 条件付き削除
DELETE FROM ExamResults WHERE ExamID = 1;

クエリ操作

SELECT文を使った代表的な検索パターンです。

-- 重複排除
SELECT DISTINCT City FROM Customers;

-- ソート付き検索
SELECT * FROM Orders ORDER BY OrderDate DESC;

-- 範囲検索
SELECT * FROM Products WHERE Price BETWEEN 1000 AND 5000;

-- パターンマッチ
SELECT * FROM Employees WHERE Name LIKE '山%';

結合クエリ

複数テーブルを結合してデータを取得します。

-- 内部結合
SELECT c.Name, o.OrderDate 
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID;

-- 左外部結合
SELECT c.Name, o.OrderDate 
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;

集計関数

統計情報を取得するための組み込み関数群です。

SELECT 
    COUNT(*) AS TotalCount,
    AVG(WrittenScore) AS AverageWritten,
    MAX(LabScore) AS HighestLab,
    MIN(WrittenScore) AS LowestWritten
FROM ExamResults;

ビューの利用

仮想テーブルとして頻繁に使うクエリを定義できます。

CREATE VIEW HighPerformers AS
SELECT StudentCode, (WrittenScore + LabScore) / 2.0 AS AverageScore
FROM ExamResults
WHERE WrittenScore >= 80 AND LabScore >= 80;

-- ビューの使用
SELECT * FROM HighPerformers ORDER BY AverageScore DESC;

高度なテクニック

日常的な運用で役立ついくつかの応用手法です。

-- テーブル構造のみをコピー
SELECT TOP 0 * INTO NewTable FROM OriginalTable;

-- ランダムなレコード抽出
SELECT TOP 10 * FROM Items ORDER BY NEWID();

-- 重複データの削除
DELETE FROM ItemList 
WHERE ID NOT IN (
    SELECT MAX(ID) 
    FROM ItemList 
    GROUP BY ItemName, Category
);

NULL値の取り扱い

NULLは「空文字」や「ゼロ」とは異なり、未知または未定義の状態を表します。比較には特別な演算子が必要です。

-- 正しいNULLチェック
SELECT * FROM Employees WHERE Commission IS NULL;

-- 誤った使い方(常にfalse)
-- SELECT * FROM Employees WHERE Commission = NULL;

アプリケーション設計においては、可能であればNOT NULL制約を積極的に活用し、データの予測可能性を高めることが推奨されます。

タグ: T-SQL SQL Server データベース設計 DDL DML

7月21日 02:04 投稿