mysqlコマンド チートシート

cheatsheet

接続と切断

MySQLサーバーへの接続方法と切断方法の色々なパターンです。

基本的な接続

ユーザー名のみを指定して接続します。パスワードは後で聞かれます。

mysql -u [ユーザー名] -p

例: ユーザー `root` で接続

mysql -u root -p

ホスト、ポート、ユーザー、パスワードを指定して接続

接続に必要な情報をすべてコマンドラインで指定します。-pの直後にパスワードを続けると、プロンプトなしで接続できます(履歴に残るため注意が必要です⚠️)。

mysql -h [ホスト名/IPアドレス] -P [ポート番号] -u [ユーザー名] -p[パスワード]

例: ホスト `192.168.1.100`、ポート `3307`、ユーザー `admin`、パスワード `secret123` で接続

mysql -h 192.168.1.100 -P 3307 -u admin -psecret123

パスワードを安全に入力する場合:

mysql -h 192.168.1.100 -P 3307 -u admin -p

特定のデータベースに接続

接続と同時に使用するデータベースを指定します。

mysql -h [ホスト名] -u [ユーザー名] -p [データベース名]

例: ホスト `localhost`、ユーザー `appuser`、データベース `myapp_db` に接続

mysql -h localhost -u appuser -p myapp_db

Unixソケットファイルを使用して接続

ローカルホストで、TCP/IPではなくソケットファイルを使って接続する場合に指定します。

mysql -u [ユーザー名] -p --socket=[ソケットファイルのパス]

例: ユーザー `root` で `/var/run/mysqld/mysqld.sock` を使用して接続

mysql -u root -p --socket=/var/run/mysqld/mysqld.sock

SSLを使用して接続

SSL/TLSで暗号化された接続を使用する場合のオプションです。サーバー側の設定も必要です。

mysql -u [ユーザー名] -p -h [ホスト名] --ssl-ca=[CA証明書パス] --ssl-cert=[クライアント証明書パス] --ssl-key=[クライアント秘密鍵パス]

SSL接続を必須にする場合:

mysql -u [ユーザー名] -p -h [ホスト名] --ssl-mode=REQUIRED

利用可能なSSLモード: DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY

切断

MySQLプロンプトからサーバーとの接続を切断します。

exit

または

quit

または Ctrl+D (多くの環境で)

データベース操作 📂

データベースのリスト表示、作成、選択、削除に関するコマンドです。

データベース一覧表示

サーバー上に存在するデータベースの一覧を表示します。

SHOW DATABASES;

データベース作成

新しいデータベースを作成します。

CREATE DATABASE [データベース名];

文字コードや照合順序を指定して作成する場合:

CREATE DATABASE [データベース名] CHARACTER SET [文字コード名] COLLATE [照合順序名];

例: 文字コード `utf8mb4`、照合順序 `utf8mb4_general_ci` で `my_new_db` を作成

CREATE DATABASE my_new_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

既に存在しない場合のみ作成 (エラー回避):

CREATE DATABASE IF NOT EXISTS [データベース名];

データベース選択

これ以降のSQL操作の対象となるデフォルトデータベースを選択(切り替え)します。

USE [データベース名];

例: `myapp_db` を選択

USE myapp_db;

現在選択中のデータベースを確認:

SELECT DATABASE();

データベース削除

指定したデータベースを完全に削除します。注意: データベース内のすべてのテーブルとデータが失われます! 復元は困難です。🚨

DROP DATABASE [データベース名];

例: `old_db` を削除

DROP DATABASE old_db;

存在する場合のみ削除 (エラー回避):

DROP DATABASE IF EXISTS [データベース名];

テーブル操作 🏗️

テーブルの構造に関する操作(一覧、定義表示、作成、変更、削除)です。

テーブル一覧表示

現在選択中のデータベース内にあるテーブルの一覧を表示します。

SHOW TABLES;

特定のデータベースのテーブル一覧を表示:

SHOW TABLES FROM [データベース名];

例: `information_schema` データベースのテーブル一覧

SHOW TABLES FROM information_schema;

テーブル構造表示

