SQLでMySQLをCRUD操作する
データベースとはデータをまとめて保管しておく箱のようなものです。有名なところではマイクロソフトのOffice製品の一つであるAccessがあります。データベースはデータの取り出しや変更に便利で、ほとんどのシステムやWebサービスに使われています。
今回は無償で使えるMySQLというデータベースを用いてデータベースの操作の基本を解説したいと思います。MySQLはMAMPに含まれていますので、MAMPをインストールするとすぐに使えます。
本稿ではMAMPに含まれるMySQLを操作する前提で解説します。
筆者の開発環境
PC:Apple M1 チップ搭載MacBook Air
OS:macOS Ventura 13.6
MAMP:6.8
MySQL:5.7.39
CRUDとは?
データベース操作の基本である
Create(登録)
Read(参照)
Update(更新)
Delete(削除)
の4つの頭文字を合わせたものです。
mysqlコマンドへパスを通す
下記の記事を参考にMAMPに同梱されたmysqlコマンドを使えるようにしておいてください。
Mac編
Windows編
MySQLサーバーへのログイン
予めMAMPを起動し、MySQLサーバーが起動していることを確認してください。
ターミナルを起動し、下記のコマンドを実行してください。MAMPのMySQLの初期アカウントはユーザー名「root」パスワード「root」です。「-p」の後はスペース不要です。
mysql -u root -proot
ちなみに、下記のように「-p」の後にパスワードを続けなければ、マスクした状態で入力が可能になります。普段はできるだけこちらの方法をお使いください。
mysql -u root -p
!!!注意!!!
本番環境では絶対にrootユーザーや推測可能なパスワードを使わないでください!
MySQLサーバーへのログインに成功したら下記のように表示されるかと思います。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 205
Server version: 5.7.39 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
データベースの作成
まずはデータベースを作成しましょう。データベースを操作するための言語をSQLと言います。データベースを作成するSQL文は下記の通りです。
CREATE DATABASE <データベース名> [CHARACTER SET = <文字コード名>, COLLATION = <COLLATION名>];
[]の中はオプションですので必須項目ではありません。最後にセミコロンをつけるのを忘れないように注意してください。また大文字部分は小文字でもかまいません。
下記のSQLを「mysql>」の横から入力してください。
CREATE DATABASE crud;
成功したら下記のメッセージが表示されます。
Query OK, 1 row affected (0.00 sec)
もしエラーが表示されたら、SQL文に誤りがないかよくチェックしてみてください。
念のため、データベースの一覧を表示してみましょう。下記のSQLを発行してください。
show databases;
下記のように表示され、2つ目に「crud」データベースが作成されています。
+--------------------+
| Database |
+--------------------+
| information_schema |
| crud |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
テーブルの作成
先ほど作成した「crud」データベースを選択します。下記のSQLを発行してください。
use crud;
下記のメッセージが表示されれば成功です。
Database changed
それではテーブルを作成しましょう。ちなみにテーブルはエクセルの「シート」と考えてください。データベースが「ブック」です。1つのブックの中に複数のシートがあるように、データベースも種類ごとにデータが格納された複数のテーブルを持ちます。
テーブルを作成するSQL文は下記の通りです。オプションが非常に沢山あるので最もシンプルな形で紹介します。
CREATE TABLE <テーブル名> (<カラム名> <データ型>, ...);
下記のSQLを発行してください。名前とメールアドレスを持つ「users」テーブルを作成します。テーブル名は単数形よりも複数形を用いることが多いです。
idカラムは主キーとします。主キーとは重複のない数字だと今は覚えておいてください。「AUTO_INCREMENT NOT NULL PRIMARY KEY」は定型文と今は考えてください。
nameとemailにはそれぞれ文字列型を設定し文字数を制限しています。NOT NULLはデータ無しを許容しないという意味です。
created_atとupdated_atにはそれぞれデータ作成日時と更新日時が入ります。
なお、SQLを入力する時はセミコロンを入力するまでは何度でも改行して入力することが可能ですので、長いSQLは適宜改行して入力することをオススメします。
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
テーブルの作成に成功した場合、下記のメッセージが表示されます。
Query OK, 0 rows affected (0.01 sec)
念のため、テーブル一覧も確認してみましょう。下記のSQLを発行してください。
show tables;
下記のように表示されれば成功です。
+----------------+
| Tables_in_crud |
+----------------+
| users |
+----------------+
1 row in set (0.00 sec)
データの登録
事前準備は終わりです。早速CRUDのCreateを試してみましょう。テーブルに1つデータを足す時はINSERT文を使います。
INSERT INTO <テーブル名> (<カラム名>, ...) VALUES (<値>, ...);
下記のSQLを発行してください。
INSERT INTO users (name, email) VALUES ('山田太郎', 'taro@example.com');
idはMySQLが自動で採番した数字を登録してくれます。また、created_atとupdated_atは先ほどテーブル作成時に「DEFAULT CURRENT_TIMESTAMP」と指定しましたので、現在日時が自動で登録されます。つまり、nameとemailの値のみ入力すればOKです。
下記のようにメッセージが表示されたら成功です。
Query OK, 1 row affected (0.00 sec)
複数データを一括で登録することもできます。下記のSQLを発行してください。
INSERT INTO users (name, email) VALUES
('山田花子', 'hanako@example.com'),
('田中一郎', 'ichiro@example.com'),
('佐藤恵子', 'keiko@example.com');
下記のようにメッセージが表示されたら成功です。
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
データの参照
次は実際に登録されたデータを取得してみましょう。CRUDのReadです。データを取得する時はSELECT文を使います。
SELECT <カラム名>, ... FROM <テーブル名>;
全てのデータを取得してみましょう。下記のSQLを発行してください。「*」(アスタリスク)は全てのカラムを表します。
SELECT * FROM users;
下記のように表示されれば成功です。
+----+--------------+--------------------+---------------------+---------------------+
| id | name | email | created_at | updated_at |
+----+--------------+--------------------+---------------------+---------------------+
| 1 | 山田太郎 | taro@example.com | 2023-10-11 19:40:58 | 2023-10-11 19:40:58 |
| 2 | 山田花子 | hanako@example.com | 2023-10-11 19:51:11 | 2023-10-11 19:51:11 |
| 3 | 田中一郎 | ichiro@example.com | 2023-10-11 19:51:11 | 2023-10-11 19:51:11 |
| 4 | 佐藤恵子 | keiko@example.com | 2023-10-11 19:51:11 | 2023-10-11 19:51:11 |
+----+--------------+--------------------+---------------------+---------------------+
4 rows in set (0.00 sec)
カラム名を指定して表示する列を絞ることもできます。カラム数が多い時に便利です。下記のSQLを発行してください。
SELECT name, email FROM users;
下記のように表示されれば成功です。
+--------------+--------------------+
| name | email |
+--------------+--------------------+
| 山田太郎 | taro@example.com |
| 山田花子 | hanako@example.com |
| 田中一郎 | ichiro@example.com |
| 佐藤恵子 | keiko@example.com |
+--------------+--------------------+
4 rows in set (0.01 sec)
検索条件をつけて特定の行だけ表示することもできます。WHERE句というのを使います。下記のSQLを発行してください。
// idが1のデータだけ表示する
SELECT * FROM users WHERE id = 1;
下記のように表示されれば成功です。
+----+--------------+------------------+---------------------+---------------------+
| id | name | email | created_at | updated_at |
+----+--------------+------------------+---------------------+---------------------+
| 1 | 山田太郎 | taro@example.com | 2023-10-11 19:40:58 | 2023-10-11 19:40:58 |
+----+--------------+------------------+---------------------+---------------------+
1 row in set (0.00 sec)
データの更新
メールアドレスを変更してみましょう。CRUDのUpdateです。UPDATE文を使います。
UPDATE <テーブル名> SET <カラム名> = <値>, ... [WHERE <検索条件> ]
下記のSQLを発行してください。
山田太郎さんのメールアドレスを「y.taro@example.com」に変更します。先ほどSELECTで行ったようにWHERE句を用いて更新対象をidが1のデータだけに絞っています。でなければ全てのメールアドレスが「y.taro@example.com」に変更されてしまいます。
更新した日時も保存しておきましょう。updated_atの値にはNOW関数を用いて現在日時を登録します。
UPDATE users SET email = 'y.taro@example.com', updated_at = NOW() WHERE id = 1;
下記のようにメッセージが表示されれば成功です。
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SELETして確認してみましょう。下記のSQLを発行してください。
SELECT name, email, updated_at FROM users WHERE id = 1;
ちゃんと更新されていますね。
+--------------+--------------------+---------------------+
| name | email | updated_at |
+--------------+--------------------+---------------------+
| 山田太郎 | y.taro@example.com | 2023-10-11 20:15:23 |
+--------------+--------------------+---------------------+
1 row in set (0.00 sec)
データの削除
不要になったデータを削除してみましょう。CRUDのDeleteです。DELETE文を使います。
DELETE FROM <テーブル名> [WHERE <検索条件>];
下記のSQLを発行してください。idが3の田中さんを削除します。今回もWHERE句を使って検索条件をつけます。でなければ全てのデータが削除されてしまいます。
DELETE FROM users WHERE id = 3;
下記のようにメッセージが表示されれば成功です。
Query OK, 1 row affected (0.00 sec)
SELECT文を発行して見てみましょう。
SELECT id, name FROM users;
idが3の田中さんが削除されています。なお、idは途中で番号が抜けてしまっても詰め直されることはありません。
+----+--------------+
| id | name |
+----+--------------+
| 1 | 山田太郎 |
| 2 | 山田花子 |
| 4 | 佐藤恵子 |
+----+--------------+
3 rows in set (0.00 sec)
MySQLサーバーからログアウト
最後にMySQLサーバーからログアウトしましょう。ログアウトする時は
exit
と入力してください。セミコロンは必要ありません。
Bye
と表示されれば成功です。
解説は以上です。おつかれさまでした。
PHP/Laravelのシステム開発は株式会社パパグラムへぜひご相談ください。