1.  インストールと設定  

MySQL は、オープンソースのリレーショナルデータベース管理システム(RDBMS)である。 リレーショナルデータベースは、すべてのデータを 1 つの大きな保管場所に置くのではなく、 独立したテーブルに保存します。データベースの構造は、速度を最適化した物理ファイルにわかれています。 データベース、テーブル、ビュー、行、およびカラムなどのオブジェクトをもつ論理モデルは、柔軟なプログラミング環境を提供します。

インストール: home brewでMySQLインストール。
MySQL is configured to only allow connections from localhost by default
(MySQLはデフォルトでローカルホストからの接続のみを許可するように設定されています)

$ brew install mysql
$ mysql --help
$ mysql -V
mysql Ver 8.0.21 for osx10.14 on x86_64 (Homebrew)
$ mysql.server start
Starting MySQL
.. SUCCESS!
$ mysql -uroot
Password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> help
mysql> quit
Bye
$
インストール mysql help

初期設定: root ユーザーのパスワードなど設定。
パスワード期限など設定 <== my.cof

$ mysql_secure_installation $ vi /usr/local/etc/my.cnf
初期設定 my.cnf
$ mysql -u root -p
Enter password:
                    
 mysql> select version(), current_date;
 +-----------+--------------+
 | version() | current_date |
 +-----------+--------------+
 | 8.0.21    | 2020-07-26   |
 +-----------+--------------+
 1 row in set (0.00 sec)
                    
                
                    
 mysql> select sin(pi()/6), (5+3)*3;
 +---------------------+---------+
 | sin(pi()/6)         | (5+3)*3 |
 +---------------------+---------+
 | 0.49999999999999994 |      24 |
 +---------------------+---------+
 1 row in set (0.00 sec)
                        
                
                    
 mysql> select user();
 +----------------+
 | user()         |
 +----------------+   👈クエリーの入力
 | root@localhost |
 +----------------+
 1 row in set (0.00 sec)
                    
               
    2.  データベース  

mysql データベースには、ユーザーのアクセス権限を記述します。 データベース内に作成した内容は、アクセス権限を持っているほかのユーザーによって削除される可能性があります。 自分専用のデータベースを使用する許可を MySQL 管理者に依頼するとよいでしょう。『ORACLE』

データベース検索。 ユーザー、ホスト確認。 ユーザー権限確認。
SHOW DATABASES は、MySQL サーバーホスト上のデータベースを一覧表示します。 グローバルな SHOW DATABASES 権限を持っていないかぎり、何らかの種類の権限を持っているデータベースしか表示できません。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)
mysql> select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
 mysql> show grants for root@localhost;
 +------------------------------------+
 | Grants for root@localhost
 +------------------------------------+
 | GRANT SELECT, INSERT, UPDATE, DELETE,..
 ........SUPER, CREATE TEMPORARY TABLES
 VER_ADMIN ON *.* TO `root`@... GRANT OPTION |
 | GRANT PROXY ON ...calhost' WITH GRANT OPTION
 ---------------------------------------------+
   3 rows in set (0.00 sec)

ユーザーアクセス権限設定、データベース作成。
A MySQL role is a named collection of privileges. Like user accounts, roles can have privileges GRANTed to and revoked from them. (MySQLロールは、名前付きの権限のコレクションです。 ユーザーアカウントと同様に、ロールは、それらに付与された権限と取り消された権限を持つことができます。)

$ mysql -u root -p
Enter password:
$ mysql -u Lalli -p
Enter password:
mysql> create role roleo;
Query OK, 0 rows affected (0.00 sec)

mysql> grant root@localhost to roleo;

mysql> create user 'Lalli'@'%' identified by "#L*i*123_6"
       default role roleo;

mysql> \q

Bye

$
mysql> create database FFXI;
Query OK, 1 row affected (0.02 sec)

mysql> use FFXI
Database changed

mysql> select database();
+------------+
| database() |
+------------+
| ffxi       |
+------------+
1 row in set (0.00 sec)