指定したテーブルのカラム定義(データ型、NULL許容、キー情報など)を表示します。

DESCRIBE [テーブル名];

または

DESC [テーブル名];

または、より詳細な情報:

SHOW COLUMNS FROM [テーブル名];

テーブルを作成したSQL文を表示 (ストレージエンジンや文字コードも確認可能):

SHOW CREATE TABLE [テーブル名];

テーブル作成 (CREATE TABLE)

新しいテーブルを作成します。

CREATE TABLE [テーブル名] (
  [カラム名1] [データ型] [制約],
  [カラム名2] [データ型] [制約],
  ...
  [テーブルレベルの制約]
) ENGINE=[ストレージエンジン名] DEFAULT CHARSET=[文字コード名];

例: `users` テーブルを作成

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  email VARCHAR(100) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

主なデータ型:

  • 数値型: `INT`, `BIGINT`, `SMALLINT`, `TINYINT`, `FLOAT`, `DOUBLE`, `DECIMAL`
  • 文字列型: `VARCHAR(n)`, `CHAR(n)`, `TEXT`, `MEDIUMTEXT`, `LONGTEXT`
  • 日付/時刻型: `DATE`, `DATETIME`, `TIMESTAMP`, `TIME`, `YEAR`
  • バイナリ型: `BLOB`, `BINARY`, `VARBINARY`
  • その他: `ENUM`, `SET`, `JSON`

主な制約:

  • `NOT NULL`: NULL値を許可しない
  • `NULL`: NULL値を許可する (デフォルト)
  • `UNIQUE`: カラム内で一意な値を持つ
  • `PRIMARY KEY`: 主キー (NOT NULL と UNIQUE を含む)
  • `FOREIGN KEY`: 外部キー (他のテーブルを参照)
  • `AUTO_INCREMENT`: 自動連番 (主に整数型の主キーで使用)
  • `DEFAULT [値]`: デフォルト値を設定
  • `CHECK`: 値の条件を指定 (MySQL 8.0.16以降)

既に存在しない場合のみ作成:

CREATE TABLE IF NOT EXISTS [テーブル名] (...);

テーブル変更 (ALTER TABLE)

既存のテーブル構造を変更します。

操作 構文
カラム追加
ALTER TABLE [テーブル名] ADD COLUMN [カラム名] [データ型] [制約] [AFTER カラム名 / FIRST];
ALTER TABLE users ADD COLUMN last_login DATETIME NULL AFTER email;
カラム型変更
ALTER TABLE [テーブル名] MODIFY COLUMN [カラム名] [新しいデータ型] [制約];
ALTER TABLE users MODIFY COLUMN email VARCHAR(150) NOT NULL;
カラム名変更
ALTER TABLE [テーブル名] CHANGE COLUMN [旧カラム名] [新カラム名] [データ型] [制約];
ALTER TABLE users CHANGE COLUMN username user_name VARCHAR(60) NOT NULL UNIQUE;
カラム削除
ALTER TABLE [テーブル名] DROP COLUMN [カラム名];
ALTER TABLE users DROP COLUMN last_login;
主キー追加
ALTER TABLE [テーブル名] ADD PRIMARY KEY ([カラム名]);
ALTER TABLE products ADD PRIMARY KEY (product_id);
主キー削除
ALTER TABLE [テーブル名] DROP PRIMARY KEY;
ALTER TABLE users DROP PRIMARY KEY;
インデックス追加
ALTER TABLE [テーブル名] ADD INDEX [インデックス名] ([カラム名1], [カラム名2], ...);
ALTER TABLE users ADD INDEX idx_email (email);
ユニーク制約追加
ALTER TABLE [テーブル名] ADD UNIQUE ([カラム名]);
ALTER TABLE products ADD UNIQUE (product_code);
インデックス削除
ALTER TABLE [テーブル名] DROP INDEX [インデックス名];
ALTER TABLE users DROP INDEX idx_email;
外部キー追加
ALTER TABLE [子テーブル名] ADD CONSTRAINT [制約名] FOREIGN KEY ([子カラム名]) REFERENCES [親テーブル名]([親カラム名]);
ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id);
外部キー削除
ALTER TABLE [テーブル名] DROP FOREIGN KEY [制約名];
ALTER TABLE orders DROP FOREIGN KEY fk_user_id;
テーブルオプション変更
ALTER TABLE [テーブル名] ENGINE=[エンジン名], DEFAULT CHARSET=[文字コード名];
ALTER TABLE users ENGINE=InnoDB, DEFAULT CHARSET=utf8mb4;

