MySQLと向き合うための 現場で使えるデータベース操作・SQLノート

MySQLと向き合うための 現場で使えるデータベース操作・SQLノート
MySQLと向き合うための 現場で使えるデータベース操作・SQLノート

MySQL開発環境のセットアップ

項目バージョンインストールコマンド
macOS14.2
MySQL8.0brew install mysql@8.0

インストールが完了したらCLIでmysqlコマンドを使えるように、環境パスを通しておきます。

~/.zshrc
export PATH="/opt/homebrew/opt/mysql@8.0/bin:$PATH"

mysqlの起動と停止

zsh
$ mysql.server start # 起動
$ mysql.server stop # 停止

MySQLの初期設定

rootユーザーにパスワードを設定する

zsh
$ mysql -u root # rootユーザーでログインします。

以下、MySQLのプロンプトは>で表現します。

sql
> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード'; -- MySQLのプロント上で、rootユーザーに新しいパスワードを設定します。
> FLUSH PRIVILEGES; -- 変更を反映させます。
> exit; # または quit; --MySQLのプロントを終了します。

ここまでの設定が完了したら、新しいパスワードでログインできるか試します。パスワードを入力してログインできたら成功です。

zsh
$ mysql -u root -p

後からrootのパスワードを変更したい場合

MySQLへログイン後、以下を実行することでパスワードを変更できます。

sql
> SET PASSWORD = '[新しいパスワード]';

データベース操作

データベースの作成

sql
> CREATE database [データベース名];

データベースを確認する

sql
> SHOW databases;

データベースへ接続する

sql
> USE [データベース名]

MySQLへログインすると同時に、データベースへ接続することも可能です。

zsh
$ mysql [データベース名] -u [ユーザー名] -p

テーブルを確認する

sql
> SHOW tables;

テーブルのカラムを一覧表示する

sql
> SHOW COLUMNS FROM テーブル名;

データベースを削除する

sql
> CREATE database [データベース名];

データベースのバックアップ

データベースを丸ごとバックアップ(ダンプ)する

次のコマンドで、既存のデータベースをエクスポート(ダンプ)することが可能です。

zsh
$ mysqldump -u root -p [データベース名] > mydb_dump.sql

SQLクエリとしてファイルが保存されます。

データベースをインポートする(外部ファイルのSQLの実行)

mysqlへログインして、新規でデータベースを作成しておきます。

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

mysqlからログアウトして、シェルで以下コマンドを実行します。

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

これでデータベースのテーブルの構造やデータを復元できました。

特定のテーブルをバックアップする

sql
mysqldump -u [ユーザー名] -p[パスワード] [データベース名] [テーブル名] > [バックアップファイル名].sql

外部ファイルのSQLを読み込んで実行する

MySQLにログインした状態でも外部ファイルを取り込んでSQLを実行できます。

sql
> source test.sql

SQLの結果表示

SQL結果を縦表示に整形する

SQLの終端のセミコロン;\Gに変えると、縦表示が可能です。

sql
> SELECT * FROM users\G

SQL結果をlessページャーで表示する

テーブルカラムが多い時や、SQL結果が大量な時に便利です。

下記コマンドでlessを使うようにセットアップします。

sql
> pager less -S

これ以降、通常のSQLクエリを発行すると、結果がlessで表示されるようになります。

操作実行結果備考
u or w半ページ戻る
d半ページ進む
g先頭へ飛ぶ
G最終行へ飛ぶ
n検索
Fファイルの更新を監視して
リアルタイムで反映
ctrl+cで終了
q終了

ページャーを終了するときは以下を実行します。

sql
> nopager;

MySQLクライアントの起動時にカスタム設定を反映させる

> pager less -S のように頻繁に使うコマンドはデフォルトで設定しておきたいものです。MySQLのCLIでは、~/.my.ini にコマンドを書き込むことで、MySQLクライアントの起動時にその設定を自動で実行することができます。

以下、~/.my.iniに書き込む内容です。~/.my.iniファイルが存在しない場合は、新規作成してください。

ini
[client]
pager=less -S

これでSQL実行時に、結果テーブルをlessで開くようになります。

