MySQLチートシート:ログインからスキーマ確認・DMLまとめ

スポンサーリンク

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 |
+----+-------------+-------+-------+---------------------------+-----+------+
  • typeconstrefrange なら良好。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 まで」を参照してください。