テーブル削除 (DROP TABLE)

指定したテーブルを完全に削除します。注意: テーブル定義とデータがすべて失われます! 復元は困難です。🚨

DROP TABLE [テーブル名];

例: `temporary_data` テーブルを削除

DROP TABLE temporary_data;

存在する場合のみ削除 (エラー回避):

DROP TABLE IF EXISTS [テーブル名];

複数のテーブルを一度に削除:

DROP TABLE [テーブル名1], [テーブル名2], ...;

テーブル名変更 (RENAME TABLE)

テーブルの名前を変更します。

RENAME TABLE [旧テーブル名] TO [新テーブル名];

例: `customers` テーブルを `clients` に変更

RENAME TABLE customers TO clients;

複数のテーブル名を一度に変更:

RENAME TABLE old_users TO users, old_products TO products;

一時テーブル (TEMPORARY TABLE)

現在のセッション内でのみ有効な一時テーブルを作成します。セッション終了時に自動的に削除されます。

CREATE TEMPORARY TABLE [一時テーブル名] ( ... );

例: 一時的なユーザーリストを作成

CREATE TEMPORARY TABLE temp_user_list (
   user_id INT PRIMARY KEY,
   name VARCHAR(100)
 );

既存のテーブルと同じ構造の一時テーブルを作成:

CREATE TEMPORARY TABLE temp_users LIKE users;

SELECT結果から一時テーブルを作成:

CREATE TEMPORARY TABLE active_users AS SELECT id, username FROM users WHERE status = 'active';

データ操作 (CRUD) 📝

テーブル内のデータを操作するコマンド (作成、読み取り、更新、削除) です。

データ挿入 (INSERT)

テーブルに新しい行(レコード)を追加します。

基本的なINSERT (全カラムに値を指定): カラムリストを省略する場合は、テーブル定義のカラム順にVALUES句で値を指定します。

INSERT INTO [テーブル名] VALUES ([値1], [値2], ...);

例: `users` テーブルにデータを挿入 (idはAUTO_INCREMENT)

INSERT INTO users VALUES (NULL, 'john_doe', 'john@example.com', NOW());

カラムを指定してINSERT: 特定のカラムに値を挿入します。指定しないカラムにはデフォルト値やNULLが入ります。

INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES ([値1], [値2], ...);

例: `users` テーブルの `username` と `email` を指定して挿入

INSERT INTO users (username, email) VALUES ('jane_smith', 'jane@example.com');

複数行INSERT: 一度のINSERT文で複数の行を追加します。効率的です✨。

INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES
  ([行1の値1], [行1の値2], ...),
  ([行2の値1], [行2の値2], ...),
  ...;

例: `products` テーブルに複数の商品を追加

INSERT INTO products (name, price, category) VALUES
  ('Laptop', 120000, 'Electronics'),
  ('Mouse', 3000, 'Electronics'),
  ('Keyboard', 5000, 'Electronics');

INSERT IGNORE: 主キーやユニークキーの重複エラーが発生した場合、その行の挿入を無視して処理を続行します。

INSERT IGNORE INTO [テーブル名] (...) VALUES (...);

ON DUPLICATE KEY UPDATE: 主キーやユニークキーが重複した場合、挿入の代わりに指定したカラムを更新します。

INSERT INTO [テーブル名] ([カラム名1], [カラム名2], ...) VALUES ([値1], [値2], ...)
ON DUPLICATE KEY UPDATE [更新カラム名1] = [更新値1], [更新カラム名2] = [更新値2], ...;

例: ユーザーが存在すればメールアドレスを更新、存在しなければ新規作成