テーブル作成。
データベースの作成は簡単な部分ですが、難しい部分は、データベースの構造、 つまり、どのようなテーブルが必要で各テーブルにどのようなカラムを含めるかを決定することです。

mysql> use FFXI

mysql> create table Std_job (id int auto_increment primary key,
    -> name varchar(20),
    -> WAR int,MNK int,WHM int,BLM int,RDM int,THF int);
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_ffxi |
+----------------+
| Std_job        |
+----------------+
1 row in set (0.00 sec)
    mysql> describe Std_job;
    +-------+-------------+------+-----+---------+
    | Field | Type        | Null | Key | Default |
    +-------+-------------+------+-----+---------+
    | id    | int         | NO   | PRI | NULL    | 
    | name  | varchar(20) | YES  |     | NULL    |
    | WAR   | int         | YES  |     | NULL    |
    | MNK   | int         | YES  |     | NULL    |
    | WHM   | int         | YES  |     | NULL    |
    | BLM   | int         | YES  |     | NULL    |
    | RDM   | int         | YES  |     | NULL    |
    | THF   | int         | YES  |     | NULL    |
    +-------+-------------+------+-----+---------+
    8 rows in set (0.00 sec)

データ作成。 テーブルへのデータ入力。

mysql> select * from Std_job;
Empty set (0.00 sec)

mysql> insert into Std_job values
    ->  (null,'Lalli',50,1,1,1,1,1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from Std_job;
+----+-------+------+------+------+------+------+------+
| id | name  | WAR  | MNK  | WHM  | BLM  | RDM  | THF  |
+----+-------+------+------+------+------+------+------+
|  1 | Lalli |   50 |    1 |    1 |    1 |    1 |    1 |
+----+-------+------+------+------+------+------+------+
1 row in set (0.01 sec)
mysql> insert into Std_job values
    -> (null,'Kidney',50,99,77,2,50,10);
Query OK, 1 row affected (0.00 sec)

mysql> select * from Std_job;
+----+--------+------+------+------+------+------+------+
| id | name   | WAR  | MNK  | WHM  | BLM  | RDM  | THF  |
+----+--------+------+------+------+------+------+------+
|  1 | Lalli  |   50 |    1 |    1 |    1 |    1 |    1 |
|  2 | Kidney |   50 |   99 |   77 |    2 |   50 |   10 |
+----+--------+------+------+------+------+------+------+
2 rows in set (0.00 sec)
vi ~/MySQL/ffxi_syn_skl.sql
mysql> desc ffxi_syn_skl;
+-------------+-------------+------+-----+-------------------+-------------------+
| Field       | Type        | Null | Key | Default           | Extra             |
+-------------+-------------+------+-----+-------------------+-------------------+
| id          | int         | NO   | PRI | NULL              | auto_increment    |
| name        | varchar(20) | YES  |     | NULL              |                   |
| 釣り        | int         | YES  |     | NULL              |                   |
| 木工        | int         | YES  |     | NULL              |                   |
| 鍛治        | int         | YES  |     | NULL              |                   |
| 彫金        | int         | YES  |     | NULL              |                   |
| 裁縫        | int         | YES  |     | NULL              |                   |
| 革細工       | int         | YES  |     | NULL              |                   |
| 骨細工       | int         | YES  |     | NULL              |                   |
| 錬金術       | int         | YES  |     | NULL              |                   |
| 調理        | int         | YES  |     | NULL              |                   |
| 錬成        | int         | YES  |     | NULL              |                   |
| created_at  | timestamp   | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-------------+-------------+------+-----+-------------------+-------------------+
13 rows in set (0.00 sec)
mysql> source ~/MySQL/ffxi_syn_skl.sql;
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+----------------+
| Tables_in_ffxi |
+----------------+
| ffxi_syn_skl   |
| Std_job        |
+----------------+
2 rows in set (0.00 sec)

データロード。 .txtファイル作成、テーブルへのデータロード。
不足している値には NULL 値を使用できます。テキストファイルでこれらを表現するには、\N (バックスラッシュと大文字の N)。
値の間の空白は 1 つのタブ文字です。このファイルを Windows で作成した場合、 作成に使用したエディタで \r\n が行ターミネータとして使用されているときは、代わりに次のステートメントを使用します。 -> LINES TERMINATED BY '\r\n'

$ vi ~/MySQL/ffxi_syn_skl.txt

\N[tab]Lalli[tab]0[tab]44....0[tab]1[tab]\N[tab][return(\r)] \N[tab]Kidney[tab]0[tab]62[tab]68.......
$ vi /usr/local/etc/my.cnf
$ mysql.server restart
Shutting down MySQL . SUCCESS!
Starting MySQL .. SUCCESS!
ffxi_syn_skl.txt my.cnf
mysql> load data infile '~/MySQL/ffxi_syn_skl.txt'
    ->into table ffxi_syn_skl;

ERROR 1290 (HY000): The MySQL server is running
with the --secure-file-priv option
so it cannot execute this statement

mysql> select  @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)
mysql> select  @@global.secure_file_priv;
+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| /Users/user/MySQL/        |
+---------------------------+
1 row in set (0.00 sec)

