備忘録的プログラミングリファレンス

MySQL リファレンス

 MySQLは、リレーショナル(関係)データベース管理システム (RDBMS:relational database management system) です。
 SQL を使用してデータベースおよびテーブルなどを作成しデータを記録することができます。デーモン機能を使ってデータベースサーバーとすることも、単独でデータベースとしても利用できます。

 MySQL ではデータベースの管理を SQL 文で行います。mysql といったコマンドラインなどのインターフェイスからデータベースを操作します。
 ユーザー名はユーザー名とユーザーの接続元の組み合わせ 'username'@'host' です。ユーザー名と接続元との組み合わせでデータベース接続の認証をします。
 ユーザーごとにデータベースの操作権限を設定します。操作権限はロールを利用することもできます。

MySQLのインストール

 ここではUbuntuにおけるMySQLのインストールからユーザーの設定、MySQLへのログインについて簡単に解説します。

 インストールには Ubuntu や CentOS などのディストリビューションからインストールする方法と、MySQL のサイトからソースをダウンロードしインストールする方法があります。
 開発環境をディストリビューションを利用して構築するのなら、MySQL もディストリビューションを利用してインストールすることをお勧めします。

MySQLのインストール

 管理者権限で、aptによってインストールします。

$ sudo apt install mysql-server

 インストールしたままの状態でインターネット上でサーバーとして運用するなら問題があります。スーパーユーザーの設定、アクセスログの記録などのセキュリティー設定や記録ディレクトリの設定などが必要になります。

 詳しくはMySQL のインストールを参照して下さい。

 ここでは話を簡単にするためにインストール直後の状態であるとして解説します。

MySQLの開発環境のインストール

 もし開発環境を構築する必要がある場合には、上記の方法では開発用パッケージは含まれていません。
 MySQL を使って開発を行うには libmysqlclient-dev パッケージもインストールする必要があります。

$ sudo apt install mysql-server libmysqlclient-dev

 ただし、ネット上でサーバーとして MySQL を運用する場合は開発環境を構築しないようにします。

詳しくは開発用パッケージのインストールについてを参照してください。

起動設定

 パッケージインストールによる MySQL はインストールするだけでサーバーとして自動で起動するようになっています。

 起動しているかを確認するには systemctl コマンドのオプション status を使用します。

$ systemctl status mysql

 mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
     Active: active (running) since Wed 2023-09-06 16:58:54 JST; 16min ago
    Process: 939 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=ex>
   Main PID: 1168 (mysqld)
     Status: "Server is operational"
      Tasks: 37 (limit: 9344)
     Memory: 430.4M
        CPU: 9.258s
     CGroup: /system.slice/mysql.service
             └─1168 /usr/sbin/mysqld

 9月 06 16:58:48 user-PC systemd[1]: Starting MySQL Community Server...
 9月 06 16:58:54 user-PC systemd[1]: Started MySQL Community Server.

 上記のように、MySQL サーバーがactiveになっていればログインが可能になります。

 MySQL を起動するためには systemctl コマンドのオプション start を使用します。

$ sudo systemctl start mysql

 サーバーの起動、再起動に関しては起動設定を参照してください。

MySQLの操作( mysql コマンドラインツール )

 mysql は端末(コマンドプロンプト)から利用できる MySQL 用のインターフェイスです。

 OS の端末から mysql コマンドで MySQL のコマンドラインインターフェイスにログインします。
 ただし、インストール直後の初期状態では sudo によってrootユーザーとして実行します。

mysqlでログイン
$ sudo mysql
...
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2023, 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>

 パスワードはrootに設定されたパスワードです。

 mysql コマンドでデータベース名を指定しない場合はユーザー名と同じデータベース名に接続されます。データベースを指定する時は、-pオプションに続いてデータベースを指定します。

 詳しくはmysql コマンドラインインターフェイスを参照して下さい。

 MySQL からログアウトする場合は以下のコマンドです。

mysql からのログアウト
mysql> \q
Bye

 mysql コマンドラインインターフェイスは多くの場合コマンドラインツールと呼ばれています。