INSERT INTO users (username, email) VALUES ('existing_user', 'new_email@example.com')
ON DUPLICATE KEY UPDATE email = VALUES(email); -- VALUES(カラム名)で挿入しようとした値を使用

SELECT結果をINSERT: 他のテーブルからSELECTした結果を挿入します。

INSERT INTO [ターゲットテーブル名] ([カラム名1], ...)
SELECT [ソースカラム名1], ... FROM [ソーステーブル名] WHERE [条件];

例: `active_users` テーブルに `users` テーブルのアクティブユーザーをコピー

INSERT INTO active_users (user_id, name)
SELECT id, username FROM users WHERE status = 'active';

データ取得 (SELECT)

テーブルからデータを検索・取得します。

全カラム取得: テーブルのすべての行とカラムを取得します。

SELECT * FROM [テーブル名];

例: `users` テーブルの全データを取得

SELECT * FROM users;

特定カラム取得: 指定したカラムのみを取得します。

SELECT [カラム名1], [カラム名2], ... FROM [テーブル名];

例: `users` テーブルから `username` と `email` を取得

SELECT username, email FROM users;

カラムに別名をつける (AS):

SELECT username AS ユーザー名, email AS メールアドレス FROM users;

条件指定 (WHERE): 特定の条件に一致する行のみを取得します。

SELECT [カラム名リスト] FROM [テーブル名] WHERE [条件];

例: `users` テーブルから `id` が 1 のユーザーを取得

SELECT * FROM users WHERE id = 1;

例: `products` テーブルから価格が 10000 より大きい商品を取得

SELECT * FROM products WHERE price > 10000;

比較演算子: `=`, `!=` (<>), `>`, `<`, `>=`, `<=`

論理演算子: `AND`, `OR`, `NOT`

例: カテゴリが ‘Electronics’ で価格が 5000 未満の商品

SELECT * FROM products WHERE category = 'Electronics' AND price < 5000;

その他の条件:

  • `IN`: リスト内のいずれかの値に一致
    WHERE status IN ('active', 'pending')
  • `BETWEEN`: 範囲内にある
    WHERE price BETWEEN 1000 AND 5000
  • `LIKE`: パターンマッチング (`%`: 任意文字列, `_`: 任意1文字)
    WHERE email LIKE '%@example.com'
  • `IS NULL`: NULL値である
    WHERE deleted_at IS NULL
  • `IS NOT NULL`: NULL値でない
    WHERE email IS NOT NULL

結果の並び替え (ORDER BY): 取得した結果を指定したカラムで並び替えます。

SELECT [カラム名リスト] FROM [テーブル名] WHERE [条件] ORDER BY [カラム名1] [ASC|DESC], [カラム名2] [ASC|DESC], ...;

`ASC`: 昇順 (デフォルト), `DESC`: 降順

例: `users` テーブルを作成日時の降順で取得

SELECT * FROM users ORDER BY created_at DESC;

例: `products` をカテゴリ昇順、価格降順で取得

SELECT * FROM products ORDER BY category ASC, price DESC;

取得件数制限 (LIMIT): 取得する行数を制限します。

SELECT [カラム名リスト] FROM [テーブル名] LIMIT [件数];

例: 最新のユーザーを5件取得

SELECT * FROM users ORDER BY created_at DESC LIMIT 5;

オフセット指定 (ページネーション等で使用):

SELECT [カラム名リスト] FROM [テーブル名] LIMIT [オフセット], [件数]; -- オフセットは0始まり

例: 11件目から10件取得 (2ページ目)

SELECT * FROM products ORDER BY id LIMIT 10, 10;

集計関数: データの集計を行います。

  • `COUNT()`: 行数をカウント
    SELECT COUNT(*) FROM users;
  • `SUM()`: 合計値を計算
    SELECT SUM(price) FROM products;
  • `AVG()`: 平均値を計算
    SELECT AVG(price) FROM products;
  • `MAX()`: 最大値を取得
    SELECT MAX(price) FROM products;
  • `MIN()`: 最小値を取得
    SELECT MIN(created_at) FROM users;

例: アクティブユーザーの数をカウント

SELECT COUNT(*) AS active_user_count FROM users WHERE status = 'active';