mysql> use FFXI

mysql> load data infile '~/MySQL/ffxi_syn_skl.txt'
    -> into table ffxi_syn_skl;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

secure-file-priv
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
(:MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません)

mysql> select * from ffxi_syn_skl;
+----+--------+------+------+------+------+------+-------+-------+-------+------+------+---------------------+
| id | name   | 釣り | 木工 | 鍛治 | 彫金 | 裁縫 | 革細工 | 骨細工 | 錬金術 | 調理 | 錬成 | created_at          |
+----+--------+------+------+------+------+------+-------+-------+-------+------+------+---------------------+
|  1 | Lalli  |    0 |   44 |   70 |   70 |  110 |    70 |    46 |    70 |    0 |    1 | 2020-08-03 17:28:11 |
|  2 | Kidney |    0 |   62 |   68 |   70 |   70 |    24 |    70 |   110 |    1 |    1 | 2020-08-03 17:28:11 |
+----+--------+------+------+------+------+------+-------+-------+-------+------+------+---------------------+
2 rows in set (0.00 sec)

テーブルデータ修正、削除。 UPDATE ステートメントを使用して、間違ったレコードだけを修正します

データ修正 データ削除
mysql> update ffxi_syn_skl set 調理 = '61'
    -> where name = 'Kidney';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from ffxi_syn_skl;
+----+--------+------+------+---  ---+-------+------+------+
| id | name   | 釣り | 木工 |        | 錬金術 | 調理 | 錬成 | 
+----+--------+------+------+---  ---+-------+------+------+
|  1 | Lalli  |    0 |   44 |        |    70 |    0 |    1 |
|  2 | Kidney |    0 |   62 |        |   110 |   61 |    1 |
+----+--------+------+------+---  ---+-------+------+------+
2 rows in set (0.00 sec)
mysql> delete from ffxi_syn_skl;
Query OK, 2 rows affected (0.01 sec)

