MySQLコマンドの使い方一覧!DBの接続方法やレコードの検索方法をコマンド付きで解説!

14 min

MySQLのコマンドの使い方が分からなくて困っている人

MySQLをプロジェクトに入れて接続は出来るようになったけど、そこからの操作方法が全くわからない…。テーブルの作り方とかデータの見方を教えて欲しい…!

今回の記事ではこんな方に向けて記事を書きます。

本記事の対象読者
  • MySQLに接続は出来たけどテーブルの作り方がわからない方
  • データの取得方法が知りたい方
  • SQL文の書き方を知りたい方
  • MySQLコマンドのチートシートが欲しい

こんにちは、himakuro(@himanakuroneko)です!

 

RubyやPHPのようなサーバーサイド言語を仮に書けたとしても、データベースの操作方法がわからないエンジニアは市場価値が一気に低下します。

そこで今回の記事では初心者の方向けに、MySQLやデータベースの内容でよくある勘違いを2つ紹介した後にMySQLコマンドやSQL文の書き方を使い方を解説して行きます。

今回の記事を読みデータベースの操作も出来るWebエンジニアを目指して行きましょう。

MySQLとデータベースの違い

MySQLとデータベースの違い

初心者の方によくある勘違いでMySQLがデータベースだと思われている方がいますが、MySQLはデータベースではなく、データベースを管理するためのシステムです。

MySQLというデータベース管理システムの中に複数のデータベースが存在出来るという形で覚えておきましょう。

データベースとテーブルの違い

これもよくある勘違いなのですがデータベースとテーブルは別物で、1つのデータベースの中に複数のテーブルが存在する事が出来ます。

LaravelやRailsなどでは先にデータベースを作成し、その中にusersテーブルなどのテーブルを入れていく流れになります。

himakuro

himakuro

MySQL、データベース、テーブルがそれぞれ何なのかを理解しておくと、Googleなどで検索するときの検索キーワードにも迷いがなくなるよ!

MySQLコマンド – 接続編

まずは接続と接続を終了する方法です。

今回の記事で紹介している各コマンドの先頭にある$mysql>は入力不要な点に注意しましょう。

MySQLに接続

shell


# localhostのMySQLサーバに接続する (ユーザー名: himakuroの場合)
$ mysql -u himakuro -p

パスワードは-pのあとに入力する事も出来ますが、入力した内容がそのまま表示されるのでセキュリティ上良くありません。必ず-pの後は何も入力せずにキーボードのreturn(Enter)を入力し、その後にパスワードを入力しましょう。

MySQLに接続(Laradockの場合)

Laradockのデータベースに接続する場合はLaradockを起動している状態で、下記のコマンドを実行する必要があります。

shell


# MySQLが起動されているコンテナの中に入る
$ docker-compose exec mysql bash

# defaultユーザーとしてmysqlに接続する
$ mysql -u default -p

Laradockの初期設定ではユーザー名がdefault、パスワードがsecretとなっています。これらの設定は.envファイルにも記載されているので、その情報を使いMySQLに接続していきましょう。

もし上記の方法でLaradockで起動しているMySQLに接続が出来ない場合は、下記の記事を参考にLaradock側の各種設定を見直してみましょう。

MySQLの接続を終了する

一度MySQLに繋いだ後は接続を終了しないと、普段のターミナルで入力するコマンドが実行出来ません。

mysql


mysql> exit
himakuro

himakuro

MySQLに接続するためのコマンドと、接続を終了するためのコマンドはよく利用するので、出来る限り暗記しておこう!

MySQLコマンド – データベース編

データベース一覧を表示

mysql


mysql> show databases;

---------------- 以下実行結果 ----------------

mysql> show databases;
+-----------------------------------+
| Database                          |
+-----------------------------------+
| information_schema                |
| mysql                             |
| performance_schema                |
| sys                               |
+-----------------------------------+
himakuro

himakuro

MySQLには予め複数のデータベースが用意されているよ。ただしこれらのデータベースの中に自分でテーブルを追加することはない点に注意しよう!

データベースの作成

mysql


# db_nameという名前のデータベースを作成
mysql> CREATE DATABASE db_name;

# db_nameというデータベースが作成されたかを確認する
mysql> show databases;

---------------- 以下実行結果 ----------------

+-----------------------------------+
| Database                          |
+-----------------------------------+
| db_name                           |
| information_schema                |
| mysql                             |
| performance_schema                |
| sys                               |
+-----------------------------------+
himakuro

himakuro

今回は例としてdb_nameという名前でデータベースを作成したけど、ここでは好きな名前のデータベースを作成出来るよ。

データベースの選択

データベースの中に作成したテーブルの中身を確認するには、どのデータベースを使うかをMySQLに教えてあげる必要があります。

mysql


