記事ディレクトリ
序文
皆さんこんにちは、私は邱宜林です。
学期も終わりに近づいています。終わる前に、MySQL に関する記事を要約します。この記事には多くのスペースと内容があり、コンテンツの範囲が比較的広く、比較的浅く、比較的浅いため、コレクションレベルの記事です。理解しやすく、mysql を学習している初心者に非常に適しており、 mysql の基本的な操作をすべて網羅したmsyql コマンドマニュアル大全としても使用できます(ディレクトリ構造を見れば理解できると思います)。
常に新しく見えます、常に新しく見えます、常に新しく見えます。!~
迷子にならないようブックマーク+注意を忘れずに。
クラウド コミュニティへようこそ
1.ERモデル
エンティティ リレーションシップ モデル (略して ER モデル) は、DBMS に束縛されないユーザー指向の表現方法を提供し、データベース設計におけるデータ モデリング ツールとして広く使用されています。
プロジェクトに取り組んでいるときは、データベース構造が明確かつ合理的になるように、ER モデルを使用して事前に ER 図を描く必要があります。
テーブルに対して挿入、更新、または削除できるデータまたはデータの種類に制限を課す DBMS の制約。制約の全体的な目的は、テーブルの更新、削除、挿入中にデータの整合性を維持することです。
制約の種類
- null 以外、一意、デフォルト、検証、キー制約 - 主キー、外部キー、ドメイン制約、マップ制約
2. データ型
3. フィールドの命名規則
1. 26 文字の英字 (大文字と小文字が区別されます) と 0 ~ 9 の自然数 (多くの場合は必要ありません) にアンダースコア _' を加えたもので構成されており、名前は簡潔かつ明確であり、複数の単語はアンダースコア _' で区切られています。
2. 通常は小文字の名前を使用します。
3. table、time、datetime、primary などのデータベース キーワードの使用は禁止されています。
4. フィールド名には通常、user_id、is_good などの名詞または動詞と目的語の句が使用されます。
5. 使用されるフィールドの名前は理解しやすいものでなければなりません。通常は英単語 3 語以内です。
4. データベースの作成と管理
ヘルプ
例証します:
- table_name: データテーブルのテーブル名
col_name: フィールド名
data_type: フィールドのデータ型
作成プロセスを見る
文法:show create 关键字(table database) 名称;
show create table t_teacher;
4.1. データベースの作成
文法:create database db_name;
create database db_test;
4.2、データベースを削除する
文法:drop database db_name;
drop database db_test;
4.3. データベースの一覧表示
文法:show databases;
show databases;
4.4、データベースのバックアップ
ホストマシン上で動作する場合は、-h パラメータを省略できます。
文法:mysqldump -h 主机名 -u 用户名 -p 密码 数据库名称 > 脚本文件路径;
mysqldump -uroot -p000000 test > test.sql;
4.5. データベースの復元
文法:mysql -h 主机名 -u 用户名 -p 密码 数据库名称 < 脚本文件路径;
mysql -uroot -p000000 test < test.sql;
或者
source test.sql;
4.6. 特定のデータベースの使用
文法:use db_name;
use db_test;
5. データテーブルの作成と管理
5.1、テーブル、構造の作成
構文: create table table_name(col_name1 data_type1,col_name2 data_type2,....);
t_test データ テーブルを作成します。フィールドは id、name (データ型の数値はフィールド長です)
create table t_test(id char(20),name char(10));
5.2. ビューテーブル構造
文法:describe table_name;
desc table_name;
description は desc と省略できます。
describe t_test;
desc t_test;
5.3、データテーブルを表示する
文法:show tables;
show tables;
5.4. テーブル構造のコピー
別のデータベースのテーブル構造をコピーする場合は、table_name2 の前にデータベースの名前を追加します。
文法:create table new_table_name1 like old_table_namme2;
データベース db_test 内の t_test1 テーブル構造を現在のデータベースにコピーし、テーブル構造 t_test2 という名前を付けます。
create table t_test1 like t_test2;
5.5. テーブルデータのコピー
一貫したテーブル構造
insert into table_name_new select * from table_name_old;
一貫性のないテーブル構造
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old;
5.6. テーブル名の変更
文法:alter table old_table_name (旧名字) rename new_table_name(新名字);
alter table t_test1 rename t_test2;
5.7. フィールドの追加
文法:alter table table_name add col_name1(添加字段名)data_type (字段类型);
alter table t_test add test_address varchar(255);
5.7.1. 追加したフィールドを最初に配置する
文法:alter table table_name add col_name1(添加字段名)data_type (字段类型) first;
alter table t_test add test_address varchar(255) first;
5.7.2. 追加したフィールドを test2 フィールドの後に配置します。
文法:alter table table_name add col_name1(添加字段名)data_type (字段类型) after test2(字段);
alter table t_test add test1 varchar(20) after test2;
5.8、フィールドの削除
文法:alter table t_reader drop reader_qq (删除的字段名);
alter table t_test drop test1;
5.9. フィールドのデータ型を変更する
構文: alter table table_name modify col_name1(字段名) data_type (字段类型);
test2 のデータ型を varchar から char に変更します。
alter table table_name modify test2 char(100);
5.10. フィールド名の変更
文法:alter table table_name change old_col_name(字段名) new_col_old(新字段名) data_type(字段数据类型);
alter table t_test change test_address address char(100);
5.11、主キーを設定する
役割: 入力レコードの一意性を保証するため
方法:
- テーブル作成時に設定
- テーブル作成後に設定
構文:create table table_name(xs_id char(12),xs_name char(10) primary key (xs_id));
スタッドネット テーブルを作成するときに、主キーとして xs_id を設定します。
create table student (xs_id char(12),xs_name char(10),primary key(xs_id));
スタッドネットテーブルを作成する際には、主キーとして xs_id と xs_name を設定します。複数のフィールドを主キーとして設定するこの方法は、複合主キーと呼ばれます。複合主キーも主キー (一意性) です。
create table student (xs_id char(12),xs_name char(10),primary key(xs_id,xs_name));
5.12、主キーを削除する
语法:テーブル table_name を変更し、主キーを削除します。
alter table studnet drop primary key;
5.13、外部キー
役割: データの整合性を確保すること。好き:
- エンティティの完全性
- ユーザー定義の整合性
- 参照整合性
フィールドが主キーになった後にのみ、別のテーブルの外部キーになれます。
文法:alter table table_name add constraint 外键名称 foreign key (设为外键的字段名)references t_table2(主键字段名);
t_test1 テーブルの id フィールドを主キーとして設定し、t_test2 テーブルの id フィールドを外部キーとして設定します。
alter table t_test2 add constraint fk1 foreign key (id) references t_test1(id);
5.14. 外部キーの削除
構文:show create table table_name;
外部キー名を取得します。
show create table t_test2;
文法:alter table t_test2 drop foreign key 外键名称;
alter table t_test2 drop foreign key fk1;
6. データ更新
6.1、レコードの挿入
6.1.1. 単一レコードの挿入
文法:insert [into] 表名 [字段1,字段n] values(值1,值n);
insert into test values(123,'tt');
insert into test(pid) values(124);
6.1.2. 複数のレコードの挿入
insert into test values(125,'ttww'),(126,'ttwwe'),(127,'ttqqq');
6.1.3、サブクエリ、複数のレコードの挿入
select によってクエリされたコンテンツ フィールドを使用して、inert に対応するフィールドに挿入します。
文法:insert [into] 表名1 [字段1,字段n] select [字段1,字段n] from 表名2 [where语句];
insert into test-1 select * from test-2;
insert into test-1(pid,name) select pid,name from test-2;
6.2、削除 レコードの削除
文法:delete from 表名 [where <条件>];
delete from test; ## 删除所有记录
delete from test where pid==123; #删除id为123的这条记录。
6.3、アップデート更新記録
文法:update 表名 set 列名1 = 值1,列名2 = 值2,…[where 条件];
7. データクエリ
7.1. 単一テーブルクエリ
1. 構文: select <[列名1,列名n 或通配符 [as 别名] ]> from 表名;
as: フィールドのエイリアス
2. 文法:select distinct <[列名1,列名n 或通配符]> from 表名;
重複を削除し、対応するフィールドの前に追加します。
記号式:
7.1.1、一般的なキーワード
- AND、OR: 複数の条件を結合
BETWEEN AND: Between
IS NULL: NULL 値のクエリ
IN: 特定のセットでのクエリ
LIKE: ファジークエリ
7.1.2. ワイルドカード
「*」ワイルドカード: 任意の列名に一致します。
「_」ワイルドカード: 単一の文字に一致します。
「%」ワイルドカード: 任意の文字に一致します。
7.1.3、order by子句
order by 句を使用すると、1 つ以上の属性列 (コンマで区切られた複数の属性) を昇順 (ASC) または降順 (DESC) でインストールできます。デフォルトは昇順です。
--查询结果按照bookPrice列值的降序排列
select * from books order by bookPrice desc;
7.1.4. 集計関数
例:
#查询book表中年龄最大的
select max(age) from book;
7.1.5、group by子句
クエリ結果を 1 つ以上の列の値でグループ化し、それらの値はグループとして同等になります。
select count(*),pressName from books group by pressName;
例: 次のリストには、「People's Posts and Telecommunications Press」という名前の名前が 1 つあり、「Tsinghua University Press」という名前の名前が 6 つあります。
7.2. 接続クエリ
2 つのテーブルまたは複数のテーブルの列間の関係に従ってデータをクエリします。つまり、結合クエリです。
7.2.1. 簡単接続
接続クエリは実際には、テーブル間で相互に関連する列を介したデータ クエリであり、リレーショナル データベースの場合、接続はクエリの最も重要な機能です。
単純結合は、カンマを使用して 2 つ以上のテーブルを結合し、複数テーブル クエリの最も一般的に使用される形式です。
例:
select b.reader_id,br.book_name from books b,borrow_record br where b.ISBN=br.ISBN;
7.2.2、JOIN接続
カンマを使用して接続するほかに、JOIN を使用して接続することもできます。
7.2.2.1、内部結合(内部結合)
1) 等価接続
select * from books b inner join borrow_record br where b.ISBN=br.ISBN;
2) 不等接続
select * from books b inner join borrow_record br where b.ISBN<>br.ISBN;
7.2.2.2、外部結合(左結合、右結合)
1)左結合
後に条件判定を実行する場所を指定することもできます。
select * from books b left join borrow_record br on b.ISBN=br.ISBN;
2)
正しい接続後に条件判定を実行する場所を使用することもできます。
select * from books b right join borrow_record br on b.ISBN=br.ISBN;
7.3. ネストされたクエリ
SQL 言語では、select-from-where ステートメントはクエリ ブロックと呼ばれます。あるクエリ ブロックを別のクエリ ブロックの where 句または Having 句の条件内にネストするクエリは、ネストされたクエリ と呼ばれます。
文法:select <字段名或通配符> from <表或视图名> where [表达式] (select <字段名或通配符> from <表或视图名> where [表达式] )
7.3.1. IN 述語を使用したサブクエリ
select * from books where isbn in (select * isbn from brrowrecord where reader_id='201801');
7.3.2. 比較演算子を使用したサブクエリ
比較演算子を使用した親クエリとサブクエリ間の接続を指します。>、<、=、>=、<=、!=、<> などの比較演算子を使用できます。
select * from books where isbn=(select * isbn from brrowrecord where reader_id='201801');
7.3.3. ANY (SOME) または ALL 述語を含むサブクエリ
サブクエリが単一の値を返す場合、比較演算子を使用できますが、複数の値が返される場合は、ANY (一部のシステムでは SOME を使用する)述語または ALL 述語を使用する必要があります。ANY または ALL 述語を使用する場合、比較演算子同時に使用する必要があります。
述語の解釈:
例:
#查询读者编号为"201801"的学生未借阅的所有图书的详细信息;
select * from books where isbn <> all(select isbn from brrowwrecord where reader_id="201801");
7.3.4. EXISTS 述語を使用したサブクエリ
EXISTS 述語のサブクエリはデータを返さず、ブール値 (true または false) の論理判定を行います。存在量指定子 EXISTS を使用した後、内側のクエリ結果が空の場合、外側の WHERE 句は true を返し、それ以外の場合は否定されます。
例:
#查询读者编号为201801的读者没有借阅过的图书信息
select * from books where not exists (select * from borrowrecord where isbn=books.isbn and reader_id="201801");
7.4. 結合クエリ
#两个表字段合并显示,两个表相同字段合并后显示一次
select * from t_major1 union select * from t_major;
8. インデックス
インデックスは、テーブル内のデータ行の検索を高速化するために作成された分散ストレージ構造です。
8.1. 作成したテーブルのインデックスを作成する
1) CREATE INDEX メソッドを使用して、すでに作成されているテーブル t_student のフィールド名 stu_id の通常の降順インデックスを作成します。
構文: create [unique | fulltext] index index_name on table_name(co_name ase|desc , [co_name ase|desc] )
#複数フィールドのインデックスはカンマ (,) で区切られます。
create index index_student on t_student(stu_id desc)
2) ALTER TABLE...ADD INDEX メソッドを使用して、テーブル t_course のフィールド列 course_name のフルテキスト インデックスを作成します。
構文: alter table table_name add [unique | fulltext] index index_name(co_name ase|desc , [co_name ase|desc] )
#複数フィールドのインデックスはカンマ (,) で区切られます。
alter table t_course add fulltext index index_course_name(course_name)
8.2. 新しいテーブル作成時にインデックスを作成する
t_Teacher の構造と一致するテーブル t_Teacher2 を作成し(テーブル構造はコピーできません)、テーブル作成プロセス中にインデックスを作成し、Teacher_id 用の一意の昇順インデックスを作成します。
create table t_teacher2(teacher_id char(10),teacher_name char(50),index index_tea_id(teacher_id asc));
9. 見る
ビュー (View) は、実際には 1 つ以上のリレーショナル テーブル (またはビュー) から派生したテーブルであり、ソフト リンクに似た仮想テーブルです。
9.1、ビューの作成
ビュー view_basic_info を作成します。データは t_student テーブルから取得されます
。 構文:create view <视图名> as select_statement
create view view_basic_info as select * from t_student;
9.2、ビューを変更する
文法:create view <视图名> as select_statement
alter view view_basic_info as select * from t_student;
9.3、ビューの削除
drop view view_basic_info;
10. ストアド プロシージャ
ストアド プロシージャはプログラム内の関数と非常によく似ており、特定のタスクを達成するために複数回呼び出す必要があるコード セグメントをプロシージャに書き込み、データベースに保存し、プロシージャ名で呼び出すことができます。プロシージャはストアド プロシージャに対して呼び出されます。
DELIMITER 定義: ステートメントの終了後に使用される区切り文字を設定します。MYSQL のデフォルトの終了文字は「;」です。
10.1. ストアドプロシージャの作成
mysql> delimiter $
mysql> create procedure p1()
-> comment '读者信息'
-> begin
-> select * from t_reader;
-> end $
mysql> delimiter ;
10.2. ストアドプロシージャの呼び出し
mysql> call p1;
10.3. ストアドプロシージャの削除
mysql> drop procedure p1;
10.4. パラメーターを使用したストアドプロシージャの作成
10.4.1、インチ
- 入力パラメーターを使用してストアド プロシージャを作成し、特定の学生番号に対応する学生情報をクエリします。
mysql> delimiter $
mysql> create procedure p3(in stuid char(10))
comment "查询某个学号对应的学生信息"
begin
select * from t_student where stu_id=stuid;
end $
mysql> delimiter ;
mysql> call p3(1631607102); #调用存储过程
10.4.2、アウト
- すべての生徒の数をクエリするための出力パラメーターを使用してストアド プロシージャを作成します。
注: 変数名の前に @ を追加することは、次のことを意味します: セッション変数
セッション変数: ストアド プロシージャの内部に限定されません
mysql> delimiter $
mysql> create procedure p6(out stucount int)
begin
select COUNT(stu_id) into stucount from t_student;
end $
mysql> delimiter ;
mysql> call p6(@stucount); #调用存储过程
mysql> select @stucount; #查看输出变量
10.4.3、入出力
- 特定のスコアに 20 ポイントを追加する入力パラメーターと出力パラメーターを含むストアド プロシージャを作成します。
mysql> delimiter $
mysql> create procedure p9(inout testname int)
begin
update t_score set grade=grade+20 where score_id=testname;
select grade into testname from t_score where score_id=testname;
end $
mysql> delimiter ;
mysql> set @testname=1001;
mysql> call p9(@testname);
mysql> select @testname;
@pra: セッション変数はストアド プロシージャ内に限定されません
11. SQL プログラミングの基礎
11.1、SQL プログラミングの基本構文
SQL は本質的に、データを保存するために変数を必要とするプログラミング言語です。MySQL の多くの属性コントロールは、MySQL の変数を通じて実装されます。
変数は、システム変数とユーザー変数の2 つのカテゴリに分類されます。
システム変数: すべてのユーザー、つまり MySQL のすべてのクライアントに有効です。
ユーザー変数: 対応するユーザーを指定します。
11.1.1. システム変数
MySQL システム変数は、実際にはシステム パラメータを保存するために使用され、MySQL によるシステム リソースの占有、設定ファイルの保存場所などの初期化と設定に使用されます。ほとんどの変数は MySQL システムの調整パラメータとして存在し、これらのパラメータを変更すると MySQL の動作モードに影響します。
システム変数: グローバル (グローバル) 変数とセッション (セッション) 変数に分けられます。
グローバル変数: MySQL インスタンス全体の全体的な操作に影響します。
セッション変数: MySQL インスタンスへの現在の接続に影響します。
11.1.1.1. システム変数の表示
11.1.1.1.1、セッション変数とグローバル変数
文法:show variables 条件语句
条件ステートメント: システム変数をクエリするためのフィルター条件を表します (オプション)
すべてのシステム変数を表示します。最初にセッション変数、次にグローバル変数を表示します。
show variables; //查看所有系统变量
global キーワードと session キーワードを使用して、システム変数の範囲を制限します。
show global variables; //查看全局变量
show session variables; //查看会话变量
すべてではなく、特定のシステム変数の一部を表示したい場合は、like ステートメントと where ステートメントを使用できます。
show variables like 'log%'; //查询所有变量名以log开头的系统变量
クエリ内で変数名の条件に加えて値の条件も使用されている場合は、where ステートメントを使用できます。
show variables where variable_name like 'log%' and value='OFF';
11.1.1.1.2、構成変数と監視変数
MySQL システム変数は、構成変数と監視変数にも分類できます。
show variables; // 查看配置变量
show status; // 查看监控变量
同様に、システムステータス変数をクエリするときに条件ステートメントを追加する場合、方法は構成変数をクエリするときと同じです。
11.1.1.2、共通システム変数
作中では、データベースは大きく「開発ライブラリ」、「テストライブラリ」、「オンラインライブラリ」などの環境に分けられます。
現在の MySQL バージョン情報を表示する
mysql> show variables like 'version%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| version | 8.0.30 |
| version_comment | MySQL Community Server - GPL |
| version_compile_machine | x86_64 |
| version_compile_os | Win64 |
| version_compile_zlib | 1.2.12 |
+-------------------------+------------------------------+
5 rows in set, 1 warning (0.02 sec)
最大接続数
データベースに接続すると、エラー メッセージが頻繁に
MySQL: ERROR 1040: Too many connections
表示されます。アクセスが多すぎて MySQL が処理できない場合は、「スレーブ」サーバーの数を増やすことで「読み取り」のプレッシャーを軽減できます。もう 1 つの状況は、MySQL 構成ファイルの設定max_connections
値。
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 200 |
+-----------------+-------+
1 row in set, 1 warning (0.00 sec)
現在の接続
そうすることでのみ
Threads_connected <= max_connections
、データベースへの通常の接続が保証されます。
mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 1 |
+-------------------+-------+
1 row in set (0.00 sec)
MySQLエンコーディング構成情報
中国語の文字化けの問題が発生する場合、通常は MySQL のエンコード設定の不一致が原因です。
mysql> show variables like '%set%';
+---------------------------------------+---------------------------------------------------------------+
| Variable_name | Value |
+---------------------------------------+---------------------------------------------------------------+
| auto_increment_offset | 1 |
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | D:\APP\Pro_Software\MYSQL\mysql-8.0.30-winx64\share\charsets\ |
| innodb_monitor_reset | |
| innodb_monitor_reset_all | |
| optimizer_trace_offset | -1 |
| performance_schema_setup_actors_size | -1 |
| performance_schema_setup_objects_size | -1 |
| resultset_metadata | FULL |
| transaction_write_set_extraction | XXHASH64 |
+---------------------------------------+---------------------------------------------------------------+
16 rows in set, 1 warning (0.00 sec)
11.1.1.3. システム変数の設定と変更
システム変数の場合、MySQL サービスを開始する前に my.cnf 構成ファイルを変更するか、開始時に変更する起動パラメータを指定します。
サービスの開始後、set ステートメントを使用して変数値を変更できます。
//修改全局变量
set global var_name = value;
set @@global.var_name = value;
//修改会话变量
set session var_name = value;
set @@session.var_name = value;
11.1.2. ユーザー変数
ユーザー変数とは、ユーザーが定義した変数を指し、ユーザー変数に値を割り当てることができます。ステートメントを使用して割り当てを定義できset 和 select
(デフォルトでは空の割り当てはありません)、select ステートメントで割り当てられた値を表示することもできます。
変数スコープ: 現在の接続のセッション スコープ (現在の接続が切断されている場合、以前に定義された変数にはアクセスできません)。
ユーザー変数の形式を定義します。「@var_name」のように「@」で始まり、ユーザー変数とテーブル内の列名を区別します。 '=',':='
演算子の割り当てを使用できます。select ステートメントを使用する場合は、':='
演算子の
文法:
set @var_name = value1 [ , @var_name = value2];
set @var_name := value1 [ , @var_name := value2];
set ステートメント
mysql> set @test=123;
Query OK, 0 rows affected (0.00 sec)
mysql> select @test;
+-------+
| @test |
+-------+
| 123 |
+-------+
1 row in set (0.00 sec)
mysql> set @var1=1,@var2=2;
Query OK, 0 rows affected (0.00 sec)
mysql> select @var1,@var2;
+-------+-------+
| @var1 | @var2 |
+-------+-------+
| 1 | 2 |
+-------+-------+
1 row in set (0.00 sec)
select ステートメント
mysql> select @var:=1,@var:=2;
+---------+---------+
| @var:=1 | @var:=2 |
+---------+---------+
| 1 | 2 |
+---------+---------+
1 row in set, 2 warnings (0.00 sec)
mysql> select @var,@var;
+------+------+
| @var | @var |
+------+------+
| 2 | 2 |
+------+------+
1 row in set (0.00 sec)
11.2. SQL システム関数
11.2.1、条件判定機能
if関数
構文:if(expr1,expr2,expr3)
式の結果が true (ブール型) の場合は expr2 の値を返し、それ以外の場合は expr3 の値を返します。
ケース構造
case case_expr
when when_value then statement_list
[ when when_value then statement_list ]...
end case
case_expr: いつ実行するかを決定する条件判定式。when_value: 式の可能な値を示します。when_value の値が case_expr 式の値の結果と同じである場合、対応する then キーワードの後のstatement_list ステートメントが実行されます。
11.2.2. 数学関数
よく使われる関数。主に、整数や浮動小数点数などの数学関数を含む数値の処理に使用されます。
11.2.3. 文字列関数
文字列関数は非常によく使用される関数です。データ型データの処理。
文字列関数
11.2.4. 日付関数
11.2.5. 集計関数
通常、指定されたフィールドに作用します。
集計関数
11.3、カスタム関数
関数内でif文、case文、loop文、repeat文、while文、for文が使えるので、この部分は自分で理解してください。
11.3.1. 関数の作成
文法:
create function func_name(func_parameter)
returns type
body
create function: 関数を作成するためのキーワード
func_name: 関数名
func_parameter: (param_nae タイプ) の形式の関数パラメータ リスト (例: (num1 int, num2 int)
type: 関数の戻り値のタイプ: int、char など) (50) 待ってください。
本体の一般的な形式は次のとおりです。
begin
retrun(select 查询语句);
end
区切り文字 区切り文字: MySQL のデフォルトの区切り文字はセミコロン ';' です。delimiter ステートメントを使用すると、デフォルトの区切り文字を変更できます
例:
読者の年齢をクエリする関数を作成します。
delimiter $
create function func_reader_age2(name char(50))
returns int
begin
return(select year(curdate())-year(reader_birthday) from t_reader where reader_name=name);
end $
delimiter ;
select func_reader_age2("肖华");
11.3.2. 削除機能
drop function function_name;
12. トリガー
トリガーは、特定のイベントに応答して自動的に実行されるストアド プロシージャです。(特定のイベント: データベース テーブルへの追加、削除、および変更)
トリガーは、INSERT、UPDATE、および DELETE ステートメントによるデータ テーブルの変更の前後に自動的に実行されるように定義できます。
12.1、トリガーを作成する
文法:CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body
パラメータの詳細な説明:
trigger_time: トリガーの実行時間: AFTER (後) | BEFORE (前)
trigger_event: トリガーによってトリガーされたイベント: DELETE | UPDATE | INSERT
FOR EACH ROW: トリガー イベントを満たすレコードに対する操作がトリガーされることを示します。トリガー
table_name: テーブル要素の名前 トリガー イベント操作テーブル
trigger_body: トリガーを作成する SQL ステートメント
(1) Insert トリガーを作成し、t_student にレコードを挿入した後、テーブル名 t_student と挿入時刻を t_log テーブルに挿入します。
CREATE TABLE t_log
(logno int AUTO_INCREMENT primary key,
tname varchar(20),
logtime datetime);
SELECT * FROM t_log;
create trigger tr_insert after insert on t_student for each row
insert into t_log (tname,logtime) VALUES('t_student',now());
insert into t_student(stu_id) values("0123456789");
select * from t_student;
select * from t_log;
(2) t_score1 テーブルに挿入トリガーを作成する t_score1 テーブルにデータを挿入すると、t_student1 には stu_id に対応するレコードが、t_course1e には course_id に対応するレコードが自動的に追加されます。
create table t_score1 like t_score;
insert into t_score1 select * from t_score;
//创建触发器
create trigger t_insert3 after insert on t_score1 for each row
begin
insert into t_student1(stu_id) VALUES("1123456789") ;
insert into t_course1(course_id) VALUES("12345678") ;
end
//验证
insert into t_score1(score_id,stu_id,course_id) values(1018,1631607101,16610001);
select * from t_student1 where stu_id = "1123456789";
select * from t_course1 where course_id = "12345678";
12.2、トリガーを表示する
show triggers;
12.3. トリガーの削除
drop trigger trigger_name;
12.4 NEWとOLDの適用
MySQL では 2 つの一時テーブル NEW と OLD が定義されており、簡単に参照できるようにトリガー変更の前後にテーブルを保存します。
12.4.1. フローチャート
12.4.2. ケース
(1) テーブル t_student1 の生徒の誕生日を変更する場合、変更前の誕生日と変更後の誕生日を別のテーブル t_backup (作成が必要)に挿入します。
//创建触发器
create trigger t_updata1 after update on t_student1 for each row
begin
insert into t_backup(old_birthday,new_birthday) values(old.stu_birthday,new.stu_birthday);
end
//测试
update t_student1 set stu_birthday="1999-12-12" where stu_name="王伟";
(2) t_major1テーブルのレコードを削除する場合、削除したレコードを別のテーブルに挿入します(新規テーブルの作成が必要)。
//创建触发器
create trigger t_delete1 after delete on t_major1 for each row
begin
insert into t_major_back values(old.major_id,old.major_name);
end
//测试
delete from t_major1 where major_name="计算机应用技术";
13.事務
文法:
START TRANSACTION | BEGIN
DML语句
COMMIT 或 ROLLBACK
START TRANSACTION、BEGIN: 新しいトランザクションを開始できます
DML ステートメント: 挿入、削除、更新
COMMIT、ROLLBACK: トランザクションのコミット、ロールバックを定義します
13.1. はじめに
トランザクションは完全なビジネス ロジックであり、作業単位です。好き:
送金するとして、アカウントAからアカウントBに10,000を送金します。
- 口座 A のお金から 10000 を減算します (明細を更新)
口座 B のお金に 10000 を加算します (明細を更新)これは完全なビジネス ロジックです。2 つの updata ステートメントの要件は、両方とも成功するか、両方とも失敗する必要があります。
DML ステートメントのみがトランザクションを持ち、他のステートメントはトランザクションとは関係ありません。
挿入、削除、および更新の場合、
トランザクションに関連するのは上記の 3 つのステートメントのみであり、他には何も関連しません。
したがって、トランザクションは、同時に成功または失敗する DML ステートメントのバッチです。
13.2、トランザクションのコミット、ロールバック
トランザクションをコミットする: commit; ステートメント。トランザクションの終了を表します。
ロールバック トランザクション: rollback; ステートメント (ロールバックは最後のコミット ポイントまでのみ永久にロールバックできます!)
13.3、トランザクションには 4 つの特性が含まれます
A (アトミック):
トランザクションが作業の最小単位であることを説明します。分割不可能。
C (一貫性):
すべてのトランザクションでは、データの一貫性を確保するために、同じトランザクション内ですべての操作が同時に成功または失敗する必要があります。
I (隔離) のキーポイント:
A トランザクションと B トランザクションの間には一定の分離があります。
A教室とB教室の間には壁があり、この壁が隔離です。
トランザクション A がテーブルを操作すると、別のトランザクション B もそのテーブルを操作しますか? ? ?
D (持続性):
トランザクションが最終的に完了するという保証。トランザクションの送信は、ハードディスクに保存されていないデータをハードディスクに保存することに相当します。
13.4. 事例
学籍番号「1631607101」の学生のC言語のスコアに10点を加算し、100点を超えた場合はトランザクションのロールバックを実行し、そうでない場合はトランザクションを送信します。
mysql> select * from t_score1;
+----------+------------+-----------+-------+
| score_id | stu_id | course_id | grade |
+----------+------------+-----------+-------+
| 1001 | 1631607101 | 16610001 | 92 |
| 1002 | 1631607101 | 16610002 | 75 |
| 1003 | 1631607101 | 16610003 | 88 |
| 1004 | 1631607102 | 16610004 | 100 |
| 1005 | 1631607102 | 16610005 | 99 |
| 1006 | 1631611104 | 16610003 | 76 |
| 1007 | 1631611104 | 16610004 | 107 |
| 1008 | 1631611104 | 16610005 | 97 |
| 1009 | 1631611104 | 16610006 | 90 |
| 1010 | 1731613106 | 16610009 | 75 |
| 1011 | 1731613107 | 16610009 | 97 |
| 1012 | 1631601101 | 16610002 | 86 |
| 1013 | 1631601102 | 16610003 | 85 |
| 1014 | 1631601103 | 16610004 | 90 |
| 1015 | 1631601104 | 16610005 | 80 |
| 1016 | 1631601105 | 16610006 | 79 |
| 1017 | 1631601105 | 16610007 | 98 |
| 1018 | 1631607101 | 16610001 | NULL |
+----------+------------+-----------+-------+
18 rows in set (0.00 sec)
mysql> begin;
mysql> update t_score1 set grade=grade+10 where stu_id="1631607101";
mysql> select * from t_score1 where stu_id="1631607101" and grade < 100;
+----------+------------+-----------+-------+
| score_id | stu_id | course_id | grade |
+----------+------------+-----------+-------+
| 1002 | 1631607101 | 16610002 | 85 |
| 1003 | 1631607101 | 16610003 | 98 |
+----------+------------+-----------+-------+
--回滚后,数据就没有改变
mysql> rollback; --如果这里换成commit; 代表事务结束。
mysql> select * from t_score1 where stu_id="1631607101" and grade < 100;
+----------+------------+-----------+-------+
| score_id | stu_id | course_id | grade |
+----------+------------+-----------+-------+
| 1001 | 1631607101 | 16610001 | 92 |
| 1002 | 1631607101 | 16610002 | 75 |
| 1003 | 1631607101 | 16610003 | 88 |
+----------+------------+-----------+-------+
3 rows in set (0.00 sec)
--执行commit;后,就无法回到commit之前,代表事务结束。
mysql> commit;
14. ユーザー管理と権利管理
语法:CREATE USER user_name [IDENTIFIED BY [PASSWORD] “user_password”]
user_name: 作成されたアカウント名。完全なアカウントはユーザー名とホストで構成され、形式は です
'user_name'@'localhost'
。
14.1. ユーザー管理
14.1.1. ユーザーの作成
1. すべてのホストをデフォルトに設定する
create user test_1 identified by '123456';
2. ユーザーのホストを localhost として指定します。
create user test1@localhost identified by '123456';
14.1.2. ユーザーパスワードの変更
14.1.3. ユーザーの削除
drop user user_name;
14.2. 権限管理
14.2.1. 付与された認可
GRANT priv_type[(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [,user IDENTIFIED BY [PASSWORD] 'password'] ... [WITH with-option['with-option']...]
priv_type: 認可タイプ (ALL はすべての権限を意味します)。
column_list: 列名を指定します。これは、権限がテーブル全体に作用することを指定するのではなく、それらの列に作用することを示します。
Database.table: データベースとテーブルを指定します。
ユーザー: ユーザー名。完全なアカウントはユーザー名とホストで構成され、 の形式になります'user_name'@'localhost'
。
IDENTIFIED BY: アカウントのパスワードを設定するように指定します。既存のユーザーはパスワードを指定する必要はありません。
パスワード: ユーザーの新しいパスワードを示します。既存のユーザーはパスワードを使用できません。
WITH with-option['with-option']: 認可オプションを指定します。
1. Grant ステートメントを使用してユーザー ソフトを作成し、パスワードは 123456 で、すべてのデータベースのすべてのテーブルに選択、挿入、更新のアクセス許可と委任アクセス許可 (許可オプション) を付与します。
grant select,insert,update on *.* to soft@localhost identified by '123456' with grant option;
2. Grant ステートメントを使用して、すべてのデータベースのすべてのテーブルに選択、挿入、および更新のアクセス許可を付与します。
grant select,insert,update on *.* to soft;
14.2.1.1. 閲覧権限
文法:GRANT priv_type[(column_list)] ON [object_type]{table_name | * | *.* | db_name.*} FROM user [,user]...
select * from user;
一般ユーザーでも実行可能
show grants for ‘user'@'host';
14.2.2. 権限の取り消し
revoke select,insert,update on *.* from soft@localhost;
15. データベースのバックアップと復元
15.1. バックアップ
文法:
E:\db_backup>mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
データベースをバックアップする
MYSQLDUMP -u user_name -p db_name table_name1 table_name2... > backup_name.sql
user_name: ユーザー名
db_name: バックアップ用のデータベースを選択
table_name: バックアップ データベース内のテーブルを選択
back_name: 生成されたバックアップ ファイルの名前
複数のデータベースをバックアップする
MYSQLDUMP -u user_name -p --databases db_name1 db_name2... > backup_name.sql
すべてのデータベースをバックアップする
MYSQLDUMP -u user_name -p --all-databases > backup_name.sql
15.2. 回復
MYSQL -u user_name -p [db_name] < backup_name.sql
db_name: データベースの名前を指定します。データベースを指定する場合は、データベース配下のテーブルを復元します。指定しない場合は、バックアップファイル内のすべてのデータをリストアすることを意味します。
16.ログ
MySQL ログの 4 種類: エラー ログ、クエリ ログ、スロー クエリ ログ、バイナリ ログ
4 種類のログに対応するファイルは、mysql データ ディレクトリのデータ ディレクトリに保存されます。show variables
コマンドを
使用してエラーを表示できます。デフォルトでは有効になっており、他の 3 つのログはデフォルトで Open になっています。
16.1. エラーログ
エラー ログには、実行中の SQL ステートメントの構文エラーなど、MySQL サービスの開始、停止、実行時のエラー情報が記録されます。
エラー ログはデフォルトで有効になっており、無効にすることはできません。
「エラーログ」が有効になっているか確認してください
--使用show variables命令后可以看到日志文件存放位置:D:\APP\Pro_Software\MYSQL\data\
show variables like "%log_erro%";
+----------------------------+----------------------------------------------------+
| Variable_name | Value |
+----------------------------+----------------------------------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | D:\APP\Pro_Software\MYSQL\data\DESKTOP-T92IEER.err |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_suppression_list | |
| log_error_verbosity | 2 |
+----------------------------+----------------------------------------------------+
5 rows in set, 1 warning (0.00 sec)
16.2. クエリログ
クエリ ログには、MySQL サーバーの開始および停止情報、クライアント接続情報、およびデータ レコードの追加、削除、確認、および変更のための SQL ステートメントが記録されます。
クエリ ログはデフォルトでオフになっています。クエリ ログはすべてのユーザー操作を記録するため、クエリ ログを有効にすると、より多くのディスク領域が使用されます。ディスク領域を節約するためにクエリ ログを定義することをお勧めします。
「クエリログ」が有効になっているか確認してください
--使用show variables命令后可以看到日志文件存放位置:D:\APP\Pro_Software\MYSQL\data\
mysql> show variables like "%general%";
+------------------+----------------------------------------------------+
| Variable_name | Value |
+------------------+----------------------------------------------------+
| general_log | OFF |
| general_log_file | D:\APP\Pro_Software\MYSQL\data\DESKTOP-T92IEER.log |
+------------------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
--开启
mysql> set global general_log = ON;
Query OK, 0 rows affected (0.00 sec)
--关闭
mysql> set global general_log = OFF;
Query OK, 0 rows affected (0.00 sec)
16.3. 遅いクエリログ
低速ログでは、実行に指定された時間よりも長い時間がかかるさまざまな操作が記録されます。
スロークエリログを分析することで、各 MySQL コマンド実行のパフォーマンスのボトルネックを効果的に特定できます。
「スロークエリログ」が有効になっているかどうかを確認してください
--使用show variables命令后可以看到日志文件存放位置:D:\APP\Pro_Software\MYSQL\data\
mysql> show variables like "%slow%";
+-----------------------------+---------------------------------------------------------+
| Variable_name | Value |
+-----------------------------+---------------------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_extra | OFF |
| log_slow_replica_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | D:\APP\Pro_Software\MYSQL\data\DESKTOP-T92IEER-slow.log |
+-----------------------------+---------------------------------------------------------+
7 rows in set, 1 warning (0.01 sec)
--开启
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.00 sec)
--关闭
mysql> set global slow_query_log = off;
Query OK, 0 rows affected (0.00 sec)
--测试
mysql> select sleep(10);
+-----------+
| sleep(10) |
+-----------+
| 0 |
+-----------+
1 row in set (10.01 sec)
16.4、バイナリログ
2 レベルのログは、クエリ以外のデータベースのさまざまな操作をバイナリ形式で記録し、変更ログとも呼ばれます。これは主に、データを変更する、またはデータ変更を引き起こす可能性のある MySQL ステートメントを記録し、ステートメントの発生時間、実行時間、および操作データを記録するために使用されます。
「バイナリログ」が有効になっているか確認する
--使用show variables命令后可以看到日志文件存放位置:D:\APP\Pro_Software\MYSQL\data\
mysql> show variables like "%log_bin%";
+---------------------------------+---------------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:\APP\Pro_Software\MYSQL\data\binlog |
| log_bin_index | D:\APP\Pro_Software\MYSQL\data\binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+---------------------------------------------+
6 rows in set, 1 warning (0.00 sec)
--查询binlog文件名
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000119 | 57106 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
要約する
私は Qiuyilin です。ワンクリックと 3 つのリンクでクラウド コミュニティに参加できるよう皆さんを歓迎します。
また次回お会いしましょう(⊙o⊙)!!!