グループ化 (GROUP BY): 特定のカラムの値ごとにデータをグループ化し、集計関数を適用します。

SELECT [カラム名1], [集計関数]([カラム名2]) FROM [テーブル名] GROUP BY [カラム名1];

例: カテゴリごとの商品数をカウント

SELECT category, COUNT(*) FROM products GROUP BY category;

グループ化した結果に条件を指定 (HAVING): WHERE句はグループ化前の行に適用され、HAVING句はグループ化後の結果に適用されます。

SELECT category, AVG(price) AS avg_price FROM products GROUP BY category HAVING avg_price > 5000;

テーブル結合 (JOIN): 複数のテーブルを関連付けてデータを取得します。

種類 説明 構文例
INNER JOIN 両方のテーブルに結合キーが存在する行のみを取得 (内部結合)
SELECT u.username, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
LEFT JOIN (または LEFT OUTER JOIN) 左テーブルのすべての行と、右テーブルの一致する行を取得。一致しない場合は右テーブルのカラムはNULL (左外部結合)
SELECT u.username, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id; -- 注文履歴のないユーザーも表示
RIGHT JOIN (または RIGHT OUTER JOIN) 右テーブルのすべての行と、左テーブルの一致する行を取得。一致しない場合は左テーブルのカラムはNULL (右外部結合)
SELECT u.username, o.order_date
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id; -- ユーザー不明の注文も表示 (通常あまり使われない)
CROSS JOIN 両テーブルの行のすべての組み合わせを取得 (デカルト積)。結合条件なし。
SELECT * FROM users CROSS JOIN departments; -- usersの全行 * departmentsの全行

結合条件は `ON` 句で指定します。テーブル名が長い場合は別名 (エイリアス) を使うと便利です。

サブクエリ: クエリの中に別のクエリを埋め込みます。

例: 平均価格より高い商品を取得

SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products);

例: 注文履歴のあるユーザーを取得

SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);

結果の結合 (UNION / UNION ALL): 複数のSELECT文の結果を縦に結合します。

  • `UNION`: 重複行を除外して結合します。
  • `UNION ALL`: 重複行を含めて結合します (高速)。

結合するSELECT文のカラム数とデータ型は一致させる必要があります。

SELECT id, name FROM active_users
UNION ALL
SELECT id, name FROM inactive_users;

データ更新 (UPDATE)

既存の行のデータを変更します。注意: WHERE句を省略すると、テーブル内のすべての行が更新されてしまいます! 必ず条件を指定してください。🚨

UPDATE [テーブル名] SET [カラム名1] = [新しい値1], [カラム名2] = [新しい値2], ... WHERE [条件];

例: `id` が 1 のユーザーのメールアドレスを更新

UPDATE users SET email = 'new_john@example.com' WHERE id = 1;

例: 全商品の価格を10%上げる

UPDATE products SET price = price * 1.1; -- WHERE句がないので全件更新される

他のテーブルの値を使って更新 (JOINを使用):

UPDATE orders o
JOIN users u ON o.user_id = u.id
SET o.user_email = u.email
WHERE o.user_email IS NULL;

データ削除 (DELETE)

テーブルから行を削除します。注意: WHERE句を省略すると、テーブル内のすべての行が削除されてしまいます! 必ず条件を指定してください。🚨

DELETE FROM [テーブル名] WHERE [条件];

例: `status` が ‘inactive’ のユーザーを削除

DELETE FROM users WHERE status = 'inactive';

例: 特定の注文を削除

DELETE FROM orders WHERE order_id = 1001;

他のテーブルの条件を使って削除 (JOINを使用):

DELETE o FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.status = 'deleted';

全件削除 (TRUNCATE TABLE): テーブル内のすべての行を高速に削除します。DELETEと異なり、WHERE句は使えません。トランザクションログに記録されない場合があり、ロールバックできないことがあります。AUTO_INCREMENTの値もリセットされます。

TRUNCATE TABLE [テーブル名];

例: `logs` テーブルの全データを削除

TRUNCATE TABLE logs;

インデックス操作 🔍