mysql> select * from ffxi_syn_skl;
Empty set (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_ffxi |
+----------------+
| ffxi_syn_skl   |
| Std_job        |
+----------------+
2 rows in set (0.00 sec)

    3.  UNIXソケット  

サーバーがローカルクライアントと通信するために使用する UNIX ソケットファイルのデフォルトの場所は、/tmp/mysql.sock です。 クライアントプログラムが MySQL サーバーに接続できるためには、 サーバーが稼働しているホストの名前および MySQL アカウントのユーザー名とパスワードなどの、適切な接続パラメータを使用する必要があります。 UNIX 上の MySQL クライアントは mysqld サーバーに 2 つの方法で接続できます。 UNIX ソケットファイルを使用してファイルシステム内のファイル (デフォルトは /tmp/mysql.sock) を介して接続するか、 TCP/IP を使用してポート番号を介して接続します。UNIX ソケットファイルでの接続は TCP/IP よりも高速ですが、 同じコンピュータ上にあるサーバーに接続するときにのみ使用できます。UNIX ソケットファイルは、ホスト名を指定しない場合、 または特殊なホスト名 localhost を指定する場合に使用されます。『ORACLE』

$ mysql -h localhost -u Lalli -p $ mysql -h 127.0.0.1 -u Lalli -p
mysql> status
--------------
mysql  Ver 8.0.22 for osx10.14 on x86_64 (Homebrew)

Connection id:		11
Current database:
Current user:		Lalli@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		8.0.22 Homebrew
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
UNIX socket:		/tmp/mysql.sock
Binary data as:		Hexadecimal
Uptime:			5 hours 33 min 13 sec
mysql> status
--------------
mysql  Ver 8.0.22 for osx10.14 on x86_64 (Homebrew)

Connection id:		12
Current database:
Current user:		Lalli@localhost
SSL:			Cipher in use is TLS_AES_256_GCM_SHA384
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		8.0.22 Homebrew
Protocol version:	10
Connection:		127.0.0.1 via TCP/IP
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
TCP port:		3306
Binary data as:		Hexadecimal
Uptime:			5 hours 34 min 15 sec

External connection my.cnf編集(bind-address = 0.0.0.0)、ファイアウォール設定(システム環境設定:セキュリティとプライバシー)。

$ vi /usr/local/etc/my.cnf $ sudo reboot
my.cnf "mysqld"へのネットワーク受信接続を許可

ユーザー作成: MySQL アカウント名はユーザー名とホスト名で構成されます。これにより、 別々のホストから接続可能な同じ名前を持つユーザーのためのアカウントを作成できます。

IP固定: システム環境設定:ネットワーク。

$ mysql -u Lalli -p
Enter password:
$ mysql -h 192.168.1.105 -u pydio -p
Enter password:
ユーザー、データベース作成 mysqlサーバーにアクセス
mysql> create user 'pydio'@'192.168.1.105'
    ->identified by "#**"y_U";
Query OK, 0 rows affected (0.05 sec)

mysql> create database cells;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on cells.* to
    ->'pydio'@'192.168.1.105';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.02 sec)
mysql> status
--------------
mysql  Ver 8.0.22 for osx10.14 on x86_64 (Homebrew)

Connection id:		13
Current database:
Current user:		pydio@192.168.1.105
SSL:			Cipher in use is TLS_AES_256_GCM_SHA384
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		8.0.22 Homebrew
Protocol version:	10
Connection:		192.168.1.105 via TCP/IP
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
TCP port:		3306
Binary data as:		Hexadecimal
Uptime:			50 min 16 sec

skip-networking: TCP/IP 接続を listen しません。

Docker MySQL 5.7 (Ubuntu 18.04.5 LTS) $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=&$#00P**?oo --hostname go_sql -e BIND-ADDRESS=0.0.0.0 -p 3306:3306 -itd mysql:5.7


    4.  SQL設計  

SQL : Structured Query Language「構造化問合せ言語」は、リレーショナルデータベース(RDB)を扱う為の言語。 DML(Data Manupilation Language)操作、DDL(Data Definition Language)定義、DCL(Data Control Language)制御など。 ANSI(米国規格協会)、ISO(国際標準化機構)においてデータベースの標準言語として規格されています。

概念設計 : データがどのように互いに関連しあっているかを決める。
論理設計 : データを論理的に構造化。
物理設計 : データベースの物理的な設定を指定する。

実体関連図(Entity-Relationship diagram)
リレーショナルデータベースの実体(Entity)と関連(Rerationship)を表現するために使われます。
外部キー(FOREIGN KEY):関連したテーブル間を結ぶために設定する列。(データの整合性をデータベースに保証させる)





2020.8.03