Tangwx

Tangwx

博客网站

MySQLデータベース

MySQL#

参考リンク:

データベース day1—— 初めてのデータベース - Eva_J - ブログ園 (cnblogs.com) バージョン:5.6.44

Django で MySQL データベースを使用する - 杨仕航のブログ (yshblog.com) バージョン:8.0.11

image-20210727081016044

1 ダウンロードとインストール#

mysql は、mac、linux、windows などのさまざまなオペレーティングシステム用のオープンソースのインストールパッケージを提供しています。

mysql のインストール、起動、基本設定 —— linux 版 - Eva_J - ブログ園 (cnblogs.com)

mysql のインストール、起動、基本設定 —— mac 版 - Eva_J - ブログ園 (cnblogs.com)

mysql のインストール、起動、基本設定 —— windows 版 - Eva_J - ブログ園 (cnblogs.com)

windows ダウンロードチュートリアル#

第一歩:ウェブサイトを開く、https://www.mysql.com、downloads をクリックした後、https://www.mysql.com/downloadにリダイレクトされます。

第二歩:ウェブサイトhttps://dev.mysql.com/downloads/にリダイレクトされ、Community オプションを選択します。

第三歩:MySQL Community Server をクリックしてhttps://dev.mysql.com/downloads/mysql/ページに入ります。次に、5.6 バージョンのデータベースをクリックします。

第四歩:windows オペレーティングシステムで 5.6 バージョンをクリックすると、https://dev.mysql.com/downloads/mysql/5.6.html#downloadsにリダイレクトされます。ページは以下の通りです。ダウンロードするバージョンとオペレーティングシステムを確認し、Download をクリックします。

第五歩:ログインまたは登録する必要はなく、直接 No thanks, just start my download をクリックしてダウンロードできます。

windows インストールチュートリアル#

解凍#

ダウンロードした zip ファイルを解凍し、解凍後のフォルダーを任意のディレクトリに置きます。このディレクトリが mysql のインストールディレクトリになります。パスはすべて英語で、スペースを含めない必要があります。私はD:\software\MySql\mysql-5.6.44-winx64にインストールしました。

設定#

ディレクトリを開くと、my-default.ini 設定ファイルが表示されます。この設定ファイルをコピーして my.ini または my.cnf に名前を変更します。

my.ini のファイルを pycharm にドラッグします。pycharm のエンコーディング形式は utf-8 です。

ファイルの内容を削除し、以下のコードを my.ini ファイルにコピー&ペーストします。

[mysql]
# mysqlクライアントのデフォルト文字セットを設定
default-character-set=utf8
[mysqld]
# 3306ポートを設定
port = 3306
# mysqlのインストールディレクトリを設定
basedir=C:\Program Files\mysql-5.6.39-winx64
# mysqlデータベースのデータの保存ディレクトリを設定
datadir=C:\Program Files\mysql-5.6.39-winx64\data
# 最大接続数を許可
max_connections=200
# サーバーで使用される文字セットはデフォルトで8ビットエンコーディングのlatin1文字セット
character-set-server=utf8
# 新しいテーブルを作成するときに使用されるデフォルトのストレージエンジン
default-storage-engine=INNODB

これらの内容を変更します:

# mysqlのインストールディレクトリを設定
basedir=D:\software\MySql\mysql-5.6.44-winx64
# mysqlデータベースのデータの保存ディレクトリを設定
datadir=D:\software\MySql\mysql-5.6.44-winx64\data

my.ini の各行の末尾に余分な空白を削除します。

環境変数の設定#

システム環境変数 ->path に新しい変数を作成し、bin ディレクトリを新しい環境変数に追加しますD:\software\MySql\mysql-5.6.44-winx64\bin、そして確定して保存します。

MySQL サービスのインストール#

管理者として cmd ウィンドウを開いた後、ディレクトリを解凍したファイルの bin ディレクトリに切り替え、mysqld install と入力して Enter を押します。

MySQL サービスの起動#

管理者として cmd に入力します:net start mysql

C:\windows\system32>net start mysql
要求されたサービスはすでに起動しています。

NET HELPMSG 2182を入力して、さらにヘルプを取得してください。

サービスが正常に起動した後、ログインできます。mysql -uroot -p(初回ログイン時はパスワードがなく、Enter を押すだけです)。

C:\windows\system32>mysql -uroot -p
パスワードを入力してください:
MySQLモニターへようこそ。コマンドは;または\gで終了します。
あなたのMySQL接続IDは9です。
サーバーバージョン:8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracleおよびその関連会社。

OracleはOracle Corporationおよびその関連会社の登録商標です。他の名前はそれぞれの所有者の商標である可能性があります。

'help;'または'\h'を入力してヘルプを取得します。'\c'を入力して現在の入力文をクリアします。

mysql>

MySQL サービスを停止するにはnet stop mysqlを実行します。

C:\windows\system32>net stop mysql
MySQLサービスを停止しています。
MySQLサービスは正常に停止しました。

MySQL サービスを再起動するには、windows ではまず stop してから start する必要があります。また、MySQL は自動起動プロジェクトであり、起動後に自動的に start します。

クライアントは python コードでもプログラムでもかまいません。mysql.exe はクライアントであり、mysql -u ユーザー名 -p パスワードで mysql にログインします。

2 MySQL のユーザーと権限#

データベースをインストールした後、最高権限のユーザー root があります。