検索パフォーマンスを向上させるためのインデックスに関する操作です。

インデックス表示

テーブルに設定されているインデックスの一覧を表示します。

SHOW INDEX FROM [テーブル名];

または

SHOW INDEXES FROM [テーブル名];

または

SHOW KEYS FROM [テーブル名];

例: `users` テーブルのインデックスを表示

SHOW INDEX FROM users;

インデックス作成

新しいインデックスを作成します。

CREATE INDEX [インデックス名] ON [テーブル名] ([カラム名1], [カラム名2], ...);

例: `users` テーブルの `email` カラムにインデックスを作成

CREATE INDEX idx_email ON users (email);

ユニークインデックスを作成 (重複を許さない):

CREATE UNIQUE INDEX [インデックス名] ON [テーブル名] ([カラム名]);

例: `products` テーブルの `product_code` にユニークインデックスを作成

CREATE UNIQUE INDEX uidx_product_code ON products (product_code);

フルテキストインデックスを作成 (全文検索用、MyISAMやInnoDBで使用可能):

CREATE FULLTEXT INDEX ft_idx_description ON articles (title, body);

インデックス作成は `ALTER TABLE` でも可能です:

ALTER TABLE [テーブル名] ADD INDEX [インデックス名] ([カラム名]);

インデックス削除

既存のインデックスを削除します。

DROP INDEX [インデックス名] ON [テーブル名];

例: `users` テーブルから `idx_email` インデックスを削除

DROP INDEX idx_email ON users;

インデックス削除は `ALTER TABLE` でも可能です:

ALTER TABLE [テーブル名] DROP INDEX [インデックス名];

ユーザーと権限管理 👤🔑

MySQLユーザーの作成、権限の付与・剥奪、削除、パスワード変更などを行います。

ユーザー一覧表示

MySQLに登録されているユーザーの一覧を表示します。

SELECT user, host FROM mysql.user;

ユーザー作成

新しいMySQLユーザーを作成します。`IDENTIFIED BY` でパスワードを設定します。

CREATE USER '[ユーザー名]'@'[ホスト名]' IDENTIFIED BY '[パスワード]';

`ホスト名`には、接続を許可するホストを指定します。

  • `localhost`: ローカルホストからの接続のみ許可
  • `’%’`: 任意のホストからの接続を許可 (セキュリティに注意⚠️)
  • `’192.168.1.%’`: 特定のIPアドレス範囲からの接続を許可

例: ローカルホストからのみ接続可能な `appuser` を作成

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password123';

例: 任意のホストから接続可能な `remoteuser` を作成

CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'strongPassword!@#';

存在しない場合のみ作成:

CREATE USER IF NOT EXISTS 'appuser'@'localhost' IDENTIFIED BY 'password123';

権限付与 (GRANT)

ユーザーにデータベースやテーブルへのアクセス権限を与えます。

GRANT [権限リスト] ON [データベース名].[テーブル名] TO '[ユーザー名]'@'[ホスト名]';

主な権限:

  • `ALL PRIVILEGES`: すべての権限
  • `SELECT`: データ読み取り
  • `INSERT`: データ挿入
  • `UPDATE`: データ更新
  • `DELETE`: データ削除
  • `CREATE`: データベースやテーブルの作成
  • `ALTER`: テーブル構造の変更
  • `DROP`: データベースやテーブルの削除
  • `INDEX`: インデックスの作成・削除
  • `EXECUTE`: ストアドプロシージャの実行
  • `GRANT OPTION`: 他のユーザーに権限を付与する権限

`[データベース名].[テーブル名]` の指定:

  • `*.*`: すべてのデータベースのすべてのテーブル
  • `[データベース名].*`: 特定のデータベースのすべてのテーブル
  • `[データベース名].[テーブル名]`: 特定のテーブル

例: `appuser` に `myapp_db` データベースのすべてのテーブルに対する SELECT, INSERT, UPDATE, DELETE 権限を付与

GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'appuser'@'localhost';

例: `adminuser` にすべての権限を付与 (GRANT OPTION付き)

GRANT ALL PRIVILEGES ON *.* TO 'adminuser'@'localhost' WITH GRANT OPTION;

