SQL

データベース | IT用語集

この用語をシェア

概要・定義

SQL(Structured Query Language、構造化照会言語)は、リレーショナルデータベース管理システム(RDBMS)でデータの管理と操作を行うための標準的なプログラミング言語です。1974年にIBMのDonald Chamberlinらによって開発され、1986年にANSI(米国国家規格協会)、1987年にISO(国際標準化機構)によって標準化されました。データの検索(SELECT)、挿入(INSERT)、更新(UPDATE)、削除(DELETE)、データベース構造の定義(CREATE、ALTER、DROP)など、データベースに関わる全ての操作を統一的な構文で実行できます。現在では、MySQL、PostgreSQL、Oracle Database、SQL Server、SQLiteなど、ほぼ全てのリレーショナルデータベースでサポートされています。

主要な特徴・利点

1. 標準化と互換性

SQL標準(SQL-92、SQL:1999、SQL:2003、SQL:2006、SQL:2008、SQL:2011、SQL:2016等)により、異なるデータベースシステム間でも基本的な構文は共通して使用できます。これにより、データベース間の移植性が高く、スキルの転用も容易です。

2. 宣言的なアプローチ

「何を取得したいか」を記述するだけで、「どのように取得するか」はデータベースエンジンが自動的に最適化します。これにより、複雑なデータ操作も直感的に記述でき、保守性の高いコードを書くことができます。

3. 豊富な機能

基本的なCRUD操作だけでなく、結合(JOIN)、集計関数、サブクエリ、ウィンドウ関数、共通表式(CTE)、ストアドプロシージャ、トリガーなど、高度なデータ処理機能を提供します。

4. トランザクション制御

ACID特性(Atomicity、Consistency、Isolation、Durability)を保証するトランザクション制御機能により、データの整合性を確保できます。COMMIT、ROLLBACK、SAVEPOINT等の命令でデータの一貫性を管理します。

使用例・実装方法

基本的なデータ操作(CRUD)

-- テーブル作成
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- データ挿入(INSERT)
INSERT INTO users (name, email, age) VALUES 
('田中太郎', 'tanaka@example.com', 30),
('佐藤花子', 'sato@example.com', 25),
('鈴木次郎', 'suzuki@example.com', 35);

-- データ読み取り(SELECT)
SELECT * FROM users;
SELECT name, email FROM users WHERE age >= 30;
SELECT COUNT(*) FROM users;

-- データ更新(UPDATE)
UPDATE users SET age = 31 WHERE name = '田中太郎';

-- データ削除(DELETE)
DELETE FROM users WHERE age < 25;

高度なクエリ例

-- 結合(JOIN)
SELECT u.name, o.order_date, o.total_amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.order_date >= '2024-01-01';

-- 集計とグループ化
SELECT 
    YEAR(order_date) as order_year,
    COUNT(*) as order_count,
    SUM(total_amount) as total_sales,
    AVG(total_amount) as avg_order_value
FROM orders
GROUP BY YEAR(order_date)
HAVING COUNT(*) > 10
ORDER BY order_year DESC;

-- サブクエリ
SELECT name, email
FROM users
WHERE id IN (
    SELECT user_id 
    FROM orders 
    WHERE total_amount > 10000
);

-- ウィンドウ関数(売上上位3位)
SELECT 
    user_id,
    name,
    total_sales,
    RANK() OVER (ORDER BY total_sales DESC) as sales_rank
FROM (
    SELECT 
        u.id as user_id,
        u.name,
        SUM(o.total_amount) as total_sales
    FROM users u
    JOIN orders o ON u.id = o.user_id
    GROUP BY u.id, u.name
) user_sales
WHERE sales_rank <= 3;

データベース設計とインデックス

-- 外部キー制約
ALTER TABLE orders 
ADD CONSTRAINT fk_user_id 
FOREIGN KEY (user_id) REFERENCES users(id);

-- インデックス作成
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_user_order ON orders(user_id, order_date);

-- ビューの作成
CREATE VIEW user_order_summary AS
SELECT 
    u.name,
    u.email,
    COUNT(o.id) as order_count,
    SUM(o.total_amount) as total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, u.email;

SQLの種類と分類

1. DDL(Data Definition Language)

データベース構造を定義・変更する言語です。CREATE、ALTER、DROP、TRUNCATEなどが含まれます。テーブル、インデックス、ビュー、ストアドプロシージャなどのデータベースオブジェクトを管理します。

2. DML(Data Manipulation Language)

データの操作を行う言語です。SELECT、INSERT、UPDATE、DELETEが含まれます。日常的なデータ操作の大部分を占める重要な分類です。

3. DCL(Data Control Language)

データへのアクセス制御を行う言語です。GRANT、REVOKE、COMMIT、ROLLBACKなどが含まれます。セキュリティとトランザクション制御を担当します。

導入時の注意点・ベストプラクティス

1. パフォーマンスの最適化

適切なインデックスの設計、クエリの最適化、実行計画の確認が重要です。EXPLAIN文を使用してクエリの実行計画を分析し、ボトルネックを特定します。N+1問題の回避、適切なJOINの使用、WHERE句の最適化などを実践します。

2. セキュリティ対策

SQLインジェクション攻撃を防ぐため、パラメータ化クエリ(プリペアドステートメント)を使用し、入力値の検証とエスケープ処理を徹底します。最小権限の原則に従い、適切なユーザー権限設定を行います。

3. データベース設計

正規化を適切に適用し、データの重複を避けて整合性を保ちます。ただし、パフォーマンスが重要な場合は、戦略的な非正規化も検討します。外部キー制約、CHECK制約、UNIQUE制約などを適切に設定し、データの整合性を保証します。

4. トランザクション管理

ACID特性を理解し、適切なトランザクション境界を設定します。デッドロックの回避、適切な分離レベルの設定、長時間実行されるトランザクションの分割などを考慮します。

関連Webサイト

この用語についてもっと詳しく

SQLに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。