ユーザー(アカウント)の管理

 MySQL はインストールのみでのデフォルト設定では root ユーザーとテスト用のユーザーが利用できるようになっています。

 新たにユーザーを MySQL に登録し権限を与えるには、mysql においてCREATE USERを実行します。

 まずは root で MySQL にログインします。sudo は root としてコマンドを実行します。

$ sudo mysql
...
mysql> CREATE USER 'example'@'localhost' IDENTIFIED BY '5v().B5y4wpT';

 上記の例ではパスワードによるログインができるユーザーが作成されます。

 この例では、ユーザー名example、ホストがlocalhost、パスワードが5v().B5y4wpTでユーザーが作成されます。

 ホスト名はユーザーがどこから接続してよいかを示すものです。MySQL を利用した API といった外部接続を開発する場合には意識する必要があると思います。
 標準的には localhost を指定します。ローカルからのユーザーのみの接続を許します。%はどこからの接続も許します。

 ユーザーの追加が成功すればそのユーザーでログインすることができます。

$ mysql -u example

 MySQL においてはユーザーと別にロールというものがあります。ロールはユーザーに操作権限が与えらるものです。
 ロールは個別に作成することができデータベース操作の権限を設定することができます。ユーザーにロールを設定することで、ユーザーはロールの操作権限を継承します。

 詳しくはユーザー(アカウント)、ロール管理ページを参照してください。

データベースの管理(確認、作成、接続、削除)

 データベースの管理としては、既存データベースの一覧で確認、データベースの作成、削除、オーナー管理、ディレクトリ管理があります。ここでは簡単に説明します。

 詳しくは、データベースの管理(一覧、作成、接続、削除)を参照して下さい。

データベースの一覧確認

$ sudo mysql
...
mysql> SHOW databases;

データベースの作成

 まず最初にデータを統括するためのデータベースを作成しなければなりません。データベースにデータを収めるためのテーブルやビュー、トリガといったスクリプトなどが入ります。

 mysql にログインまたは SQL コマンドが使える環境で CREATE DATABASE クエリーを実行します。

$ sudo mysql
...
mysql> CREATE DATABASE dbname;

 この場合、root のデータベースとして作成されます。

データベースの接続

 データベースの指定には、ログインする際にデータベースを指定する方法と現在操作中のデータベースを切り替える方法があります。

 データベースを指定して mysql にログインするには、-pオプションでデータベース名を指定します。

mysql コマンドでデータベース指定
$ sudo mysql -p db_name
...
mysql>

 mysql コマンドラインでデータベースを切り替えるには USE クエリーを使用します。

データベースの切り替え
mysql> use other_db;
Database changed

 現在接続中のデータベースを確認するには SELECT クエリーで databse() 関数を使用します。

現在使用中のデータベースの確認
mysql> SELECT databse();

 詳しくはデータベースに接続を参照してください。

データベースの削除

 データベースを削除するには、データベースの作成権限をもつユーザまたはデータベースオーナーで、以下のコマンドを実行します。

データベース削除
mysql> DROP db_name

 詳しくはデータベースの削除を参照してください。

テーブル定義

 テーブルとは、データベースにおいてデータを格納するために用意する表のようなものです。

列名の部分

テーブルの作成

 テーブルの作成は以下のように CREATE TABLE クエリーで定義します。

 表計算のような行列の概念があり、CREATE TABLEでは列の各カラム(項目)の定義をします。

テーブルの作成
CREATE TABLE table_name(
	id	SERIAL PRIMARY KEY,
	name	VARCHAR( 30 )
);

 データ型には主に以下のものがあります。

データ型

 MySQL で扱うデータ型には主に文字列型、数値型、Date 型があります。データ型はカラムのデータタイプ定義にも利用します。

文字列型
文字列型
タイプ名概要
CHAR()固定長。255 文字まで。引数に文字数を指定。指定数の容量を消費する
VARCHAR()可変長。255 文字まで。引数に文字数を指定。入るデータ分のみ容量を消費
TINYTEXT255 文字まで
TEXT65,535 文字まで
MEDIUMTEXT16,777,215 文字まで
LONGTEXT4,294,967,295 文字まで

 文字数が決まっているような場合は CHAR() または VARCHAR()を。255 文字を超えるような場合や文字数が決まっていない場合は TEXT を使用するとよいでしょう。

 CHAR() は固定長で指定された文字数の容量を確保します。VARCHAR() は可変長で保存される文字数によって確保される容量が変わります。多くの場合は VARCHAR() の方が便利でしょう。

