MySQLを使い始めたばかりの方が最初につまずくポイントの一つが「どのデータベースに対して操作すればいいの?」という疑問です。この記事では、MySQLで操作対象のデータベースを指定・切り替える方法を、初心者の方にもわかりやすく丁寧に解説します。
MySQLのデータベースとは?
まず基本的な概念を理解しておきましょう。MySQLでは、1つのMySQLサーバーの中に複数のデータベースを作成できます。
例えば、以下のような構成が可能です。
myapp_database(アプリケーション用)test_database(テスト用)wordpress_db(WordPress用)
それぞれのデータベースは独立しており、中にテーブルやデータを持っています。SQL文を実行する際は、どのデータベースに対して操作するのかを明確にする必要があります。
データベースを指定する3つの方法
MySQLでデータベースを指定する方法は主に3つあります。状況に応じて使い分けましょう。
方法1: USE文でデータベースを切り替える
最も基本的で、よく使われる方法です。
USE データベース名;
実際の使用例
USE myapp_database;
このコマンドを実行すると、「Database changed」というメッセージが表示されます。以降、SQL文は全てmyapp_databaseに対して実行されます。
USE myapp_database;
-- 以下は全て myapp_database に対する操作になる
SELECT * FROM users;
INSERT INTO products (name, price) VALUES ('商品A', 1000);
UPDATE orders SET status = 'completed' WHERE id = 1;
USE文のメリット
- シンプルでわかりやすい
- 一度指定すれば、その後の全てのSQL文に適用される
- コマンドラインでもGUIツールでも使える
USE文を使うタイミング
- MySQL接続後、最初に実行する
- 別のデータベースに切り替えたいとき
- 単一のデータベースで作業する場合
方法2: 接続時にデータベースを指定する
MySQL接続時に、最初から使用するデータベースを指定できます。この方法なら、接続後すぐに作業を開始できます。
コマンドラインから接続する場合
mysql -u ユーザー名 -p データベース名
具体例:
mysql -u root -p myapp_database
パスワードを入力すると、myapp_databaseが選択された状態でMySQLに接続されます。USE文を実行する必要はありません。
ホスト名も指定する場合
mysql -h ホスト名 -u ユーザー名 -p データベース名
具体例:
mysql -h localhost -u admin -p production_db
リモートサーバーに接続する際は-hオプションでホスト名を指定します。
プログラムから接続する場合
アプリケーション開発では、接続時にデータベースを指定するのが一般的です。
PHP(PDO)の場合:
<?php
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=myapp_database;charset=utf8mb4',
'username',
'password'
);
echo "接続成功!";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
}
?>
DSN(Data Source Name)の中にdbname=myapp_databaseと記述することで、データベースを指定します。
Python(mysql-connector-python)の場合:
import mysql.connector
# 接続設定
config = {
'host': 'localhost',
'user': 'username',
'password': 'password',
'database': 'myapp_database'
}
# 接続
conn = mysql.connector.connect(**config)
cursor = conn.cursor()
# クエリ実行
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
# 接続を閉じる
cursor.close()
conn.close()
databaseパラメータで使用するデータベースを指定します。
Node.js(mysql2)の場合:
const mysql = require('mysql2');
// 接続設定
const connection = mysql.createConnection({
host: 'localhost',
user: 'username',
password: 'password',
database: 'myapp_database'
});
// 接続
connection.connect((err) => {
if (err) {
console.error('接続エラー:', err);
return;
}
console.log('接続成功!');
});
// クエリ実行
connection.query('SELECT * FROM users', (err, results) => {
if (err) throw err;
console.log(results);
});
// 接続を閉じる
connection.end();
Ruby(mysql2 gem)の場合:
require 'mysql2'
# 接続
client = Mysql2::Client.new(
host: 'localhost',
username: 'username',
password: 'password',
database: 'myapp_database'
)
# クエリ実行
results = client.query("SELECT * FROM users")
results.each do |row|
puts row
end
# 接続を閉じる
client.close
接続時指定のメリット
- USE文を実行する手間が省ける
- 接続後すぐにデータベース操作ができる
- アプリケーション開発では標準的な方法
方法3: テーブル名にデータベース名を含める
USE文を使わずに、SQL文の中で直接データベース名を指定する方法です。
SELECT * FROM データベース名.テーブル名;
実際の使用例
-- データベースを指定せずに、テーブル名だけでアクセス
SELECT * FROM myapp_database.users;
-- 別のデータベースのテーブルも同時に操作できる
INSERT INTO myapp_database.products (name, price) VALUES ('商品A', 1000);
SELECT * FROM test_database.sample_data;
複数データベースを同時に扱う例
この方法の真価は、複数のデータベースを同時に操作できることです。
-- 本番データベースとテストデータベースのデータを比較
SELECT
p.product_name,
p.price AS production_price,
t.price AS test_price
FROM production_db.products p
JOIN test_db.products t ON p.id = t.id
WHERE p.price <> t.price;
-- 異なるデータベース間でデータをコピー
INSERT INTO backup_db.users
SELECT * FROM main_db.users
WHERE created_at >= '2025-01-01';
この方法のメリット
- 複数のデータベースを横断してクエリを実行できる
- どのデータベースを操作しているか明確
- データベース移行やバックアップ作業で便利
この方法のデメリット
- 毎回データベース名を書く必要があり、コードが長くなる
- タイプミスのリスクが増える
現在使用中のデータベースを確認する方法
作業中に「今どのデータベースを使っているんだっけ?」と迷ったときは、以下のコマンドで確認できます。
SELECT DATABASE();
実行結果の例:
+------------------+
| DATABASE() |
+------------------+
| myapp_database |
+------------------+
データベースが選択されていない場合はNULLが返されます。
+------------------+
| DATABASE() |
+------------------+
| NULL |
+------------------+
この状態でテーブル操作を試みると、「No database selected」というエラーが出ます。
利用可能なデータベースの一覧を表示する
MySQLサーバーにどんなデータベースがあるかを確認するには:
SHOW DATABASES;
実行結果の例:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| myapp_database |
| performance_schema |
| sys |
| test_database |
+--------------------+
ここに表示されるデータベースに対してアクセス権限があれば、USE文で切り替えて使用できます。
システムデータベースについて
結果に含まれる以下のデータベースは、MySQL自身が管理に使用するシステムデータベースです。
information_schema: データベースのメタ情報mysql: ユーザー権限などの管理情報performance_schema: パフォーマンス監視用sys: システム情報の参照用ビュー
通常の業務では直接触ることはありませんが、存在は知っておきましょう。
実務での使い分けガイド
状況に応じて、最適な方法を選びましょう。
コマンドラインで作業する場合
1つのデータベースだけ使う場合:
# 接続時に指定する方が楽
mysql -u root -p myapp_database
または
# 接続後にUSEで切り替え
mysql -u root -p
USE myapp_database;
複数のデータベースを切り替える場合:
-- USE文で切り替えながら作業
USE myapp_database;
SELECT COUNT(*) FROM users;
USE test_database;
SELECT COUNT(*) FROM test_users;
複数のデータベースを同時に扱う場合:
-- テーブル名にデータベース名を含める
SELECT * FROM myapp_database.users
WHERE id IN (SELECT user_id FROM test_database.access_logs);
アプリケーション開発の場合
プログラムからMySQLに接続する際は、接続時にデータベースを指定するのが一般的です。
// 推奨: 接続時に指定
$pdo = new PDO('mysql:host=localhost;dbname=myapp_database', 'user', 'pass');
// 非推奨: 接続後にUSE文を実行
$pdo = new PDO('mysql:host=localhost', 'user', 'pass');
$pdo->exec('USE myapp_database');
理由:
- コードがシンプルになる
- 接続プールを使う場合の動作が安定する
- フレームワークの設定ファイルで一元管理できる
データベース移行・バックアップ作業の場合
-- テーブル名にデータベース名を含めると便利
CREATE TABLE backup_db.users_backup AS
SELECT * FROM production_db.users;
-- 複数データベース間のデータ比較
SELECT
'production' AS env,
COUNT(*) AS user_count
FROM production_db.users
UNION ALL
SELECT
'staging' AS env,
COUNT(*) AS user_count
FROM staging_db.users;
よくあるエラーと対処法
エラー1: No database selected
ERROR 1046 (3D000): No database selected
原因: データベースが選択されていない状態でテーブルにアクセスしようとした
解決方法:
USE myapp_database;
または、テーブル名にデータベース名を含める:
SELECT * FROM myapp_database.users;
エラー2: Unknown database
ERROR 1049 (42000): Unknown database 'myapp_database'
原因: 指定したデータベースが存在しない、または名前が間違っている
解決方法:
- データベース名を確認:
SHOW DATABASES;
- 必要に応じてデータベースを作成:
CREATE DATABASE myapp_database;
エラー3: Access denied for user
ERROR 1044 (42000): Access denied for user 'username'@'localhost' to database 'myapp_database'
原因: 指定したユーザーにデータベースへのアクセス権限がない
解決方法: データベース管理者に権限付与を依頼するか、適切な権限を持つユーザーで接続する
-- 管理者が実行する権限付与の例
GRANT ALL PRIVILEGES ON myapp_database.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
データベース選択のベストプラクティス
1. 接続時に必ずデータベースを指定する
アプリケーションでは、接続設定でデータベース名を明示的に指定しましょう。
# Good: 明確
config = {
'host': 'localhost',
'user': 'app_user',
'password': 'secure_password',
'database': 'myapp_database' # 明示的に指定
}
2. 環境ごとに異なるデータベースを使う
開発環境、ステージング環境、本番環境でデータベースを分けることで、誤って本番データを操作するリスクを減らせます。
development_db # 開発用
staging_db # テスト用
production_db # 本番用
環境変数で切り替えられるようにすると便利です:
import os
database_name = os.environ.get('DB_NAME', 'development_db')
3. 定期的に現在のデータベースを確認する
長時間作業する場合、定期的に確認する習慣を:
SELECT DATABASE();
4. スクリプトには必ずUSE文を含める
SQLスクリプトファイルの先頭には、必ずUSE文を書きましょう。
-- migration_001.sql
USE myapp_database;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL
);
これにより、どのデータベースに対する操作か明確になり、誤実行を防げます。
まとめ
MySQLでデータベースを指定・切り替える方法について解説しました。
3つの方法のおさらい
- USE文で切り替える – 最も基本的で汎用的な方法
- 接続時に指定する – アプリケーション開発での標準的な方法
- テーブル名に含める – 複数データベースを扱う際に便利
重要なポイント
- データベースを指定せずにテーブル操作するとエラーになる
SELECT DATABASE();で現在のデータベースを確認できるSHOW DATABASES;で利用可能なデータベース一覧を表示できる- 状況に応じて最適な方法を使い分ける
- スクリプトには必ずUSE文を含める
データベースの選択は、MySQL操作の基本中の基本です。この記事で紹介した方法をマスターして、安全で効率的なデータベース操作を行いましょう。
実際に手を動かして練習することで、より深く理解できます。まずはテスト用のデータベースを作成して、色々な方法を試してみてください!