データベースの作成
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制約を積極的に活用し、データの予測可能性を高めることが推奨されます。