# db_nameのデータベースを選択
mysql> use db_name;

---------------- 以下実行結果 ----------------

Database changed

useコマンドでデータベースを指定せずに、データを検索するためのSQL文を記述する時にデータベース名を指定する方法もあります。しかし毎回データベースの名前を入力するのも手間だと思うのでuseコマンドを使う方法に慣れておきましょう。

データベースの削除

データベースを削除すると中にあるテーブルも全て削除されるので実行には注意しましょう。

mysql


# db_nameのデータベースを削除
mysql> drop database db_name;

---------------- 以下実行結果 ----------------

Query OK, 0 rows affected (0.03 sec)

MySQLコマンド – テーブル編

テーブル一覧を表示

mysql


# テーブル一覧を表示
mysql> show tables;

---------------- 以下実行結果 ----------------

Empty set (0.00 sec)
himakuro

himakuro

新規で作成したデータベースの場合はまだテーブルが存在しないからEmpty set(空)と表示されるよ

テーブルの作成

テーブルの作成時のコマンドは少し複雑なものになっています。

テーブル作成のテンプレート

mysql


mysql> create table [テーブル名] (
  [フィールド名] [データ型] [オプション]
) ENGINE=[InnoDB/MyISAM] DEFAULT CHARSET=[文字コード];

usersテーブルの作成例

mysql