MySQL サーバー側の ip ユーザー名 / パスワード

mysql -h 192.168.xx.xx -uroot -p パスワード

私たちの MySQL クライアントは、ローカルデータベースに接続するだけでなく、ネットワーク上の特定のデータベースのサーバー側にも接続できます。

現在のユーザーを確認する#

MySQL 環境内でselect user();を実行します。最後の英語のセミコロンに注意してください;

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.01 sec)

現在のユーザーにパスワードを追加する#

MySQL 環境内でset password = password('パスワード');を実行します。最後の英語のセミコロンに注意してください;セミコロンを入力しないと、ずっと -> が表示され、終了できません。

新しいバージョンの mysql では、パスワードを変更するにはこのコマンドを使用する必要があります:alter user 'root'@'localhost' identified by '123';

私たちのバージョンでは、まだset password = password('パスワード');を使用します。

ユーザーアカウントを作成する#

create user 'name'@'192.168.43.%' identified by 'パスワード';
C:\windows\system32>mysql -uroot -p
パスワードを入力してください:
MySQLモニターへようこそ。コマンドは;または\gで終了します。
あなたのMySQL接続IDは9です。
サーバーバージョン:8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracleおよびその関連会社。

OracleはOracle Corporationおよびその関連会社の登録商標です。他の名前はそれぞれの所有者の商標である可能性があります。

'help;'または'\h'を入力してヘルプを取得します。'\c'を入力して現在の入力文をクリアします。

mysql> create user 'name'@'192.168.31.%' identified by '123'
    -> ;
クエリOK、0行が影響を受けました (0.09秒)

mysql> exit
さようなら

リモート接続#

mysql -uname -p123 -h192.168.31.144
mysql -uユーザー名 -pパスワード -hip -Pポート番号
mysql -uwanlx -pwanlx -h139.196.217.70 -P8098
C:\windows\system32>mysql -uname -p123 -h192.168.31.144
mysql: [警告] コマンドラインインターフェースでパスワードを使用するのは安全ではない可能性があります。
MySQLモニターへようこそ。コマンドは;または\gで終了します。
あなたのMySQL接続IDは10です。
サーバーバージョン:8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracleおよびその関連会社。

OracleはOracle Corporationおよびその関連会社の登録商標です。他の名前はそれぞれの所有者の商標である可能性があります。

'help;'または'\h'を入力してヘルプを取得します。'\c'を入力して現在の入力文をクリアします。

mysql> select user();
+----------------------+
| user()               |
+----------------------+
| name@LAPTOP-URS4B7MF |
+----------------------+
1 row in set (0.00 sec)

mysql>

フォルダーを確認する#

show databases;

フォルダーを作成する#

create database フォルダー名
show grant for 'ユーザー名'@'192.168.31.%'

ユーザー権限を昇格させる#

grant all on name.* to 'name'@'192.168.31.%';
flush privileges;

権限を付与してユーザーを作成する#

grant all on name.* to 'alex'@'%' identified by '123';

alex という名前のユーザーを作成し、パスワードは 123 で、同じネットワークセグメントにいる限り、name フォルダー内のすべてのコンテンツを制御できます。実際の使用でエラーが発生し、解決されていません。

mysql> grand all on name.* to 'alex'@'%';
ERROR 1064 (42000): SQL構文にエラーがあります。正しい構文を使用するために、あなたのMySQLサーバーバージョンに対応するマニュアルを確認してください。'grand all on name.* to 'alex'@'%''の行1でエラーが発生しました。

私が使用したコマンド:

mysql -uroot -p
mysql -uname -p123 -h192.168.31.144

3 sql 文#

SQL : 構造化クエリ言語 (Structured Query Language) の略称 SQL(発音:/ˈes kjuː ˈel/ "S-Q-L")は、特定の目的のプログラミング言語であり、データを取得、更新、管理するために使用されるデータベースクエリおよびプログラミング言語です。

SQL 言語は主にデータの取得、クエリ、更新、管理に使用され、IBM によって開発されました。SQL 言語は 3 種類に分かれます:

1、DDL 文 データベース定義言語:データベース、テーブル、ビュー、インデックス、ストアドプロシージャなど、例えば CREATE DROP ALTER

2、DML 文 データベース操作言語:データの挿入 INSERT、削除 DELETE、更新 UPDATE、データのクエリ SELECT

3、DCL 文 データベース制御言語:例えばユーザーのアクセス権限を制御する GRANT、REVOKE

データベース テーブル データ#

まずデータベースを作成し、その後テーブルを作成します。DDL データベース定義言語

データを保存、削除、変更、クエリする DML データベース操作文

データベース操作#

create database データベース名;

現在のデータベースがいくつあるかを確認する:show databases;

現在使用しているデータベースを確認する:select database();

このデータベース(フォルダー)に切り替える:use データベース名;

データベースの名前を削除する:drop database データベースの名前(データベースを削除して逃げる!👀🤣🏃‍♂️)

テーブル操作#

現在のフォルダーにいくつのテーブルがあるかを確認する:show tables;

mysql> show tables;
Empty set (0.06 sec)

mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| student        |
+----------------+
1 row in set (0.00 sec)

テーブルを作成する:create table テーブルの名前(フィールド名 データ型(長さ));

create table student(id int,name char(10));

テーブルを削除する:drop tables テーブル名;#

テーブルの構造を確認する:desc テーブル名

mysql> desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | YES  |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