MySQL テーブル&コメント一覧表示

操作したいデータベースを選択:

sql
> USE your_database_name;

テーブル一覧とそれぞれのコメントを表示する:

sql
> SELECT TABLE_NAME, TABLE_COMMENT 
> FROM INFORMATION_SCHEMA.TABLES 
> WHERE TABLE_SCHEMA = '[データベース名]';

MySQLで使用できる主なデータ型

ここでMySQLで使用できる主なデータ型を整理しておきます。

数値型

データ型説明
TINYINT非常に小さい整数
SMALLINT小さい整数
MEDIUMINT中程度の整数
INT or INTEGER標準的な整数
BIGINT大きな整数
DECIMAL or NUMERIC固定小数点数
FLOAT単精度浮動小数点数
DOUBLE倍精度浮動小数点数
BITビット値

日付と時刻型

データ型説明
DATE日付 ('YYYY-MM-DD')
TIME時間 ('HH:MM:SS')
DATETIME日付と時間の組み合わせ ('YYYY-MM-DD HH:MM:SS')
TIMESTAMPタイムスタンプ ('YYYY-MM-DD HH:MM:SS')
YEAR年 (4桁の数値)

文字列型

データ型説明
CHAR固定長文字列
VARCHAR可変長文字列
BINARY固定長バイナリ文字列
VARBINARY可変長バイナリ文字列
BLOBバイナリ大オブジェクト
TEXTテキストデータ
ENUM列挙型(事前定義された値のリストから選択)
SETセット型(複数の値を持つことができる)

スペーシャル型

データ型説明
JSONJSON形式のデータ
GEOMETRY空間データ型(GISデータ)

ちなみに、SQLiteはMySQLと比べてデータ型がかなり少ないので、互換性のアプリを作りたい場合には注意が必要です。

データ操作

レコードを挿入する

TEXT、INT、DATETIMEを挿入する例:

sql
INSERT INTO my_table (title, num, date)
VALUES ('hoge', 1000, NOW());

レコードを更新する

sql
UPDATE `tablename` SET age=17 WHERE id=2;

idが最大値(最後の行)のレコードを更新する

次のクエリは、id カラムがオートインクリメントされている場合に有効です

sql
UPDATE `tablename`
SET age = 17
WHERE id IN (
    SELECT MAX(id) FROM `tablename`
);

MySQLでは自身のテーブルの参照をサブクエリで実行すると、エラーになるので注意が必要です。下記のような書き方はMySQLではできません。

sql
UPDATE `tablename` SET age = 17 WHERE id = (SELECT MAX(id) FROM `tablename`);

オートインクリメントの連番をリセット

sql
ALTER TABLE `tablename` auto_increment = 1;

TRUNCATEでテーブルデータを全件削除

sql
TRUNCATE TABLE `tablename`

DELETE FROM tablename でも全件削除はできますが、TRUNCATEDELETEでは次のような違いがあります。

SQL条件指定処理速度ロールバック
TRUNCATE不可速い不可
DELETE可能遅い可能

ロールバックの必要がなければ、TRUNCATEが良いでしょう。

データ検索

合計値を取得する

以下は my_table テーブルから、dateカラムが2024年1月のデータを合計する例です。

sql
SELECT 
  category_id, 
  SUM(num) AS num_sum
FROM 
  my_table
WHERE 
  date >= '2024-01-01 00:00:00' AND date <= '2024-01-31 23:59:59'
GROUP BY 
  category_id;

category_id ごとの合計値が取得できます。

JOINで複数のテーブルを結合する

次は、INNER JOINを使って2つのテーブルの両方に存在する行のみをセレクトする例です。

sql
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
department_iddepartments テーブルの id が一致する行のみを返します。

GROUP_CONCATで複数の行の値を単一の文字列に結合する

次は、各従業員が持つスキルを一覧表示する例です。GROUP_CONCAT はMySQLやSQLite、MariaDBで使用可能です。

sql
SELECT e.name, GROUP_CONCAT(s.skill ORDER BY s.skill SEPARATOR ', ') AS skills
FROM employees e
JOIN skills s ON e.id = s.employee_id
GROUP BY e.id;

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事