mysql> CREATE TABLE `users` (
    `id` bigint UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT "ユーザーID",
    `name` VARCHAR(255) NOT NULL COMMENT "ユーザー名",
    `age` int(10) UNSIGNED NOT NULL COMMENT "年齢",
    `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT "登録日",
    `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新日"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

今回はusersテーブルに自動採番のidカラム、名前を保存するnameカラム、年齢を保存するageカラム、作成時間を保存するcreated_atカラム、更新時間を保存するupdated_atカラムを用意しました。

idを自動採番カラムにすることでレコード作成時に1から連番の値が自動で入るようになります。またupdated_atのカラムはレコードを更新時に自動で更新時間が入るような設定にしています。

ageカラムにはUNSIGNEDというのを付ける事で負の値(-1など)を入らないようにしています。

himakuro

himakuro

INSERT編で実際にこのテーブルにデータを入れていくので、idカラムに実際にどのような値が入るかを確認しておこう!そしてUPDATE編ではupdated_atの値に注目しながら進めよう!

テーブルの構成を確認

作成されているテーブルのカラムなどの情報は2種類の方法で確認が可能です。

mysql


mysql> desc users;

---------------- 以下実行結果 ----------------

+------------+-----------------+------+-----+-------------------+-----------------------------------------------+
| Field      | Type            | Null | Key | Default           | Extra                                         |
+------------+-----------------+------+-----+-------------------+-----------------------------------------------+
| id         | bigint unsigned | NO   | PRI | NULL              | auto_increment                                |
| name       | varchar(255)    | NO   |     | NULL              |                                               |
| age        | int unsigned    | NO   |     | NULL              |                                               |
| created_at | datetime        | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED                             |
| updated_at | datetime        | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+------------+-----------------+------+-----+-------------------+-----------------------------------------------+
5 rows in set (0.00 sec)

mysql


mysql> show create table users;

---------------- 以下実行結果 ----------------

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ユーザーID',
  `name` varchar(255) NOT NULL COMMENT 'ユーザー名',
  `age` int unsigned NOT NULL COMMENT '年齢',
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
himakuro

himakuro

descコマンドはカラムの情報をメインで見たい時に活用し、show create tableはテーブル作成時に実行したcreate tableのSQL文を確認したい時に活用しよう。

MySQLコマンド – INSERT編(作成)

次は作成したテーブルにレコード(データ)を入れて行きます。

複数のレコードを一括で入れる方法も紹介するので合わせて覚えておきましょう。

INSERTのSQL文のテンプレート

mysql


mysql> insert  into [テーブル名] [フィールド名] values [値]

usersテーブルにレコードをインサート

mysql


mysql> insert into users (name,age) values ('himakuro','100');

---------------- 以下実行結果 ----------------

Query OK, 1 row affected (0.01 sec)

usersテーブルに複数のレコードを一括でインサート

mysql


mysql> insert into users (name,age) values ('himakuro','100'), ('test_user', 50);

---------------- 以下実行結果 ----------------

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MySQLコマンド – SELECT編(取得)

次は作成したレコード(データ)を検索していきます。

SELECTのSQL文のテンプレート

mysql


mysql> select [カラム名] from [テーブル名] [条件式]

テーブルに存在する全レコードの全カラムを取得

mysql


mysql> select * from users;

---------------- 以下実行結果 ----------------

+----+-----------+-----+---------------------+---------------------+
| id | name      | age | created_at          | updated_at          |
+----+-----------+-----+---------------------+---------------------+
|  1 | himakuro  | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
|  2 | test_user |  50 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+-----------+-----+---------------------+---------------------+
2 rows in set (0.00 sec)
himakuro

himakuro

「*」を指定すると全カラム取得してくるよ!

WHEREで条件を付けてレコードを検索

mysql


mysql> select * from users where name = 'himakuro';

---------------- 以下実行結果 ----------------

+----+----------+-----+---------------------+---------------------+
| id | name     | age | created_at          | updated_at          |
+----+----------+-----+---------------------+---------------------+
|  1 | himakuro | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+----------+-----+---------------------+---------------------+
1 row in set (0.00 sec)

上記の例の様な文字列で検索をする場合は「’」で囲う必要があります。またよくあるミスとして「”」を使おうとする方がいますが、MySQLでは「”」は使えずエラーになるので注意しましょう。

複数条件を付けてレコードを検索

mysql


mysql> select * from users where age > 80 and created_at > '2020-08-31 00:00:00';

---------------- 以下実行結果 ----------------

+----+----------+-----+---------------------+---------------------+
| id | name     | age | created_at          | updated_at          |
+----+----------+-----+---------------------+---------------------+
|  1 | himakuro | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+----------+-----+---------------------+---------------------+
1 row in set (0.00 sec)

条件を複数付ける場合は、2つ目以降の条件はwhereではなくandで繋げられることを覚えておきましょう。

取得したいカラムを指定して検索する

mysql


mysql> select id,name,age from users where name = 'himakuro';

---------------- 以下実行結果 ----------------

+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | himakuro | 100 |
+----+----------+-----+
1 row in set (0.00 sec)

LIMITを付けて取得する件数に制限をかける

mysql


mysql> select * from users limit 1;

---------------- 以下実行結果 ----------------

+----+----------+-----+---------------------+---------------------+
| id | name     | age | created_at          | updated_at          |
+----+----------+-----+---------------------+---------------------+
|  1 | himakuro | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+----------+-----+---------------------+---------------------+
1 row in set (0.00 sec)

ORDER BYで順序を並び替えて検索

mysql


# 並び順を指定しない場合
mysql> select * from users order by age;

---------------- 以下実行結果 ----------------

+----+-----------+-----+---------------------+---------------------+
| id | name      | age | created_at          | updated_at          |
+----+-----------+-----+---------------------+---------------------+
|  2 | test_user |  50 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
|  1 | himakuro  | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+-----------+-----+---------------------+---------------------+
2 rows in set (0.00 sec)

mysql


# 並び順を降順で指定した場合
mysql> select * from users order by age desc;

---------------- 以下実行結果 ----------------

+----+-----------+-----+---------------------+---------------------+
| id | name      | age | created_at          | updated_at          |
+----+-----------+-----+---------------------+---------------------+
|  1 | himakuro  | 100 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
|  2 | test_user |  50 | 2020-08-31 18:24:00 | 2020-08-31 18:24:00 |
+----+-----------+-----+---------------------+---------------------+
2 rows in set (0.00 sec)

order byを使うことで、指定したカラムを昇順・降順に並び替えてデータを取得してくれるようになります。ascは昇順、descは降順を意味しており、order by age の様にどの順番で並び替えるかを指定しないと昇順に並び替えられて表示されます。(デフォルトが昇順)

MySQLコマンド – UPDATE編(更新)

続いて作成したレコード(データ)を更新していきます。

FROMが無いことに注意

UPDATEのSQL文のテンプレート

mysql


mysql> update [テーブル名] set [フィールド名]=[値] [条件式]

全てのレコードを更新

mysql


# 並び順を降順で指定した場合
mysql> update users set age = 10;

---------------- 以下実行結果 ----------------

Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0
himakuro

himakuro

updateが成功したらselectのSQL文を実行して、本当に値が変化しているか確認してみよう!

WHEREで条件を付けてレコードを更新

mysql


# id=1のレコードのageを200に変更
mysql> update users set age = 200 where id = 1;

---------------- 以下実行結果 ----------------

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MySQLコマンド – DELETE編(削除)

最後に作成したレコードを削除して行きます。

DELETEのSQL文のテンプレート

mysql


mysql> delete from [テーブル名] [条件式]

全てのレコードを削除

mysql


# 並び順を降順で指定した場合
mysql> delete from users;

---------------- 以下実行結果 ----------------

Query OK, 2 rows affected (0.01 sec)

WHEREで条件を付けてレコードを削除

mysql


# 並び順を降順で指定した場合
mysql> delete from users where name = 'himakuro';

---------------- 以下実行結果 ----------------

Query OK, 1 rows affected (0.01 sec)
Sponsored Link
himakuro

himakuro

新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、MENTAで未経験者の方にプログラミングを指導しています。

カテゴリー:
関連記事

コメントを残す