MySQLチートシート:ログインからスキーマ確認・DMLまとめ
はじめに
Railsの本番環境やステージング環境ではMySQLがよく使われます。mysql コマンドを使うとDBに直接ログインしてテーブル構造の確認やデータの操作ができます。
この記事ではログインから、スキーマ・テーブル定義の確認、よく使うSQLまでまとめます。
ログイン
mysql -u ユーザー名 -p
パスワードを入力するとプロンプトが表示されます。
Welcome to the MySQL monitor. Commands end with ; or \g. mysql>
オプション
mysql -u root -p # ローカルにrootでログイン mysql -u root -p データベース名 # DB指定してログイン mysql -h 127.0.0.1 -P 3306 -u root -p # ホスト・ポートを明示 mysql -h db.example.com -u app_user -p myapp # リモートサーバーに接続 # パスワードをコマンドに直接書く(スクリプト用・非推奨) mysql -u root -pパスワード # -p の直後にスペースなし # ワンライナー実行 mysql -u root -p -e "SHOW DATABASES;" myapp
Railsのdatabase.ymlから接続情報を確認
# config/database.yml development: adapter: mysql2 host: localhost port: 3306 database: myapp_development username: root password: password
mysql -h localhost -P 3306 -u root -p myapp_development
DB・テーブルの確認
データベース一覧
SHOW DATABASES;
+--------------------+ | Database | +--------------------+ | information_schema | | myapp_development | | myapp_test | +--------------------+
DBを選択する
USE myapp_development;
テーブル一覧
SHOW TABLES; SHOW TABLES LIKE 'user%'; -- 名前でフィルタ
テーブルのステータス確認
SHOW TABLE STATUS; SHOW TABLE STATUS LIKE 'users'\G -- \G で縦表示
テーブル定義の確認
カラム定義を確認する
DESCRIBE users; DESC users; -- 短縮形
+--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | created_at | datetime(6) | NO | | NULL | | | updated_at | datetime(6) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+
CREATE文を確認する
SHOW CREATE TABLE users\G
CREATE TABLE `users` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `index_users_on_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
インデックス一覧
SHOW INDEX FROM users;
基本的なSQL
SELECT
-- 全件取得 SELECT * FROM users; -- カラムを絞る SELECT id, name, email FROM users; -- 条件で絞り込む SELECT * FROM users WHERE name = '田中太郎'; SELECT * FROM users WHERE email LIKE '%@example.com'; SELECT * FROM users WHERE created_at > '2026-01-01'; -- 件数を限定 SELECT * FROM users LIMIT 10; SELECT * FROM users LIMIT 10 OFFSET 20; -- 並び替え SELECT * FROM users ORDER BY created_at DESC; SELECT * FROM users ORDER BY name ASC, created_at DESC; -- 集計 SELECT COUNT(*) FROM users; SELECT COUNT(*), DATE(created_at) AS date FROM users GROUP BY date ORDER BY date DESC;
JOIN
-- INNER JOIN SELECT users.name, posts.title FROM users INNER JOIN posts ON posts.user_id = users.id; -- LEFT JOIN SELECT posts.title, users.name FROM posts LEFT JOIN users ON users.id = posts.user_id; -- 複数テーブル SELECT users.name, posts.title, comments.body FROM users INNER JOIN posts ON posts.user_id = users.id INNER JOIN comments ON comments.post_id = posts.id WHERE users.id = 1;
INSERT
INSERT INTO users (name, email, created_at, updated_at) VALUES ('田中太郎', 'tanaka@example.com', NOW(), NOW()); -- 複数行一括挿入 INSERT INTO users (name, email, created_at, updated_at) VALUES ('田中太郎', 'tanaka@example.com', NOW(), NOW()), ('鈴木花子', 'suzuki@example.com', NOW(), NOW());
UPDATE
UPDATE users SET name = '田中次郎' WHERE id = 1; UPDATE users SET updated_at = NOW() WHERE email LIKE '%@example.com';
DELETE
DELETE FROM users WHERE id = 1; DELETE FROM users WHERE created_at < '2025-01-01'; -- 全件削除(ロールバック可) DELETE FROM users; -- 全件削除(高速・ロールバック不可) TRUNCATE TABLE users;
MySQL特有の機能
EXPLAIN — クエリの実行計画を確認
遅いクエリを調査するときに使います。
EXPLAIN SELECT * FROM users WHERE email = 'tanaka@example.com';
+----+-------------+-------+-------+---------------------------+-----+------+ | id | select_type | table | type | key | ref | rows | +----+-------------+-------+-------+---------------------------+-----+------+ | 1 | SIMPLE | users | const | index_users_on_email | | 1 | +----+-------------+-------+-------+---------------------------+-----+------+
typeがconst・ref・rangeなら良好。ALLはフルスキャンで遅いkeyにインデックス名が表示されればインデックスが使われている
SHOW PROCESSLIST — 実行中のクエリを確認
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST; -- クエリ全文を表示
長時間実行中のクエリを見つけて KILL クエリID で停止できます。
KILL 42;
トランザクション
START TRANSACTION; UPDATE accounts SET balance = balance - 1000 WHERE id = 1; UPDATE accounts SET balance = balance + 1000 WHERE id = 2; COMMIT; -- 確定 -- ROLLBACK; で取り消し
文字コードの確認
SHOW VARIABLES LIKE 'character%'; SHOW CREATE TABLE users\G -- テーブルの文字コードも確認できる
Railsプロジェクトでは utf8mb4 が推奨です。
日時関数
SELECT NOW(); -- 現在日時 SELECT CURDATE(); -- 現在日付 SELECT DATE_FORMAT(created_at, '%Y-%m') FROM users; -- フォーマット SELECT DATEDIFF(NOW(), created_at) FROM users; -- 日数差
よく使うショートカット
| 操作 | コマンド |
|---|---|
| 実行 | ; または \g |
| 縦表示で実行 | \G |
| 直前のクエリを再実行 | \r |
| 入力をキャンセル | \c |
| 現在のDB確認 | SELECT DATABASE(); |
| 接続ユーザー確認 | SELECT USER(); |
| バージョン確認 | SELECT VERSION(); |
| ログアウト | EXIT; / QUIT; / \q |
まとめ
| 操作 | コマンド |
|---|---|
| ログイン | mysql -u root -p |
| DB一覧 | SHOW DATABASES; |
| DB選択 | USE データベース名; |
| テーブル一覧 | SHOW TABLES; |
| カラム定義 | DESC テーブル名; |
| CREATE文確認 | SHOW CREATE TABLE テーブル名\G |
| 実行計画 | EXPLAIN SELECT ...; |
| 縦表示 | クエリ末尾を \G に変える |
SQLiteでの同様の操作は「SQLiteチートシート:ログインからスキーマ確認・DMLまとめ」を参照してください。
PostgreSQLでの同様の操作は「PostgreSQLチートシート:ログインからスキーマ確認・DMLまとめ」を参照してください。
Active RecordからSQLがどう発行されるかは「Active Record入門:検索・更新・リレーションの基本まとめ」を参照してください。
RailsのDBマイグレーション操作は「Rails のDB操作コマンド入門:db:create から db:migrate まで」を参照してください。