権限設定を反映させる:

FLUSH PRIVILEGES;

(通常、GRANT文実行時に自動で反映されますが、手動で反映させたい場合に実行します)

権限確認 (SHOW GRANTS)

指定したユーザーに付与されている権限を確認します。

SHOW GRANTS FOR '[ユーザー名]'@'[ホスト名]';

例: `appuser@localhost` の権限を確認

SHOW GRANTS FOR 'appuser'@'localhost';

現在ログインしているユーザー自身の権限を確認:

SHOW GRANTS;

権限剥奪 (REVOKE)

ユーザーから権限を取り消します。GRANT文と対になる構文です。

REVOKE [権限リスト] ON [データベース名].[テーブル名] FROM '[ユーザー名]'@'[ホスト名]';

例: `appuser` から `myapp_db` に対する DELETE 権限を剥奪

REVOKE DELETE ON myapp_db.* FROM 'appuser'@'localhost';

例: `adminuser` から GRANT OPTION を剥奪

REVOKE GRANT OPTION ON *.* FROM 'adminuser'@'localhost';

権限設定を反映させる:

FLUSH PRIVILEGES;

ユーザー削除 (DROP USER)

指定したユーザーをMySQLから削除します。

DROP USER '[ユーザー名]'@'[ホスト名]';

例: `olduser` を削除

DROP USER 'olduser'@'localhost';

存在する場合のみ削除:

DROP USER IF EXISTS 'olduser'@'localhost';

パスワード変更

既存ユーザーのパスワードを変更します。

自分のパスワードを変更 (MySQL 5.7.6以降):

ALTER USER USER() IDENTIFIED BY '[新しいパスワード]';

他のユーザーのパスワードを変更 (管理者権限が必要):

ALTER USER '[ユーザー名]'@'[ホスト名]' IDENTIFIED BY '[新しいパスワード]';

例: `appuser@localhost` のパスワードを変更

ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'newSecurePassword456';

古いバージョン (MySQL 5.7.5以前) でのパスワード変更:

SET PASSWORD FOR '[ユーザー名]'@'[ホスト名]' = PASSWORD('[新しいパスワード]');

PASSWORD() 関数はMySQL 8.0で廃止されました。

バックアップとリストア 💾🔄

データベースのバックアップ (エクスポート) とリストア (インポート) 方法です。主にシェルコマンド `mysqldump` と `mysql` を使用します。

バックアップ (mysqldump)

`mysqldump` コマンドは、データベースの構造やデータをSQL形式で出力します。

全データベースをバックアップ:

mysqldump -u [ユーザー名] -p --all-databases > backup_all.sql

特定のイベントやルーチンも含める場合:

mysqldump -u [ユーザー名] -p --all-databases --routines --events > backup_all_full.sql

特定のデータベースをバックアップ:

mysqldump -u [ユーザー名] -p [データベース名] > backup_[データベース名].sql

例: `myapp_db` をバックアップ

mysqldump -u root -p myapp_db > backup_myapp_db.sql

複数のデータベースをバックアップ:

mysqldump -u [ユーザー名] -p --databases [データベース名1] [データベース名2] ... > backup_multi_db.sql

特定のテーブルのみをバックアップ:

mysqldump -u [ユーザー名] -p [データベース名] [テーブル名1] [テーブル名2] ... > backup_[テーブル名].sql

例: `myapp_db` の `users` と `orders` テーブルをバックアップ

mysqldump -u root -p myapp_db users orders > backup_users_orders.sql

構造のみバックアップ (データなし):

mysqldump -u [ユーザー名] -p --no-data [データベース名] > backup_structure.sql

データのみバックアップ (構造なし):

mysqldump -u [ユーザー名] -p --no-create-info [データベース名] > backup_data.sql

圧縮しながらバックアップ (gzipを使用):

mysqldump -u [ユーザー名] -p [データベース名] | gzip > backup_[データベース名].sql.gz

リストア (mysqlコマンド)

`mysql` コマンドを使用して、`mysqldump` で作成したSQLファイルを実行し、データを復元します。