テーブル内のデータを操作する#

データの追加:insert into テーブル名 values (フィールド1,フィールド2);#
mysql> insert into student values (2,'zhangsan');
クエリOK、1行が影響を受けました (0.01 sec)
データの確認:select * from テーブル名;#
mysql> select * from student;
+------+----------+
| id   | name     |
+------+----------+
|    1 | alex     |
|    2 | zhangsan |
+------+----------+
2 rows in set (0.01 sec)
データの変更:update テーブル set フィールド名=値;#

直接update student set name = 'yuan';を実行すると、name のすべてのデータが yuan に変更されます。

mysql> update student set name = 'wusir' where id=2;
クエリOK、1行が影響を受けました (0.01 sec)
行が一致しました:1  変更された行:1  警告:0

mysql> select * from student;
+------+-------+
| id   | name  |
+------+-------+
|    1 | alex  |
|    2 | wusir |
+------+-------+
2 rows in set (0.00 sec)
データの削除:delete from テーブル名;#

上記を直接実行すると、テーブル全体が削除されます。

mysql> delete from student where id=1;
クエリOK、1行が影響を受けました (0.01 sec)

mysql> select * from student;
+------+-------+
| id   | name  |
+------+-------+
|    2 | wusir |
+------+-------+
1 row in set (0.00 sec)

4 テーブル操作#

ストレージエンジン#

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

mysql のストレージエンジン

テーブル構造とテーブルデータは別々に保存されます。

ストレージ方式1:MyISAM MySQL5.5およびそれ以前のバージョンのデフォルトストレージ方式

テーブル構造、テーブルデータ、インデックス

テーブルレベルロックをサポート トランザクションをサポートせず、行レベルロックをサポートせず、外部キーをサポートしない

ストレージ方式2: InnoDB MySQL5.6以降のデフォルトストレージ方式

	`テーブル構造、テーブルデータ `

トランザクション、行レベルロック、外部キーをサポートし、テーブルレベルロックもサポート

​ 行レベルロック:

ストレージ方式3:MEMORY メモリ

テーブル構造

利点:追加、削除、変更、クエリが非常に速い

欠点:再起動時にデータが消失し、容量が限られている

関連設定を確認する#

mysql> show variables like '%engine%';
+-----------------------------------------+---------------+
| Variable_name                           | Value         |
+-----------------------------------------+---------------+
| default_storage_engine                  | InnoDB        |
| default_tmp_storage_engine              | InnoDB        |
| disabled_storage_engines                |               |
| internal_tmp_mem_storage_engine         | TempTable     |
| secondary_engine_cost_threshold         | 100000.000000 |
| show_create_table_skip_secondary_engine | OFF           |
| use_secondary_engine                    | ON            |
+-----------------------------------------+---------------+
7 rows in set, 1 warning (0.00 sec)

テーブルを作成する:create table t1 (id int,name char(10)); ;\Gに置き換えると、フォーマットが整理されます。

テーブル構造を確認する:show create table テーブル名; そのテーブルに関連するすべての情報を見ることができます。

desc テーブル名; describe テーブル名;の 2 つの方法でテーブル構造を確認することができます。前者は省略形ですが、これらの 2 つの方法はテーブルのフィールド基本情報のみを確認できます。

テーブルを作成するときにストレージエンジンを同時に指定する:create table t2 (id int,name char(10)) engine=myisam;

mysql> create table t2 (id int,name char(10)) engine=myisam;
クエリOK、0行が影響を受けました (0.01 sec)

mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int DEFAULT NULL,
  `name` char(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| demo               |
| information_schema |
| mysql              |
| name               |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.02 sec)