数値型
数値型
タイプ名概要
TINYINTSIGNED、-128 〜 127。UNSIGNED、0 〜 255
SMALLINTSIGNED、-32,768 〜 32767。UNSIGNED、0 〜 65,535
MEDIUMINTSIGNED、-8,388,608 〜 8,388,607。UNSIGNED、0 〜 16,777,215
INTSIGNED、-2,147,483,648 〜 2,147,483,647。UNSIGNED、0 〜 4,294,967,295
BIGINTSIGNED、-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807。UNSIGNED、0 〜 18,446,744,073,709,551,615
FLOAT()-3.402823466E+38 〜 -1.175494351E-38。1.175494351E-38 〜 3.402823466E+38
DOUBLE()-1.7976931348623157E+308 〜 -2.2250738585072014E-308。2.2250738585072014E-308 〜 1.7976931348623157E+308
SERIAL自動増分。1 ~ 4,294,000,000
日付型
Date 型
タイプ名概要
DATEYYYY-MM-DD。1000-01-01 〜 9999-12-31
DATETIMEYYYY-MM-DD HH:MI:SS。1000-01-01 00:00:00 〜 9999-12-31 23:59:59
TIMESTAMPYYYY-MM-DD HH:MI:SS。1970-01-01 00:00:00 〜 2037-12-31 23:59:59
YEARYYYY。1901 〜 2155
TIMEHH:MI:SS。-838:59:59 〜 838:59:59

テーブル一覧

 データベース内のテーブルを確認するには SHOW TABLES クエリーを実行します。FULL オプションを付けてテーブルの種類も確認できた方がよいでしょう。

mysql=> SHOW FULL TABLES;

テーブルの内容確認

 テーブルの内容を確認するには DESC クエリーを実行します。

mysql=> DESC table_name;

 詳細まで確認するには以下の SHOW クエリーを実行します。

mysql=> SHOW CREATE TABLE table_name;

 テーブルの操作に関して詳しくはテーブルを参照してください。

テーブルデータ

 テーブルにデータを作成するには INSERT クエリーをテーブルを指定して実行します。
 データの閲覧は SELECT、更新は UPDATE、削除には DELETE クエリーを実行します。

データの新規作成

 テーブルへデータを新規作成するには INSERT 文を作成し実行します。例えば以下のように作成ます。

INSERT INTO table_name ( name ) VALUES ( 'test' );

データの閲覧

 テーブルに保存されたデータを閲覧するには SELECT 文を実行します。

SELECT * FROM table_name;

 ここでは*を指定し、すべてのカラムのデータを取得します。

データの更新

 データを更新するには UPDATE 文を実行します。WHERE 句を使い更新する行を指定するようにします。
 行を指定しないと全てのデータを更新してしまいます。

UPDATE table_name SET name = 'update test' WHERE id = 1;

 ここでは id = 1 を指定し、1つの行のみを更新の対象にしています。

データの削除

 保存されたデータを削除するには DELETE 文を実行します。UPDATE 文と同じようにWHERE 句を使い更新する行を指定するようにします。
 行を指定しないと全てのデータを削除してしまいます。

DELETE FROM table_name WHERE id = 1;

 ここでは id = 1 を指定し、1つの行のみを削除します。

SQLファイルの読み込み

 SQLファイルを読み込むには、MySQLのコマンドラインから読み込み、実行するには SOURCE クエリーを使用します。

mysql> SOURCE example.sql

 読み込む sql ファイルはカレントディレクトリからファイル名で辿ります。読み込み先のデータベースは確認するようにします。

組み込み関数(ビルトイン関数)

 MySQL では組み込み関数(ビルトイン関数)と呼ばれる現在の日時や数値計算など便利な関数が用意されています。

現在の日時を返す組み込み関数
mysql> SELECT now();

 例えば以下のような余りを返す、数値に関する組み込み関数もあります。

余りを返す関数
mysql> SELECT MOD( 15, 2 );