データベースを扱う仕事をしていると、「SQLスクリプト」という言葉を耳にする機会が増えてきます。でも、初めて聞いた時は「スクリプトって何?」「普通のSQLと何が違うの?」と疑問に思いますよね。
SQLスクリプトを簡単に説明すると、複数のSQL文をまとめて書いたファイルのことです。料理で言えば、レシピのようなものでしょう。一つひとつの手順(SQL文)を順番に書いておけば、何度でも同じ作業を再現できます。
たとえば、毎月行うデータの集計作業や、新しいデータベースを作る時の初期設定など、繰り返し行う作業をスクリプトにしておけば、作業時間を大幅に短縮できるのです。
この記事では、SQLスクリプトの基本から実践的な使い方まで、初心者の方でも理解できるように分かりやすく解説していきます。
SQLスクリプトの基本を理解しよう

まずは、SQLスクリプトとは何かをもう少し詳しく見ていきましょう。
SQL文とSQLスクリプトの違い
SQL文は、データベースに対する一つの命令です。たとえば「顧客テーブルからデータを取り出す」という一つの操作を表します。
一方、SQLスクリプトは、複数のSQL文をまとめたものです。「顧客テーブルを作成して、初期データを入れて、権限を設定する」といった一連の作業を一つのファイルにまとめます。
つまり、SQL文は「一言」で、SQLスクリプトは「会話全体」のようなイメージです。
SQLスクリプトのメリット
SQLスクリプトを使うメリットはたくさんあります。
作業の効率化
一度スクリプトを書いておけば、何度でも同じ処理を実行できます。毎回手作業で入力する必要がありません。
ミスの削減
手作業で何度も同じSQLを実行すると、タイプミスが起きる可能性があります。スクリプトなら、一度正しく書けば常に同じ結果が得られるでしょう。
複雑な処理の管理
複数のテーブルを作成したり、大量のデータを操作したりする場合、スクリプトにまとめると全体の流れが把握しやすくなります。
再現性の確保
開発環境から本番環境へ移行する時、スクリプトがあれば同じ状態を簡単に再現できます。
SQLスクリプトのファイル形式
SQLスクリプトは通常、.sqlという拡張子のテキストファイルとして保存します。たとえば「create_database.sql」「insert_data.sql」といった名前を付けます。
中身は普通のテキストなので、メモ帳やテキストエディタで開いて編集できます。ただし、専門的なエディタ(VSCodeやDBeaver等)を使うと、色分けされて読みやすくなるでしょう。
SQLスクリプトの基本的な書き方
実際にSQLスクリプトを書いてみましょう。基本的なルールと構造を説明します。
コメントの書き方
スクリプトには、説明を書くための「コメント」を入れられます。コメントはプログラムとして実行されず、人間が読むためのメモです。
1行コメント
-- これは1行コメントです
SELECT * FROM customers; -- この行の後ろもコメント
ハイフン2つ(–)の後ろに書いた内容はコメントになります。
複数行コメント
/*
これは複数行にわたる
コメントの例です
*/
SELECT * FROM orders;
/*と*/で囲んだ部分が、複数行のコメントになります。
セミコロンで文を区切る
SQLスクリプトでは、一つひとつのSQL文の最後にセミコロン(;)を付けます。これが「ここで一つの命令が終わり」という合図です。
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100)
);
INSERT INTO products (id, name) VALUES (1, '商品A');
INSERT INTO products (id, name) VALUES (2, '商品B');
セミコロンを忘れると、次の行も同じ命令の続きだと認識されてエラーになる可能性があります。
スクリプトの基本構造
典型的なSQLスクリプトは、以下のような構造になります。
-- ===================================
-- データベース初期化スクリプト
-- 作成日: 2024-01-01
-- ===================================
-- データベースの作成
CREATE DATABASE IF NOT EXISTS company_db;
USE company_db;
-- テーブルの作成
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department VARCHAR(50),
salary DECIMAL(10, 2)
);
-- 初期データの投入
INSERT INTO employees (name, department, salary)
VALUES
('田中太郎', '営業部', 350000.00),
('佐藤花子', '開発部', 420000.00);
-- 確認用クエリ
SELECT * FROM employees;
このように、目的ごとにセクションを分けて、コメントで説明を加えると分かりやすくなります。
よく使われるSQL文の種類
SQLスクリプトで使用する主なSQL文を紹介します。
データ定義言語(DDL)
データ定義言語(DDL)は、データベースの構造を定義するためのSQL文です。「Data Definition Language」の略です。
CREATE:テーブルやデータベースの作成
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100),
email VARCHAR(100)
);
新しいテーブルを作成する時に使います。
ALTER:既存テーブルの変更
ALTER TABLE customers ADD phone VARCHAR(20);
既にあるテーブルに列を追加したり、構造を変更したりする時に使います。
DROP:テーブルやデータベースの削除
DROP TABLE IF EXISTS old_data;
不要になったテーブルを削除します。IF EXISTSを付けると、存在しない場合でもエラーにならず安全です。
データ操作言語(DML)
データ操作言語(DML)は、データそのものを操作するためのSQL文です。「Data Manipulation Language」の略です。
SELECT:データの取得
SELECT customer_name, email
FROM customers
WHERE customer_id > 100;
データベースからデータを取り出す時に使います。最もよく使われるSQL文でしょう。
INSERT:データの追加
INSERT INTO customers (customer_id, customer_name, email)
VALUES (101, '山田太郎', 'yamada@example.com');
新しいデータをテーブルに追加します。
UPDATE:データの更新
UPDATE customers
SET email = 'new_email@example.com'
WHERE customer_id = 101;
既存のデータを変更する時に使います。WHERE句を忘れると全データが更新されてしまうため注意が必要です。
DELETE:データの削除
DELETE FROM customers
WHERE customer_id = 101;
不要なデータを削除します。こちらもWHERE句を忘れると全データが削除されるため、十分注意しましょう。
データ制御言語(DCL)
データ制御言語(DCL)は、データベースへのアクセス権限を管理するためのSQL文です。「Data Control Language」の略です。
GRANT:権限の付与
GRANT SELECT, INSERT ON company_db.*
TO 'user1'@'localhost';
特定のユーザーに操作権限を与えます。
REVOKE:権限の取り消し
REVOKE INSERT ON company_db.*
FROM 'user1'@'localhost';
付与した権限を取り消します。
SQLスクリプトの実行方法
作成したSQLスクリプトを実際に実行する方法を見ていきましょう。
コマンドラインからの実行
最も基本的な方法は、コマンドラインからスクリプトを実行することです。
MySQLの場合
mysql -u ユーザー名 -p データベース名 < スクリプトファイル.sql
パスワードを入力すると、スクリプトが実行されます。
PostgreSQLの場合
psql -U ユーザー名 -d データベース名 -f スクリプトファイル.sql
データベース管理システムによってコマンドの形式が少し異なります。
GUIツールからの実行
多くのデータベース管理ツールでは、グラフィカルな画面からスクリプトを実行できます。
MySQL Workbench
- ツールを開いてデータベースに接続
- 「File」→「Open SQL Script」でスクリプトを開く
- 実行ボタン(稲妻マーク)をクリック
pgAdmin(PostgreSQL用)
- データベースに接続
- 「Tools」→「Query Tool」を開く
- スクリプトを貼り付けるか、ファイルを開く
- F5キーまたは実行ボタンをクリック
DBeaver(複数のデータベースに対応)
- データベースに接続
- 「SQL Editor」を開く
- スクリプトを入力または読み込み
- Ctrl+Enter(Mac: Cmd+Enter)で実行
GUIツールを使うと、結果が見やすく表示されるため、初心者の方におすすめです。
スクリプト内での実行指示
一部のデータベースでは、スクリプト内に実行に関する指示を書けます。
MySQLの例
SOURCE /path/to/another_script.sql;
別のスクリプトファイルを読み込んで実行できます。
PostgreSQLの例
\i /path/to/another_script.sql
こちらも同様に、他のスクリプトを読み込めます。
実践的なSQLスクリプトの例
実際に使える具体的なスクリプト例をいくつか紹介します。
テーブル作成スクリプト
新規プロジェクトでデータベースを構築する時のスクリプト例です。
-- ===================================
-- ECサイトデータベース初期化スクリプト
-- ===================================
-- データベースの作成
CREATE DATABASE IF NOT EXISTS ec_shop;
USE ec_shop;
-- 顧客テーブル
CREATE TABLE IF NOT EXISTS customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 商品テーブル
CREATE TABLE IF NOT EXISTS products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(200) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
category VARCHAR(50)
);
-- 注文テーブル
CREATE TABLE IF NOT EXISTS orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10, 2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-- 注文明細テーブル
CREATE TABLE IF NOT EXISTS order_details (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT NOT NULL,
unit_price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
このスクリプトを実行すれば、ECサイトに必要な基本的なテーブル構造が一度に作成されます。
データ投入スクリプト
テストデータや初期データを投入するスクリプト例です。
-- ===================================
-- サンプルデータ投入スクリプト
-- ===================================
USE ec_shop;
-- 顧客データの投入
INSERT INTO customers (customer_name, email, phone) VALUES
('山田太郎', 'yamada@example.com', '090-1234-5678'),
('佐藤花子', 'sato@example.com', '080-9876-5432'),
('鈴木一郎', 'suzuki@example.com', '070-1111-2222');
-- 商品データの投入
INSERT INTO products (product_name, price, stock, category) VALUES
('ノートパソコン', 89800.00, 15, '電子機器'),
('ワイヤレスマウス', 2980.00, 50, '電子機器'),
('ビジネスバッグ', 12800.00, 30, 'バッグ'),
('スマートウォッチ', 34800.00, 20, 'ウェアラブル');
-- 注文データの投入
INSERT INTO orders (customer_id, total_amount) VALUES
(1, 92780.00),
(2, 47600.00);
-- 注文明細データの投入
INSERT INTO order_details (order_id, product_id, quantity, unit_price) VALUES
(1, 1, 1, 89800.00),
(1, 2, 1, 2980.00),
(2, 4, 1, 34800.00),
(2, 3, 1, 12800.00);
開発環境でテストする時に、このようなスクリプトがあると便利です。
バックアップ復元スクリプト
定期的なバックアップ処理を自動化するスクリプトです。
-- ===================================
-- 月次バックアップテーブル作成
-- ===================================
-- 既存のバックアップテーブルを削除
DROP TABLE IF EXISTS customers_backup_202401;
-- 現在のデータをバックアップテーブルにコピー
CREATE TABLE customers_backup_202401 AS
SELECT * FROM customers;
-- バックアップ実行日時を記録
CREATE TABLE IF NOT EXISTS backup_log (
backup_id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(100),
backup_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO backup_log (table_name)
VALUES ('customers_backup_202401');
-- 確認クエリ
SELECT COUNT(*) AS backup_record_count
FROM customers_backup_202401;
このスクリプトを月初に実行すれば、定期的なバックアップが取れます。
エラーハンドリングとベストプラクティス
SQLスクリプトを書く時に気を付けるべきポイントを紹介します。
IF EXISTSを活用する
テーブルを削除したり作成したりする時は、存在チェックを入れると安全です。
-- 安全な削除
DROP TABLE IF EXISTS test_table;
-- 安全な作成
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY
);
既に存在する・存在しないという状況でエラーになりません。
トランザクションを使う
複数の処理をまとめて実行する場合、トランザクションを使うと安全性が高まります。
-- トランザクション開始
START TRANSACTION;
-- 複数の処理
UPDATE accounts SET balance = balance - 10000 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 10000 WHERE account_id = 2;
-- 問題なければ確定
COMMIT;
-- エラーがあった場合は取り消し
-- ROLLBACK;
全ての処理が成功した時だけCOMMITすることで、データの整合性を保てます。
WHERE句の確認
UPDATE文やDELETE文を実行する前に、WHERE句が正しいか必ずSELECT文で確認しましょう。
-- まず確認
SELECT * FROM customers WHERE customer_id = 999;
-- 問題なければ更新
UPDATE customers
SET email = 'new@example.com'
WHERE customer_id = 999;
WHERE句を忘れると、全てのレコードが更新・削除されてしまいます。
スクリプトの分割
大きなスクリプトは、目的ごとに分割すると管理しやすくなります。
scripts/
├── 01_create_database.sql
├── 02_create_tables.sql
├── 03_insert_initial_data.sql
├── 04_create_indexes.sql
└── 05_grant_permissions.sql
番号を付けて実行順序を明確にすると、チーム開発でも混乱が起きにくいです。
よくある質問と回答

SQLスクリプトについて、よくある質問をまとめました。
Q1:スクリプトの実行が途中で止まった場合はどうする?
エラーメッセージを確認して、どの行で問題が起きたか特定しましょう。多くの場合、構文エラーや存在しないテーブルへのアクセスが原因です。
エラー箇所を修正したら、その行から再実行するか、データベースを初期状態に戻してスクリプト全体を再実行します。
Q2:大量のデータを投入するスクリプトは遅くないの?
確かに、何万件ものINSERT文を個別に実行すると時間がかかります。大量データの場合は、以下の方法を検討してください。
- 複数のVALUESをまとめる(バルクインサート)
- CSVファイルからLOAD DATA文で読み込む
- トランザクションをまとめる
これらの方法で、実行速度を大幅に改善できます。
Q3:本番環境でスクリプトを実行する時の注意点は?
本番環境での実行には細心の注意が必要です。
- 必ずバックアップを取る
- 開発環境やテスト環境で十分テストする
- メンテナンス時間帯に実行する
- ロールバック手順を準備しておく
- 実行前にチームメンバーに通知する
特に、DROP文やDELETE文が含まれるスクリプトは、二重チェックが必須です。
Q4:パスワードをスクリプトに書いても大丈夫?
絶対に避けてください。スクリプトにパスワードを書くと、ファイルを見た人全員がパスワードを知ることになります。
代わりに、以下の方法を使いましょう。
- 環境変数からパスワードを読み込む
- 設定ファイルを別途用意する(gitで管理しない)
- 実行時にパスワード入力を求める
セキュリティは常に最優先事項です。
Q5:Windows、Mac、Linuxで同じスクリプトが使える?
基本的には使えますが、以下の点に注意が必要です。
ファイルパス
Windowsは「C:\path\to\file」、MacとLinuxは「/path/to/file」と形式が異なります。
改行コード
Windowsは「CRLF」、MacとLinuxは「LF」を使います。エディタの設定で統一しましょう。
文字エンコーディング
UTF-8で統一すると問題が起きにくいです。
これらに気を付ければ、クロスプラットフォームで使えるスクリプトが作成できます。
SQLスクリプトの管理方法
プロジェクトが大きくなると、スクリプトの管理も重要になってきます。
バージョン管理システムの活用
Gitなどのバージョン管理システムでSQLスクリプトを管理しましょう。
メリット
- 変更履歴が残る
- チームで共有しやすい
- 過去のバージョンに戻せる
- レビューがしやすい
コードと同じように、SQLスクリプトもバージョン管理の対象です。
マイグレーションツールの使用
データベースのバージョン管理には、専用のマイグレーションツールが便利です。
主なツール
- Flyway(Java向け)
- Liquibase(複数言語対応)
- Alembic(Python向け)
- Rails Migrations(Ruby on Rails)
これらのツールを使うと、データベースのバージョン管理が自動化されます。
ドキュメント化
スクリプトには必ずコメントで説明を書きましょう。
-- ===================================
-- スクリプト名: 顧客データ削除
-- 目的: 6ヶ月以上非アクティブな顧客を削除
-- 実行頻度: 月1回
-- 作成者: 田中
-- 作成日: 2024-01-15
-- 最終更新: 2024-03-20
-- ===================================
将来の自分や他のチームメンバーのために、詳しく記録を残しておくことが大切です。
まとめ:SQLスクリプトで作業を効率化しよう
SQLスクリプトについて、理解が深まったでしょうか。
重要なポイントをおさらい
- SQLスクリプトは複数のSQL文をまとめたもの:繰り返し作業を効率化できる
- コメントとセミコロンが重要:読みやすく、正確に動作するスクリプトを書ける
- DDL、DML、DCLを使い分ける:目的に応じて適切なSQL文を選択
- エラー対策を忘れずに:IF EXISTSやトランザクションで安全性を確保
- 適切に管理する:バージョン管理とドキュメント化で長期的に活用できる
SQLスクリプトは、データベース管理の強力な武器です。最初は簡単なスクリプトから始めて、徐々に複雑な処理にチャレンジしていきましょう。
手作業で何度も同じSQL文を実行している方は、ぜひスクリプト化を検討してください。最初は少し時間がかかりますが、長期的には大きな時間節約になります。
この記事を参考に、あなたも効率的なデータベース管理を実現してくださいね!


コメント