接続と切断
MySQLサーバーへの接続方法と切断方法の色々なパターンです。
基本的な接続
ユーザー名のみを指定して接続します。パスワードは後で聞かれます。
例: ユーザー `root` で接続
ホスト、ポート、ユーザー、パスワードを指定して接続
接続に必要な情報をすべてコマンドラインで指定します。-p
の直後にパスワードを続けると、プロンプトなしで接続できます(履歴に残るため注意が必要です)。
例: ホスト `192.168.1.100`、ポート `3307`、ユーザー `admin`、パスワード `secret123` で接続
パスワードを安全に入力する場合:
特定のデータベースに接続
接続と同時に使用するデータベースを指定します。
例: ホスト `localhost`、ユーザー `appuser`、データベース `myapp_db` に接続
Unixソケットファイルを使用して接続
ローカルホストで、TCP/IPではなくソケットファイルを使って接続する場合に指定します。
例: ユーザー `root` で `/var/run/mysqld/mysqld.sock` を使用して接続
SSLを使用して接続
SSL/TLSで暗号化された接続を使用する場合のオプションです。サーバー側の設定も必要です。
SSL接続を必須にする場合:
利用可能なSSLモード: DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
切断
MySQLプロンプトからサーバーとの接続を切断します。
または
または Ctrl+D (多くの環境で)
データベース操作
データベースのリスト表示、作成、選択、削除に関するコマンドです。
データベース一覧表示
サーバー上に存在するデータベースの一覧を表示します。
データベース作成
新しいデータベースを作成します。
文字コードや照合順序を指定して作成する場合:
例: 文字コード `utf8mb4`、照合順序 `utf8mb4_general_ci` で `my_new_db` を作成
既に存在しない場合のみ作成 (エラー回避):
データベース選択
これ以降のSQL操作の対象となるデフォルトデータベースを選択(切り替え)します。
例: `myapp_db` を選択
現在選択中のデータベースを確認:
データベース削除
指定したデータベースを完全に削除します。注意: データベース内のすべてのテーブルとデータが失われます! 復元は困難です。
例: `old_db` を削除
存在する場合のみ削除 (エラー回避):
テーブル操作
テーブルの構造に関する操作(一覧、定義表示、作成、変更、削除)です。
テーブル一覧表示
現在選択中のデータベース内にあるテーブルの一覧を表示します。
特定のデータベースのテーブル一覧を表示:
例: `information_schema` データベースのテーブル一覧
テーブル構造表示
指定したテーブルのカラム定義(データ型、NULL許容、キー情報など)を表示します。
または
または、より詳細な情報:
テーブルを作成したSQL文を表示 (ストレージエンジンや文字コードも確認可能):
テーブル作成 (CREATE TABLE)
新しいテーブルを作成します。
例: `users` テーブルを作成
主なデータ型:
- 数値型: `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以降)
既に存在しない場合のみ作成:
テーブル変更 (ALTER TABLE)
既存のテーブル構造を変更します。
操作 | 構文 | 例 |
---|---|---|
カラム追加 | ||
カラム型変更 | ||
カラム名変更 | ||
カラム削除 | ||
主キー追加 | ||
主キー削除 | ||
インデックス追加 | ||
ユニーク制約追加 | ||
インデックス削除 | ||
外部キー追加 | ||
外部キー削除 | ||
テーブルオプション変更 |
テーブル削除 (DROP TABLE)
指定したテーブルを完全に削除します。注意: テーブル定義とデータがすべて失われます! 復元は困難です。
例: `temporary_data` テーブルを削除
存在する場合のみ削除 (エラー回避):
複数のテーブルを一度に削除:
テーブル名変更 (RENAME TABLE)
テーブルの名前を変更します。
例: `customers` テーブルを `clients` に変更
複数のテーブル名を一度に変更:
一時テーブル (TEMPORARY TABLE)
現在のセッション内でのみ有効な一時テーブルを作成します。セッション終了時に自動的に削除されます。
例: 一時的なユーザーリストを作成
既存のテーブルと同じ構造の一時テーブルを作成:
SELECT結果から一時テーブルを作成:
データ操作 (CRUD)
テーブル内のデータを操作するコマンド (作成、読み取り、更新、削除) です。
データ挿入 (INSERT)
テーブルに新しい行(レコード)を追加します。
基本的なINSERT (全カラムに値を指定): カラムリストを省略する場合は、テーブル定義のカラム順にVALUES句で値を指定します。
例: `users` テーブルにデータを挿入 (idはAUTO_INCREMENT)
カラムを指定してINSERT: 特定のカラムに値を挿入します。指定しないカラムにはデフォルト値やNULLが入ります。
例: `users` テーブルの `username` と `email` を指定して挿入
複数行INSERT: 一度のINSERT文で複数の行を追加します。効率的です。
例: `products` テーブルに複数の商品を追加
INSERT IGNORE: 主キーやユニークキーの重複エラーが発生した場合、その行の挿入を無視して処理を続行します。
ON DUPLICATE KEY UPDATE: 主キーやユニークキーが重複した場合、挿入の代わりに指定したカラムを更新します。
例: ユーザーが存在すればメールアドレスを更新、存在しなければ新規作成
SELECT結果をINSERT: 他のテーブルからSELECTした結果を挿入します。
例: `active_users` テーブルに `users` テーブルのアクティブユーザーをコピー
データ取得 (SELECT)
テーブルからデータを検索・取得します。
全カラム取得: テーブルのすべての行とカラムを取得します。
例: `users` テーブルの全データを取得
特定カラム取得: 指定したカラムのみを取得します。
例: `users` テーブルから `username` と `email` を取得
カラムに別名をつける (AS):
条件指定 (WHERE): 特定の条件に一致する行のみを取得します。
例: `users` テーブルから `id` が 1 のユーザーを取得
例: `products` テーブルから価格が 10000 より大きい商品を取得
比較演算子: `=`, `!=` (<>), `>`, `<`, `>=`, `<=`
論理演算子: `AND`, `OR`, `NOT`
例: カテゴリが ‘Electronics’ で価格が 5000 未満の商品
その他の条件:
- `IN`: リスト内のいずれかの値に一致
- `BETWEEN`: 範囲内にある
- `LIKE`: パターンマッチング (`%`: 任意文字列, `_`: 任意1文字)
- `IS NULL`: NULL値である
- `IS NOT NULL`: NULL値でない
結果の並び替え (ORDER BY): 取得した結果を指定したカラムで並び替えます。
`ASC`: 昇順 (デフォルト), `DESC`: 降順
例: `users` テーブルを作成日時の降順で取得
例: `products` をカテゴリ昇順、価格降順で取得
取得件数制限 (LIMIT): 取得する行数を制限します。
例: 最新のユーザーを5件取得
オフセット指定 (ページネーション等で使用):
例: 11件目から10件取得 (2ページ目)
集計関数: データの集計を行います。
- `COUNT()`: 行数をカウント
- `SUM()`: 合計値を計算
- `AVG()`: 平均値を計算
- `MAX()`: 最大値を取得
- `MIN()`: 最小値を取得
例: アクティブユーザーの数をカウント
グループ化 (GROUP BY): 特定のカラムの値ごとにデータをグループ化し、集計関数を適用します。
例: カテゴリごとの商品数をカウント
グループ化した結果に条件を指定 (HAVING): WHERE句はグループ化前の行に適用され、HAVING句はグループ化後の結果に適用されます。
テーブル結合 (JOIN): 複数のテーブルを関連付けてデータを取得します。
種類 | 説明 | 構文例 |
---|---|---|
INNER JOIN | 両方のテーブルに結合キーが存在する行のみを取得 (内部結合) | |
LEFT JOIN (または LEFT OUTER JOIN) | 左テーブルのすべての行と、右テーブルの一致する行を取得。一致しない場合は右テーブルのカラムはNULL (左外部結合) | |
RIGHT JOIN (または RIGHT OUTER JOIN) | 右テーブルのすべての行と、左テーブルの一致する行を取得。一致しない場合は左テーブルのカラムはNULL (右外部結合) | |
CROSS JOIN | 両テーブルの行のすべての組み合わせを取得 (デカルト積)。結合条件なし。 |
結合条件は `ON` 句で指定します。テーブル名が長い場合は別名 (エイリアス) を使うと便利です。
サブクエリ: クエリの中に別のクエリを埋め込みます。
例: 平均価格より高い商品を取得
例: 注文履歴のあるユーザーを取得
結果の結合 (UNION / UNION ALL): 複数のSELECT文の結果を縦に結合します。
- `UNION`: 重複行を除外して結合します。
- `UNION ALL`: 重複行を含めて結合します (高速)。
結合するSELECT文のカラム数とデータ型は一致させる必要があります。
データ更新 (UPDATE)
既存の行のデータを変更します。注意: WHERE句を省略すると、テーブル内のすべての行が更新されてしまいます! 必ず条件を指定してください。
例: `id` が 1 のユーザーのメールアドレスを更新
例: 全商品の価格を10%上げる
他のテーブルの値を使って更新 (JOINを使用):
データ削除 (DELETE)
テーブルから行を削除します。注意: WHERE句を省略すると、テーブル内のすべての行が削除されてしまいます! 必ず条件を指定してください。
例: `status` が ‘inactive’ のユーザーを削除
例: 特定の注文を削除
他のテーブルの条件を使って削除 (JOINを使用):
全件削除 (TRUNCATE TABLE): テーブル内のすべての行を高速に削除します。DELETEと異なり、WHERE句は使えません。トランザクションログに記録されない場合があり、ロールバックできないことがあります。AUTO_INCREMENTの値もリセットされます。
例: `logs` テーブルの全データを削除
インデックス操作
検索パフォーマンスを向上させるためのインデックスに関する操作です。
インデックス表示
テーブルに設定されているインデックスの一覧を表示します。
または
または
例: `users` テーブルのインデックスを表示
インデックス作成
新しいインデックスを作成します。
例: `users` テーブルの `email` カラムにインデックスを作成
ユニークインデックスを作成 (重複を許さない):
例: `products` テーブルの `product_code` にユニークインデックスを作成
フルテキストインデックスを作成 (全文検索用、MyISAMやInnoDBで使用可能):
インデックス作成は `ALTER TABLE` でも可能です:
インデックス削除
既存のインデックスを削除します。
例: `users` テーブルから `idx_email` インデックスを削除
インデックス削除は `ALTER TABLE` でも可能です:
ユーザーと権限管理
MySQLユーザーの作成、権限の付与・剥奪、削除、パスワード変更などを行います。
ユーザー一覧表示
MySQLに登録されているユーザーの一覧を表示します。
ユーザー作成
新しいMySQLユーザーを作成します。`IDENTIFIED BY` でパスワードを設定します。
`ホスト名`には、接続を許可するホストを指定します。
- `localhost`: ローカルホストからの接続のみ許可
- `’%’`: 任意のホストからの接続を許可 (セキュリティに注意)
- `’192.168.1.%’`: 特定のIPアドレス範囲からの接続を許可
例: ローカルホストからのみ接続可能な `appuser` を作成
例: 任意のホストから接続可能な `remoteuser` を作成
存在しない場合のみ作成:
権限付与 (GRANT)
ユーザーにデータベースやテーブルへのアクセス権限を与えます。
主な権限:
- `ALL PRIVILEGES`: すべての権限
- `SELECT`: データ読み取り
- `INSERT`: データ挿入
- `UPDATE`: データ更新
- `DELETE`: データ削除
- `CREATE`: データベースやテーブルの作成
- `ALTER`: テーブル構造の変更
- `DROP`: データベースやテーブルの削除
- `INDEX`: インデックスの作成・削除
- `EXECUTE`: ストアドプロシージャの実行
- `GRANT OPTION`: 他のユーザーに権限を付与する権限
`[データベース名].[テーブル名]` の指定:
- `*.*`: すべてのデータベースのすべてのテーブル
- `[データベース名].*`: 特定のデータベースのすべてのテーブル
- `[データベース名].[テーブル名]`: 特定のテーブル
例: `appuser` に `myapp_db` データベースのすべてのテーブルに対する SELECT, INSERT, UPDATE, DELETE 権限を付与
例: `adminuser` にすべての権限を付与 (GRANT OPTION付き)
権限設定を反映させる:
(通常、GRANT文実行時に自動で反映されますが、手動で反映させたい場合に実行します)
権限確認 (SHOW GRANTS)
指定したユーザーに付与されている権限を確認します。
例: `appuser@localhost` の権限を確認
現在ログインしているユーザー自身の権限を確認:
権限剥奪 (REVOKE)
ユーザーから権限を取り消します。GRANT文と対になる構文です。
例: `appuser` から `myapp_db` に対する DELETE 権限を剥奪
例: `adminuser` から GRANT OPTION を剥奪
権限設定を反映させる:
ユーザー削除 (DROP USER)
指定したユーザーをMySQLから削除します。
例: `olduser` を削除
存在する場合のみ削除:
パスワード変更
既存ユーザーのパスワードを変更します。
自分のパスワードを変更 (MySQL 5.7.6以降):
他のユーザーのパスワードを変更 (管理者権限が必要):
例: `appuser@localhost` のパスワードを変更
古いバージョン (MySQL 5.7.5以前) でのパスワード変更:
PASSWORD()
関数はMySQL 8.0で廃止されました。
バックアップとリストア
データベースのバックアップ (エクスポート) とリストア (インポート) 方法です。主にシェルコマンド `mysqldump` と `mysql` を使用します。
バックアップ (mysqldump)
`mysqldump` コマンドは、データベースの構造やデータをSQL形式で出力します。
全データベースをバックアップ:
特定のイベントやルーチンも含める場合:
特定のデータベースをバックアップ:
例: `myapp_db` をバックアップ
複数のデータベースをバックアップ:
特定のテーブルのみをバックアップ:
例: `myapp_db` の `users` と `orders` テーブルをバックアップ
構造のみバックアップ (データなし):
データのみバックアップ (構造なし):
圧縮しながらバックアップ (gzipを使用):
リストア (mysqlコマンド)
`mysql` コマンドを使用して、`mysqldump` で作成したSQLファイルを実行し、データを復元します。
SQLファイルからリストア:
まず、リストア先のデータベースが存在しない場合は作成します (mysqldumpにCREATE DATABASE文が含まれていない場合)。
SQLファイルを実行してリストア:
例: `myapp_db` にリストア
全データベースのバックアップファイルからリストア:
圧縮されたバックアップファイルからリストア (gzipを使用):
注意: リストア操作は既存のデータを上書きする可能性があります。実行前に必ず確認し、必要であればリストア先のバックアップを取得してください。
その他便利なコマンド・機能
MySQLクライアントやサーバーに関する情報表示や、操作を補助するコマンドです。
SQLファイル実行
SQL文が記述されたファイルを実行します。
mysqlクライアント内から:
または
例:
コマンドラインから (リストアと同様):
コマンド履歴
mysqlクライアント内で過去に実行したコマンドを確認できます。
履歴ファイルの場所は環境によって異なりますが、通常は `~/.mysql_history` です。
クライアント内で上下矢印キーを使うことで履歴を呼び出せます。
履歴を無効にするには:
または、クライアント内で環境変数 `MYSQL_HISTIGNORE` を設定します。
サーバー状態表示 (STATUS)
現在の接続情報、サーバーバージョン、稼働時間などのステータスを表示します。
または
変数表示 (SHOW VARIABLES)
MySQLサーバーのシステム変数の値を表示します。
すべての変数を表示:
特定の変数を表示 (LIKEを使用):
例: 文字コード関連の変数を表示
例: `max_connections` の値を表示
セッション変数とグローバル変数を区別して表示:
変数設定 (SET)
セッション変数やグローバル変数の値を変更します。
セッション変数を設定:
または (SESSIONはデフォルト)
例: SQLモードを変更
グローバル変数を設定 (SUPER権限が必要): サーバー全体の設定を変更します。再起動後も有効にするには設定ファイル (my.cnf / my.ini) の変更が必要です。
例: 最大接続数を変更
ヘルプ表示 (help)
mysqlクライアント内でSQL文やコマンドのヘルプを表示します。
例: SELECT文のヘルプを表示
例: データ型のヘルプを表示
利用可能なヘルプトピック一覧:
実行計画表示 (EXPLAIN)
SELECT, DELETE, INSERT, REPLACE, UPDATE文がどのように実行されるか(インデックスの使用状況、テーブルの結合順序など)を表示します。クエリのパフォーマンスチューニングに不可欠です。
例: usersテーブルの検索クエリの実行計画を表示
より詳細な情報を表示 (JSON形式など):