SQLファイルからリストア:

まず、リストア先のデータベースが存在しない場合は作成します (mysqldumpにCREATE DATABASE文が含まれていない場合)。

mysql -u [ユーザー名] -p -e "CREATE DATABASE IF NOT EXISTS [データベース名];"

SQLファイルを実行してリストア:

mysql -u [ユーザー名] -p [データベース名] < backup_[データベース名].sql

例: `myapp_db` にリストア

mysql -u root -p myapp_db < backup_myapp_db.sql

全データベースのバックアップファイルからリストア:

mysql -u [ユーザー名] -p < backup_all.sql

圧縮されたバックアップファイルからリストア (gzipを使用):

gunzip < backup_[データベース名].sql.gz | mysql -u [ユーザー名] -p [データベース名]

注意: リストア操作は既存のデータを上書きする可能性があります。実行前に必ず確認し、必要であればリストア先のバックアップを取得してください。🚨

その他便利なコマンド・機能 ✨

MySQLクライアントやサーバーに関する情報表示や、操作を補助するコマンドです。

SQLファイル実行

SQL文が記述されたファイルを実行します。

mysqlクライアント内から:

source [ファイルパス];

または

\. [ファイルパス]

例:

source /path/to/my_script.sql;

コマンドラインから (リストアと同様):

mysql -u [ユーザー名] -p [データベース名] < [ファイルパス]

コマンド履歴

mysqlクライアント内で過去に実行したコマンドを確認できます。

履歴ファイルの場所は環境によって異なりますが、通常は `~/.mysql_history` です。

クライアント内で上下矢印キーを使うことで履歴を呼び出せます。

履歴を無効にするには:

mysql --histignore="*" ... (接続オプション)

または、クライアント内で環境変数 `MYSQL_HISTIGNORE` を設定します。

サーバー状態表示 (STATUS)

現在の接続情報、サーバーバージョン、稼働時間などのステータスを表示します。

STATUS;

または

\s

変数表示 (SHOW VARIABLES)

MySQLサーバーのシステム変数の値を表示します。

すべての変数を表示:

SHOW VARIABLES;

特定の変数を表示 (LIKEを使用):

SHOW VARIABLES LIKE '[パターン]';

例: 文字コード関連の変数を表示

SHOW VARIABLES LIKE '%char%';

例: `max_connections` の値を表示

SHOW VARIABLES LIKE 'max_connections';

セッション変数とグローバル変数を区別して表示:

SHOW SESSION VARIABLES LIKE '...'; -- 現在のセッションのみ
SHOW GLOBAL VARIABLES LIKE '...';  -- サーバー全体の設定

変数設定 (SET)

セッション変数やグローバル変数の値を変更します。

セッション変数を設定:

SET SESSION [変数名] = [値];

または (SESSIONはデフォルト)

SET [変数名] = [値];

例: SQLモードを変更

SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,...';

グローバル変数を設定 (SUPER権限が必要): サーバー全体の設定を変更します。再起動後も有効にするには設定ファイル (my.cnf / my.ini) の変更が必要です。

SET GLOBAL [変数名] = [値];

例: 最大接続数を変更

SET GLOBAL max_connections = 500;

ヘルプ表示 (help)

mysqlクライアント内でSQL文やコマンドのヘルプを表示します。

help [キーワード];

例: SELECT文のヘルプを表示

help SELECT;

例: データ型のヘルプを表示

help data types;

利用可能なヘルプトピック一覧:

help contents;

実行計画表示 (EXPLAIN)

SELECT, DELETE, INSERT, REPLACE, UPDATE文がどのように実行されるか(インデックスの使用状況、テーブルの結合順序など)を表示します。クエリのパフォーマンスチューニングに不可欠です🚀。

EXPLAIN [SQL文];

例: usersテーブルの検索クエリの実行計画を表示

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

より詳細な情報を表示 (JSON形式など):

EXPLAIN FORMAT=JSON SELECT ...;
EXPLAIN ANALYZE SELECT ...; -- MySQL 8.0.18以降: 実際にクエリを実行して計測情報も表示

コメント

タイトルとURLをコピーしました