mysql> create database demo_1;
クエリOK、1行が影響を受けました (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| demo               |
| demo_1             |
| information_schema |
| mysql              |
| name               |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

mysql> use demo_1
データベースが変更されました
mysql> select database();
+------------+
| database() |
+------------+
| demo_1     |
+------------+
1 row in set (0.00 sec)

mysql> create table t1 (id int,name char(10))
    -> ;
クエリOK、0行が影響を受けました (0.07 sec)

mysql> show create table t1;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                   |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int DEFAULT NULL,
  `name` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> desc t1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | YES  |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> describe t1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | YES  |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql>

インデックス - データベースディレクトリ#

テーブルを作成する#

create table テーブル名(フィールド1 タイプ);

MySQL 基本データ型#

数値型#

MySQL はすべての標準 SQL 数値データ型をサポートしています。

これらの型には、厳密な数値データ型(INTEGER、SMALLINT、DECIMAL および NUMERIC)と、近似数値データ型(FLOAT、REAL および DOUBLE PRECISION)が含まれます。

キーワード INT は INTEGER の同義語であり、キーワード DEC は DECIMAL の同義語です。

MySQL がサポートする整数型には TINYINT、MEDIUMINT、BIGINT があります。以下の表は、各整数型の必要なストレージと範囲を示しています。

小数の表現について、MYSQL は浮動小数点数と固定小数点数の 2 種類に分かれます。浮動小数点数には float(単精度)と double(倍精度)が含まれ、固定小数点数は decimal のみで、mysql では文字列の形式で保存され、浮動小数点数よりも正確で、通貨などの精度の高いデータを表現するのに適しています。

BIT データ型はビットフィールド値を保存し、MyISAM、MEMORY、InnoDB および BDB テーブルをサポートします。

サイズ範囲(符号付き)範囲(符号なし)unsigned 制約用途
TINYINT1 バイト(-128,127)(0,255)小整数値
SMALLINT2 バイト(-32 768,32 767)(0,65 535)大整数値
MEDIUMINT3 バイト(-8 388 608,8 388 607)(0,16 777 215)大整数値
INT または INTEGER4 バイト(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数値
BIGINT8 バイト(-9 233 372 036 854 775 808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)極大整数値
FLOAT4 バイト float (255,30)(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)単精度 浮動小数点数値
DOUBLE8 バイト double (255,30)(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)倍精度 浮動小数点数値
DECIMALDECIMAL (M,D) の場合、M>D であれば M+2、そうでなければ D+2double (65,30)M と D の値に依存M と D の値に依存小数値

int はデフォルトで符号付きであり、表示できる範囲は幅によって制約されません。

decimal は非常に正確に保存され、指定しない場合はデフォルト(10,0)になります。指定する場合は、最大で(25,30)を保存し、合計で 65 桁を保存します。そのうち小数点前に最大 25 桁、小数点後に最大 30 桁を保存します。

日付時間型#

時間値を表す日付と時間型は DATETIME、DATE、TIMESTAMP、TIME および YEAR です。

各時間型には有効値範囲と「ゼロ」値があり、指定された不正な MySQL が表現できない値の場合は「ゼロ」値が使用されます。

TIMESTAMP 型には専用の自動更新機能がありますが、後で説明します。

サイズ (バイト)範囲フォーマット用途
DATE31000-01-01/9999-12-31YYYY-MM-DD年月日
TIME3'-838:59:59'/'838:59:59'HH:MM時分秒
YEAR11901/2155YYYY年値
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM年月日時分秒
TIMESTAMP41970-01-01 00:00:00/2038 年の終了時間は第 2147483647 秒,北京時間 2038-1-19 11:14:07,グリニッジ時間 2038 年 1 月 19 日 凌晨 03:14:07YYYYMMDD HHMMSS混合日付と時間値、タイムスタンプ
mysql> create table t4 (d date,t time,dt datetime);
クエリOK、0行が影響を受けました (0.02 sec)

mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> insert into t4 values (now(),now(),now());
クエリOK、1行が影響を受けました、1つの警告 (0.01 sec)

mysql> select * from t4;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

mysql> insert into t4 values (null,null,null);
クエリOK、1行が影響を受けました (0.01 sec)

mysql> select * from t4;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
| NULL       | NULL     | NULL                |
+------------+----------+---------------------+
2 rows in set (0.00 sec)

date/time/datetimeの例
mysql> create table t5 (id1 timestamp);
クエリOK、0行が影響を受けました (0.02 sec)

mysql> desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1   | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
1 row in set (0.00 sec)

# nullを挿入すると、現在の時間が自動的に挿入されます
mysql> insert into t5 values (null);
クエリOK、1行が影響を受けました (0.00 sec)

mysql> select * from t5;
+---------------------+
| id1                 |
+---------------------+
| 2018-09-21 14:56:50 |
+---------------------+
1 row in set (0.00 sec)

# 新しい列を追加すると、デフォルト値は'0000-00-00 00:00:00'になります
mysql> alter table t5 add id2 timestamp;
クエリOK、0行が影響を受けました (0.02 sec)
レコード:0  重複:0  警告:0

mysql> show create table t5 \G;
*************************** 1. row ***************************
       Table: t5
Create Table: CREATE TABLE `t5` (
  `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR: 
クエリが指定されていません

# 新しい列のデフォルト値を現在の時間に手動で変更します
mysql> alter table t5 modify id2 timestamp default current_timestamp;
クエリOK、0行が影響を受けました (0.02 sec)
レコード:0  重複:0  警告:0

mysql> show create table t5 \G;
*************************** 1. row ***************************
       Table: t5
Create Table: CREATE TABLE `t5` (
  `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR: 
クエリが指定されていません

mysql> insert into t5 values (null,null);
クエリOK、1行が影響を受けました (0.01 sec)

mysql> select * from t5;
+---------------------+---------------------+
| id1                 | id2                 |
+---------------------+---------------------+
| 2018-09-21 14:56:50 | 0000-00-00 00:00:00 |
| 2018-09-21 14:59:31 | 2018-09-21 14:59:31 |
+---------------------+---------------------+
2 rows in set (0.00 sec)

timestampの例
mysql> create table t6 (t1 timestamp);
クエリOK、0行が影響を受けました (0.02 sec)

mysql> desc t6;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| t1    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
1 row in set (0.01 sec)

mysql> insert into t6 values (19700101080001);
クエリOK、1行が影響を受けました (0.00 sec)

mysql> select * from t6;
+---------------------+
| t1                  |
+---------------------+
| 1970-01-01 08:00:01 |
+---------------------+
1 row in set (0.00 sec)
# timestamp時間の下限は19700101080001です
mysql> insert into t6 values (19700101080000);
ERROR 1292 (22007): 列't1'の不正な日時値:'19700101080000'が行1で発生しました

mysql> insert into t6 values ('2038-01-19 11:14:07');
クエリOK、1行が影響を受けました (0.00 sec)
# timestamp時間の上限は2038-01-19 11:14:07です
mysql> insert into t6 values ('2038-01-19 11:14:08');
ERROR 1292 (22007): 列't1'の不正な日時値:'2038-01-19 11:14:08'が行1で発生しました
mysql> 

timestampの例2
mysql> create table t7 (y year);
クエリOK、0行が影響を受けました (0.02 sec)

mysql> insert into t7 values (2018);
クエリOK、1行が影響を受けました (0.00 sec)

mysql> select * from t7;
+------+
| y    |
+------+
| 2018 |
+------+
1 row in set (0.00 sec)

yearの例
mysql> create table t8 (dt datetime);
クエリOK、0行が影響を受けました (0.01 sec)

mysql> insert into t8 values ('2018-9-26 12:20:10');
クエリOK、1行が影響を受けました (0.01 sec)

mysql> insert into t8 values ('2018/9/26 12+20+10');
クエリOK、1行が影響を受けました (0.00 sec)

mysql> insert into t8 values ('20180926122010');
クエリOK、1行が影響を受けました (0.00 sec)

mysql> insert into t8 values (20180926122010);
クエリOK、1行が影響を受けました (0.00 sec)

mysql> select * from t8;
+---------------------+
| dt                  |
+---------------------+
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
| 2018-09-26 12:20:10 |
+---------------------+
4 rows in set (0.00 sec)

datetimeの例
文字列型#

文字列型は CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM および SET を指します。このセクションでは、これらの型がどのように機能し、クエリでどのように使用されるかを説明します。

サイズ用途
CHAR0-255 バイト定長文字列
VARCHAR0-65535 バイト可変長文字列
TINYBLOB0-255 バイト255 文字を超えないバイナリ文字列
TINYTEXT0-255 バイト短いテキスト文字列
BLOB0-65 535 バイトバイナリ形式の長いテキストデータ
TEXT0-65 535 バイト長いテキストデータ
MEDIUMBLOB0-16 777 215 バイトバイナリ形式の中程度の長さのテキストデータ
MEDIUMTEXT0-16 777 215 バイト中程度の長さのテキストデータ
LONGBLOB0-4 294 967 295 バイトバイナリ形式の極めて大きなテキストデータ
LONGTEXT0-4 294 967 295 バイト極めて大きなテキストデータ

CHAR と VARCHAR 型は似ていますが、保存と取得の方法が異なります。最大長と末尾の空白が保持されるかどうかなども異なります。保存または取得の過程で大文字小文字の変換は行われません。

CHAR 列の長さは、テーブル作成時に宣言された長さで固定され、範囲は (0-255) です。VARCHAR の値は可変長文字列で、範囲は (0-65535) です。

mysql> create table t9 (v varchar(4),c char(4));
クエリOK、0行が影響を受けました (0.01 sec)

mysql> insert into t9 values ('ab  ','ab  ');
クエリOK、1行が影響を受けました (0.00 sec)

# 検索時にcharデータ型は空白を削除します
mysql> select * from t9;
+------+------+
| v    | c    |
+------+------+
| ab   | ab   |
+------+------+
1 row in set (0.00 sec)

# 検索結果の長さを計算する
mysql> select length(v),length(c) from t9;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
|         4 |         2 |
+-----------+-----------+
1 row in set (0.00 sec)

# 結果にプラスを付けるとより明確になります
mysql> select concat(v,'+'),concat(c,'+') from t9;
+---------------+---------------+
| concat(v,'+') | concat(c,'+') |
+---------------+---------------+
| ab  +         | ab+           |
+---------------+---------------+
1 row in set (0.00 sec)

# 保存された長さが定義された長さを超えると、切り捨てられます
mysql> insert into t9 values ('abcd  ','abcd  ');
クエリOK、1行が影響を受けました、1つの警告 (0.01 sec)

mysql> select * from t9;
+------+------+
| v    | c    |
+------+------+
| ab   | ab   |
| abcd | abcd |
+------+------+
2 rows in set (0.00 sec)

char/varcharの例

BINARY と VARBINARY は CHAR と VARCHAR に似ていますが、異なるのはバイナリ文字列を含むことであり、非バイナリ文字列を含まないことです。つまり、バイト文字列を含み、文字セットがなく、並べ替えと比較は列値のバイトの数値に基づいています。

BLOB はバイナリ大オブジェクトで、可変量のデータを保持できます。BLOB 型には 4 種類あります:TINYBLOB、BLOB、MEDIUMBLOB および LONGBLOB。これらは、保存できる最大長が異なります。

TEXT 型には 4 種類あります:TINYTEXT、TEXT、MEDIUMTEXT および LONGTEXT。対応するこれらの 4 種類の BLOB 型は、保存できる最大長が異なり、実際の状況に応じて選択できます。

ENUM および SET 型#

ENUM の日本語名は列挙型であり、その値の範囲はテーブル作成時に列挙方式で明示する必要があります。ENUM は値の集合から単一の値を選択することしか許可されず、複数の値を同時に取得することはできません

SET は ENUM に非常に似ており、0-64 個のメンバーを含むことができる文字列オブジェクトです。メンバーの違いに応じて、ストレージも異なります。set 型は値の集合から任意の 1 つまたは複数の要素を組み合わせて選択することを許可します。範囲外の内容は挿入できず、重複する値は自動的に削除されます。

サイズ用途
ENUM1-255 個のメンバーの列挙には 1 バイトのストレージが必要;255-65535 個のメンバーには 2 バイトのストレージが必要;最大 65535 個のメンバーが許可されます。単選:性別を選択
SET1-8 個のメンバーの集合には 1 バイト、9-16 個のメンバーの集合には 2 バイト、17-24 個のメンバーの集合には 3 バイト、25-32 個のメンバーの集合には 4 バイト、33-64 個のメンバーの集合には 8 バイトのストレージが必要です。複数選択:趣味

set/enum の例

mysql> create table t10 (name char(20),gender enum('female','male'));
クエリOK、0行が影響を受けました (0.01 sec)

# enum('female','male')の中から1つを選択してgenderの値として挿入できます
mysql> insert into t10 values ('nezha','male');
クエリOK、1行が影響を受けました (0.00 sec)

# 'male,female'の2つの値を同時に挿入することはできず、'male,female'に属さない値を挿入することもできません
mysql> insert into t10 values ('nezha','male,female');
ERROR 1265 (01000): 列'gender'のデータが行1で切り捨てられました

mysql> create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车'));
クエリOK、0行が影響を受けました (0.01 sec)

# set('抽烟','喝酒','烫头','翻车')の中から任意の項目を選択でき、自動的に重複を排除します
mysql> insert into t11 values ('yuan','烫头,喝酒,烫头');
クエリOK、1行が影響を受けました (0.01 sec)

mysql> select * from t11;
+------+---------------+
| name | hobby        |
+------+---------------+
| yuan | 喝酒,烫头     |
+------+---------------+
1 row in set (0.00 sec)

# set('抽烟','喝酒','烫头','翻车')の中に属さない項目を選択することはできません
mysql> insert into t11 values ('alex','烫头,翻车,看妹子');
ERROR 1265 (01000): 列'hobby'のデータが行1で切り捨てられました

テーブルの制約#

特定の数字を無符号に設定するunsigned

特定のフィールドが NULL でないことを制約するnot null

特定のフィールドにデフォルト値を設定するdefault

特定のフィールドが重複しないように設定するunique

特定の int 型のフィールドを自動的に増加させるauto_increment

特定のフィールドが NULL でなく、重複しないように設定するprimary key

外部キーforeign key

結合ユニーク#
create table t4(
    id int,
    ip char(15),
    server char(10),
    port int,
    unique(ip,port)
);
mysql> create table t4(
    ->     id int,
    ->     ip char(15),
    ->     server char(10),
    ->     port int,
    ->     unique(ip,port)
    -> );
クエリOK、0行が影響を受けました (0.12 sec)

mysql> desc t4;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| id     | int      | YES  |     | NULL    |       |
| ip     | char(15) | YES  | MUL | NULL    |       |
| server | char(10) | YES  |     | NULL    |       |
| port   | int      | YES  |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> show create table t4;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                               |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t4    | CREATE TABLE `t4` (
  `id` int DEFAULT NULL,
  `ip` char(15) DEFAULT NULL,
  `server` char(10) DEFAULT NULL,
  `port` int DEFAULT NULL,
  UNIQUE KEY `ip` (`ip`,`port`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> insert into t4 values(1,'192.168.12.87','mysql',3306);
クエリOK、1行が影響を受けました (0.01 sec)

mysql> insert into t4 values(2,'192.168.12.87','kugou',8000);
クエリOK、1行が影響を受けました (0.01 sec)

mysql> insert into t4 values(3,'192.168.12.36','mysql',3306);
クエリOK、1行が影響を受けました (0.00 sec)

mysql> insert into t4 values(4,'192.168.12.36','mysql',3306);
ERROR 1062 (23000): 重複エントリ '192.168.12.36-3306' がキー 't4.ip' に対して発生しました。
mysql>
自動増加auto_increment#

自動増加フィールドは数字でなければならず、ユニークでなければならず、自動的に NULL の効果を持ちます。

create table t5(
    id int unique auto_increment,
    username char(10),
    password char(18)
);
mysql> create table t5(
    ->     id int unique auto_increment,
    ->     username char(10),
    ->     password char(18)
    -> );
クエリOK、0行が影響を受けました (0.07 sec)

mysql> desc t5;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int      | NO   | PRI | NULL    | auto_increment |
| username | char(10) | YES  |     | NULL    |                |
| password | char(18) | YES  |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> insert into t5(username,password) value('alex','alex3345');
クエリOK、1行が影響を受けました (0.01 sec)

mysql> insert into t5(username,password) value('alex','alex3345');
クエリOK、1行が影響を受けました (0.00 sec)

mysql> insert into t5(username,password) value('alex','alex3345');
クエリOK、1行が影響を受けました (0.00 sec)

mysql> select * from t5;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | alex     | alex3345 |
|  2 | alex     | alex3345 |
|  3 | alex     | alex3345 |
+----+----------+----------+
3 rows in set (0.00 sec)

mysql>show create table t5;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t5    | CREATE TABLE `t5` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` char(10) DEFAULT NULL,
  `password` char(18) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
主キーprimary key#

1 つのテーブルには 1 つの主キーしか存在できません。

1 つのテーブルには主キーがない場合もありますが、各テーブルには主キーを設定することをお勧めします。

このフィールドを制約し、NULL でなく(not null)かつユニーク(unique)であることを保証します。

create table t6(
id int not null unique,
name char(12) not null unique
);
mysql> create table t6(
    -> id int not null unique,
    -> name char(12) not null unique
    -> );
クエリOK、0行が影響を受けました (0.03 sec)
mysql> desc t6;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | NO   | PRI | NULL    |       |
| name  | char(12) | NO   | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

指定した最初の NULL でなくユニークなフィールドは主キーとして定義されます。

create table t7(
    id int primary key,
    name char(12) not null unique
);
mysql> create table t7(
    ->     id int primary key,
    ->     name char(12) not null unique
    -> );
クエリOK、0行が影響を受けました (0.08 sec)

mysql> desc t7;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int      | NO   | PRI | NULL    |       |
| name  | char(12) | NO   | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.02 sec)

直接指定した primary key はデフォルトで NULL でなくユニークです。

結合主キー#
create table t8(
    id int,
    ip char(15),
    server char(10),
    port int,
    primary key(ip,port)
);
外部キーforeign keyは 2 つのテーブルに関連します#

従業員テーブル

id age gender salary hire_date postid

部門テーブル

postname postid post_comment post_phone

mysql> create table post(
    -> postid int primary key,
    -> postname char(10) not null unique,
    -> comment varchar(255),
    -> phone_num char(11)
    -> );
クエリOK、0行が影響を受けました (0.03 sec)

mysql> create table staff(
    -> id int primary key auto_increment,
    -> age int,
    -> gender enum('male','female'),
    -> salary float(8,2),
    -> hire_date date,
    -> post_id int,
    -> foreign key(post_id) references post(postid)
    -> );
クエリOK、0行が影響を受けました、1つの警告 (0.04 sec)

mysql> desc staff;
+-----------+-----------------------+------+-----+---------+----------------+
| Field     | Type                  | Null | Key | Default | Extra          |
+-----------+-----------------------+------+-----+---------+----------------+
| id        | int                   | NO   | PRI | NULL    | auto_increment |
| age       | int                   | YES  |     | NULL    |                |
| gender    | enum('male','female') | YES  |     | NULL    |                |
| salary    | float(8,2)            | YES  |     | NULL    |                |
| hire_date | date                  | YES  |     | NULL    |                |
| post_id   | int                   | YES  | MUL | NULL    |                |
+-----------+-----------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

mysql> desc post;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| postid    | int          | NO   | PRI | NULL    |       |
| postname  | char(10)     | NO   | UNI | NULL    |       |
| comment   | varchar(255) | YES  |     | NULL    |       |
| phone_num | char(11)     | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> show create table staff;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| staff | CREATE TABLE `staff` (
  `id` int NOT NULL AUTO_INCREMENT,
  `age` int DEFAULT NULL,
  `gender` enum('male','female') DEFAULT NULL,
  `salary` float(8,2) DEFAULT NULL,
  `hire_date` date DEFAULT NULL,
  `post_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `post_id` (`post_id`),
  CONSTRAINT `staff_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`postid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into post values(1 ,'python部門','良いチーム','01066666666');
クエリOK、1行が影響を受けました (0.01 sec)

mysql> insert into staff values(1 ,80,'male',100000,20101010101010,1);
クエリOK、1行が影響を受けました、1つの警告 (0.01 sec)

mysql>

外部キーは少なくとも 1 つの主キーに関連し、注意が必要です:関連するテーブルを先に作成し、その後外部キーを持つテーブルを作成します。例えば、上記のように部門テーブルを先に作成し、その後従業員テーブルを作成します。

カスケード削除とカスケード更新on update cascade on delete cascade#
mysql> create table staff2(
    -> id int primary key auto_increment,
    -> age int,
    -> gender enum('male','female'),
    -> salary float(8,2),
    -> hire_date date,
    -> post_id int,
    -> foreign key(post_id) references post(postid) on update cascade on delete cascade
    -> );

on delete(理解)

. cascade方式
親テーブルでupdate/deleteレコードを行うと、子テーブルの一致するレコードも同期してupdate/deleteされます。

   . set null方式
親テーブルでupdate/deleteレコードを行うと、子テーブルの一致するレコードの列がnullに設定されます。
子テーブルの外部キー列はNULLでないことができません。

   . No action方式
子テーブルに一致するレコードがある場合、親テーブルの対応する候補キーに対してupdate/delete操作を許可しません。

   . Restrict方式
no actionと同様で、外部キー制約を即座にチェックします。

   . Set default方式
親テーブルに変更があった場合、子テーブルの外部キー列がデフォルト値に設定されますが、Innodbは認識できません。

テーブルの変更#

構文:

  1. テーブル名を変更する
    ALTER TABLE テーブル名
    RENAME 新テーブル名;

  2. フィールドを追加する
    ALTER TABLE テーブル名
    ADD フィールド名 データ型 [完全性制約条件…],
    ADD フィールド名 データ型 [完全性制約条件…];

  3. フィールドを削除する
    ALTER TABLE テーブル名
    DROP フィールド名;

  4. フィールドを変更する
    ALTER TABLE テーブル名
    MODIFY フィールド名 データ型 [完全性制約条件…];
    ALTER TABLE テーブル名
    CHANGE 旧フィールド名 新フィールド名 旧データ型 [完全性制約条件…];
    ALTER TABLE テーブル名
    CHANGE 旧フィールド名 新フィールド名 新データ型 [完全性制約条件…];

  5. フィールドの順序を変更する / 追加時にフィールド位置を指定する
    ALTER TABLE テーブル名
    ADD フィールド名 データ型 [完全性制約条件…] FIRST;
    ALTER TABLE テーブル名
    ADD フィールド名 データ型 [完全性制約条件…] AFTER フィールド名;
    ALTER TABLE テーブル名
    CHANGE フィールド名 旧フィールド名 新フィールド名 新データ型 [完全性制約条件…] FIRST;
    ALTER TABLE テーブル名
    MODIFY フィールド名 データ型 [完全性制約条件…] AFTER フィールド名;

テーブル関係#

2 つのテーブル間の関係

多対一

=====================多対一=====================
create table press(
id int primary key auto_increment,
name varchar(20)
);

create table book(
id int primary key auto_increment,
name varchar(20),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);


insert into press(name) values
('北京工業地雷出版社'),
('人民音楽が良くない出版社'),
('知的財産が役に立たない出版社')
;

insert into book(name,press_id) values
('九陽神功',1),
('九陰真経',2),
('九陰白骨爪',2),
('独孤九剣',3),
('降龍十巴掌',2),
('葵花宝典',3)
;

sqlの例

一対一

create table customer(
    -> id int primary key auto_increment,
    -> name varchar(20) not null,
    -> qq varchar(10) not null,
    -> phone char(16) not null
    -> );

create table student(
    -> id int primary key auto_increment,
    -> class_name varchar(20) not null,
    -> customer_id int unique, #このフィールドは必ずユニークである必要があります
    -> foreign key(customer_id) references customer(id) #外部キーのフィールドは必ずユニークである必要があります
    -> on delete cascade
    -> );

#顧客を追加する
mysql> insert into customer(name,qq,phone) values
    -> ('韩蕾','31811231',13811341220),
    -> ('杨澜','123123123',15213146809),
    -> ('翁惠天','283818181',1867141331),
    -> ('杨宗河','283818181',1851143312),
    -> ('袁承明','888818181',1861243314),
    -> ('袁清','112312312',18811431230)

mysql> #学生を追加する
mysql> insert into student(class_name,customer_id) values
    -> ('脱产1班',3),
    -> ('周末1期',4),
    -> ('周末1期',5)
    -> ;
sqlの例

多対多

=====================多対多=====================
create table author(
id int primary key auto_increment,
name varchar(20)
);


#このテーブルは著者テーブルと書籍テーブルの関係を保存します。つまり、二者の関係を調べるにはこのテーブルを参照します。
create table author2book(
id int not null unique auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id,book_id)
);


#4人の著者を挿入し、idを順に並べます
insert into author(name) values('egon'),('alex'),('yuanhao'),('wpq');

#各著者の代表作は以下の通りです
egon: 
九陽神功
九陰真経
九陰白骨爪
独孤九剣
降龍十巴掌
葵花宝典
alex: 
九陽神功
葵花宝典
yuanhao:
独孤九剣
降龍十巴掌
葵花宝典
wpq:
九陽神功


insert into author2book(author_id,book_id) values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(2,1),
(2,6),
(3,4),
(3,5),
(3,6),
(4,1)
;
sqlの例

データ操作#

追加insert#

insert into テーブル名 values (値...);このテーブル内のすべてのフィールドを順番に記入する必要があります。

insert into テーブル名 (フィールド名,フィールド名...) values (値...);フィールド位置に名前を記入したすべてのフィールドは、後の値と一対一で対応する必要があります。

insert into テーブル名 value (値...);一度に 1 行のデータしか書き込めず、values は一度に複数行書き込むことができます。

削除delete#

delete from テーブル where 条件;

変更update#

update テーブル set フィールド=新しい値 where 条件;

クエリselect#

select * from テーブル名; select フィールド from テーブル名;

重複を除去するselect distinct フィールド from テーブル名;

四則演算select フィールド*10 from テーブル名;同時に四則演算後の名前を変更することもできますselect フィールド*10 as 新しい名前 from テーブル名;または as を省略して空白を保持します。

where 文#

比較演算#

> < = >= <= != <> (不等号を示す)

範囲演算#

​ 多選一 in

select * from テーブル名 where フィールド名 in (値1,値2,値3);

​ 数値範囲内での模糊検索

​ 数値区間 [a,b] between

select * from テーブル名 where フィールド名 between a and b;

​ 文字列の模糊検索like

​ ワイルドカード %は任意の長さの任意の内容にマッチします。

select * from テーブル名 where フィールド名 like '模糊文字%';

​ ワイルドカード _は 1 文字の長さの任意の内容にマッチし、必要な分だけ_を追加します。

select * from テーブル名 where フィールド名 like '模糊文字__';

​ 正規表現マッチregexp

select * from テーブル名 where フィールド名 regexp '正規表現';

論理演算 - 条件の結合#

AND and OR or NOT not

グループ化 group by#

select * from テーブル名 group by フィールド;

group by の後のこのフィールドの各異なる項目を保持し、この項目のすべての値を 1 つのグループにまとめます。

集計#

count(フィールド)このフィールドにいくつの項目があるかをカウントしますselect count(*) from テーブル名;

sum(フィールド)このフィールドに対応する数値の合計をカウントします。

avg(フィールド)このフィールドに対応する数値の平均値をカウントします。

min(フィールド)このフィールドに対応する数値の最小値をカウントします。

max(フィールド)このフィールドに対応する数値の最大値をカウントします。

グループ化集計#

select count(*) from テーブル名 group by フィールド;

select sum(フィールド) from テーブル名 group by フィールド;

フィルタリングhaving#

having は常に group by と一緒に使用されます。

select フィールド from テーブル名 group by フィールド名 having 条件;

`

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。