MySQLでよく使われるSQLとコマンドの入力からデータベースの削除、そして終了まで

MySQLでよく使われるSQLとコマンドの入力からデータベースの削除、そして終了まで

開始と停止

MySQLサービスを開始する

sudo /usr/local/mysql/support-files/mysql.server を起動します

mysqlサービスを停止する

sudo /usr/local/mysql/support-files/mysql.server を停止します

MySQLサービスを再起動する

sudo /usr/local/mysql/support-files/mysql.serverを再起動します。

mysqlディレクトリファイルを入力します

/usr/local/mysql/support-files をコピーします

mysqlコマンドラインを入力する

ローカルMySQLサーバにMySQLサーバを登録します。

データベースを終了

出口;

データベース関連の操作

すべてのデータベースをクエリする

データベースを表示します。

データベースを選択(使用)

mybatis を使用します。

現在使用中のデータベースの名前を照会する

データベースを選択します();

データベースを作成する

データベースデータベース名を作成します。

create database if not exists 數據庫名;

データベースの削除

データベースのデータベース名を削除します。

drop database if exists 數據庫名稱;

データベーステーブル関連の操作

データベーステーブルの作成

テーブルテーブル名を作成(
	列名 1 データ型 1、
	列名2 データ型2、
	....
	列名 n データ型 n
	);

テーブルをコピー

コピーするテーブル名と同じテーブル名を作成します。

データベース内のすべてのテーブルを表示する

テーブルを表示します。

データテーブルの構造を表示する

desc pet; または describe pet;

テーブル名を変更する

alter table テーブル名を新しいテーブル名に変更します。

テーブルの文字セットを変更する

テーブル、テーブル名、文字セット、文字セット名を変更します。

列を追加する

テーブル名を変更し、列名とデータ型を追加します。

列の削除

テーブル名を変更し、列名を削除します。

テーブルを削除する

テーブル名を削除します。または、テーブル名が存在する場合はテーブルを削除します。

データを追加

テーブル名(列名1、列名2、...列名n)値(値1、値2、...値n)に挿入します。

列名と値は1対1で対応している必要があります。テーブル名の後に列名が定義されていない場合は、デフォルトですべての列に値が追加されます。例: insert into table name values ​​(value 1, value 2, ... value n); 数値型を除き、他の型は引用符で囲む必要があります (一重引用符または二重引用符)。

データの削除

テーブル名から条件付きで削除

その中で、条件が追加されていない場合は、テーブル内のすべてのレコードが削除されます。すべてのレコードを削除する場合は、delete from table name を使用します。これは通常推奨されません。この操作では、レコードの数だけ削除操作が実行されます。

TRUNCATE TABLE テーブル名。最初にテーブルを削除してから同じテーブルを作成する方が効率的です。推奨。

データを変更する

テーブル名を更新し、列名 1 = 値 1、列名 2 = 値 2、... 条件を設定します。条件が追加されていない場合は、テーブル内のすべてのレコードが変更されます。

insert into user2 values ​​(1,'李四','123'); // add delete from pet where ower = 'disn'; // delete update pet set name = '后裔' where ower = 'dfn'; // modification

クエリデータ

①>、<、<=、>=、=、<>	
②BETWEEN...と	
③ IN(コレクション)	
④LIKEファジークエリ	
⑤_任意の1文字 ⑥%任意の複数の文字 ⑦IS NULL 
⑧そしてまたは&&
⑨またはまたは|| 
⑩そうじゃない!
クエリ条件の例:
SELECT * FROM user WHERE age >= 18;
SELECT * FROM user WHERE age >= 18 AND age <=36;
SELECT * FROM user WHERE age BETWEEN 40 AND 70;
SELECT * FROM user WHERE age IN (6,18,37);
// NULLについて
SELECT * FROM user WHERE height = NULL; NULL 値では = または (!=) を使用できないためエラー 判定 SELECT * FROM user WHERE height IS NULL; (正解)
SELECT * FROM user WHERE height IS NOT NULL; (正解)
// Chen という姓を持つ人は誰ですか? を照会します。 < いいね >
SELECT * FROM user WHERE NAME LIKE '陈%';
// 名前の 2 番目の文字が new である人を照会します。SELECT * FROM user WHERE NAME LIKE "_新%";
// 名前が 3 文字の人を照会します SELECT * FROM user WHERE NAME LIKE '___';
// 名前に dog が含まれる人を照会します SELECT * FROM user WHERE NAME LIKE '%狗%';

制約関連

主キー制約

テーブル内のレコードを一意に識別するには、フィールドが重複せず、空にならないようにフィールドに制約を追加できます。

 テーブルユーザーを作成 (
	id int primary key auto_increment, // テーブルを作成するときに、主キー制約を追加し、主キーの自動増分を完了します	
	名前varchar(20)
 );
-- 複合主キー: 複合主キーの合計が重複しない限り、複数のフィールドで構成される主キー。複合主キーのフィールドは空にできません。
テーブルuser2を作成(
 	id int、
 	名前varchar(20),
 	パスワードvarchar(20)、
 	主キー(ID、名前)
);

テーブルが作成された後:

主キーを追加します。例:

①テーブルuserを変更し、主キー(id)を追加します。

②alter table user modify id int primary key;

alter table user drop primary key;

一意制約: 一意制約によって変更されたフィールドの値は繰り返すことができません。

 テーブルuser1を作成(
 	id int 主キー auto_increment,
 	phone_num varchar(20) ユニーク
 	 );
 テーブルuser2を作成(
 	id int 主キー auto_increment,
 	名前varchar(20),
 	unique(id, name) // 2 つのフィールドが重複していないことを意味します );
 	 

テーブルの作成後に、 alter table user3 add unique(phone_num);またはalter table user3 modify phone_num varchar(20) unique;を使用して一意制約を追加することもできます。
一意制約を削除します: alter table user3 drop index phone_num;

非NULL制約: 非NULLによって変更されたフィールドはNULLにできません

テーブルuser3を作成(
	id int 主キー auto_increment,
	名前varchar(20) nullでない
	);

NOT NULL制約を削除します: alter table user3 modify name varchar(20);

デフォルトの制約

フィールド値を挿入する場合、対応するフィールドに値が挿入されていない場合は、デフォルト値が使用されます。値が渡された場合、デフォルト値は使用されません。

テーブルuser4を作成します(
	id int 主キー auto_increment,
	年齢 int デフォルト 18,
	名前varchar(20) nullではない
	);

外部キー制約: 外部キー

テーブルテーブル名を作成(
....
外部キー列制約 外部キー名 外部キー (外部キー列名) 参照 プライマリテーブル名 (プライマリテーブル列名)
);
//クラステーブルクラスを作成します(
	id int 主キー、
	名前varchar(20)
	);	
// 学生テーブル 学生テーブルを作成 (
		id int 主キー、
		名前varchar(20),
		クラスID int,
		外部キー(class_id)はクラス(id)を参照します
		);
		

高度なデータベースクエリ

すべてのレコードをクエリします。例: 学生テーブル内のすべてのレコードをクエリします。

学生から*を選択します。

指定されたフィールドを照会します。例: 学生の sname、ssex、class を照会します。

学生から名前、性別、クラスを選択します。

教師テーブル内のすべてのユニット、つまり個別の出発列をクエリします。<重複する個別のユニットを除外>

教師から明確に逸脱するものを選択する。

スコアが 60 から 80 の間のスコア テーブル内のすべてのレコードをクエリします <クエリ間隔は... から...>

度数が 60 から 80 の間のスコアから * を選択します。
度数が60以上かつ度数が80未満のスコアから*を選択します。

スコア テーブルでスコアが 85、86、または 88 のレコードを照会します。select * from score where degree in(85, 86, 88);

学生テーブルで、クラス '95031' の学生、または性別が '女性' の学生を検索します。<またははどちらかを意味します>

select *from student where class = '95031' or sex = '女';

学生テーブル内のすべてのレコードをクラスの降順でクエリします <desc、asc、デフォルトは昇順 (省略)>。

クラス降順で学生の順序から*を選択します。

スコア テーブル内のすべてのレコードを、cno の昇順、degree の降順でクエリします。select * from score order by cno asc,degree desc;

クラス「95031」の生徒数を照会します <統計カウント>

クラスが '95031' である学生から count(*) を選択します。
スコアテーブルで最高得点を獲得した学生の学生IDとコースIDを照会する(サブクエリ)

select sno, cno from score where degree = (select max(degree) from score ); where: select max(degree) from score で最初に最高スコアを検索します。

select sno,cno degree from score order by degree desc limit 0,1; ここで、limit の最初の数字は開始点を示し、2 番目の数字はエントリの数を示します。最高スコアが複数同じ場合、バグが発生する可能性が高いため、このクエリ方法は推奨されません。

各コースの平均スコアを照会します。 select cno, avg(degree) from score group by cno;

スコア テーブルで、少なくとも 2 人の学生が受講し、3 から始まるコースの平均スコアを照会します。

count(cno) >= 2 かつ cno が '3%' のような cno で、スコア グループから cno、avg(degree) を選択します。

スコアが 70 より大きく 90 より小さい sno 列をクエリします。

70 から 90 の間の度数で、スコアから sno、度数を選択します。
すべての学生の sname、cno、degree 列を照会します。
student.sno = score.sno の場合、student、score から sname、cno、degree を選択します。
すべての学生の sno、cname、degree 列を照会します。select sno、cname、degree from course、score where course.cno = score.cno;
クラス「95031」の学生の各コースの平均スコアを照会します。
select cno, avg(degree) from score where sno in (select sno from student where class = '95031') group by cno;
選択科目「3-105」を受講し、「3-105」の学生番号「109」の成績よりも高い成績を持つすべての学生の記録を照会します。
cno = '3-105' かつ degree > の場合、スコアから * を選択します (sno = '109' かつ cno = '3-105' の場合、スコアから degree を選択);
学生番号「109」、コース番号「3-105」の学生のスコアよりも高いスコアを持つすべてのレコードを照会します。select * from score where degree > (select degree from score where sno = '109' and cno = '3-105');
学生番号 108,101 と同じ年に生まれた学生の sno、sname、sbirthday をすべて照会します。
*from student where year(sbirthday) in (select year(sbirthday) from student where sno in(108, 101));
教師「Zhang Xu」が指導する生徒の成績を照会します。select * from score where cno = (select cno from course where tno = (select tno from teacher where tname = "Zhang Xu"));
コースを受講する生徒が 5 人以上いる教師の名前を照会します。
tno = (cno = (count(*) > 5であるcnoによってスコアグループからcnoを選択))のt教師からtnameを選択します。
85点以上のスコアを持つコースをCNOに問い合わせる
度数が 85 より大きいスコアから cno、度数を選択します。
「コンピュータサイエンス学科」の教師が教えるコースのスコア表を照会します。select * from score where cno in (select cno from course where tno in (select tno from teacher where department = "コンピュータサイエンス学科"));
選択科目番号「3-105」を履修し、成績が選択科目番号「3-245」の成績以上である学生のCNO、SNO、学位を照会し、学位の降順で並べ替えます。
少なくとも 1 つ。
select * from score where cno = '3-105' and degree > any(select degree from score where cno = '3-245') order by degree desc;

選択科目番号「3-105」を履修し、選択科目番号「3-245」を履修した学生よりも成績が高い学生の CNO、SNO、学位を照会し、学位の高い順に並べ替えます。
すべてはすべてを意味する

select * from score where cno = '3-105' and degree > all(select degree from score where cno = '3-245') order by degree desc;

すべての教師とクラスメートの名前、性別、誕生日を照会する

教師組合から名前として tname、性別として tsex、誕生日として tbirthday を選択します。生徒から sname、ssex、sbirthday を選択します。

すべての女性教師と女性クラスメートの名前、性別、誕生日を照会する

select tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女' union select sname, ssex, sbirthday from student where ssex = '女';

コーススコアよりも低いスコアを持つ学生のスコアテーブルを照会するアイデアは、テーブル a から対応するスコアを見つけて、それをテーブル b から選択した平均スコアと比較することです。

スコア a から * を選択し、度合い < (スコア b から avg(degree) を選択し、a.cno = b.cno);
表a
+-----+-------+--------+
| sno | cno | 学位 |
+-----+-------+--------+
| 101 | 3-105 | 91 |
| 102 | 3-105 | 92 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 104 | 3-105 | 81 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-----+-------+--------+
セット内の行数は 12 です (0.00 秒) 

表b
| sno | cno | 学位 |
+-----+-------+--------+
| 101 | 3-105 | 91 |
| 102 | 3-105 | 92 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 104 | 3-105 | 81 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-----+-------+--------+
セット内の行数は 12 です (0.00 秒) 

すべての教師の名前と退職日を問い合わせる

tname を選択し、tno が含まれる教師から出発します (コースから tno を選択します)。

少なくとも2人の男子がいるクラスの番号を問い合わせる

ssex= '男' の学生からクラスを選択し、count(*) > 1 のクラスでグループ化します。

学生テーブルで姓が「Wang」ではない学生を検索します。

select * from student where sname not like '王%';

学生テーブル内の各学生の名前と年齢を照会する

学生から sname、year(now()) - year(sbirthday) を 'age' として選択します。

学生テーブル内の誕生日の最大値と最小値を照会する

学生から、max(sbirthday) を 'maximum' として、min(sbirthday) を 'minimum' として選択します。

学生テーブルのすべてのレコードをクラス番号と年齢の降順でクエリします。

クラス降順、誕生日順に学生から*を選択します。

「男性」教師と彼らが教えるコースを検索する

select * from course where tno in (select tno from teacher where tsex = '男');

最高得点を獲得した学生のsno、cno、degree列を照会する

度数が (スコアから max(度数) を選択) であるスコアから * を選択。

Li Junと同じ性別のクラスメイト全員の名前を問い合わせる

select sname from student where ssex = (select ssex from student where sname = '李军');

李俊と同じ性別とクラスの学生の名前を問い合わせる

select sname from student where ssex = (select ssex from student where sname = "李军") and class = (select class from student where sname = '李军');

「コンピュータサイエンス入門」コースを受講したすべての男子学生のスコア表を照会します

select * from score where cno = (select cno from course where cname = 'Introduction to Computer Science') and sno in(select sno from student where ssex = '男');

4種類のSQL結合クエリ

分析ユースケースのためのデータ準備:
mysql> person から * を選択します。
+----+--------+--------+
| ID | 名前 | カード ID |
+----+--------+--------+
| 1 | 張三 | 1 |
| 2 | 李思 | 3 |
| 3 | 王武 | 6 |
+----+--------+--------+
セット内の 3 行 (0.00 秒)
mysql> カードから * を選択します。
+------+------------+
| ID | 名前 |
+------+------------+
| 1 | ミールカード|
| 2 | CCB カード|
| 3 | 農業銀行カード|
| 4 | 名刺|
| 5 | 郵便カード |
+------+------------+
セット内の行数は 5 です (0.00 秒)

内部結合

inner joinまたはjoin 。通常はon条件が続きます。
---- インライン クエリ: 2 つのテーブル内のデータであり、特定のフィールドが等しい場合、関連するレコード データをクエリします。
<現在のテーブル内の cardid は id と同じです。>

person から * を選択し、 person.cardId = card.id でカードを内部結合します。
+----+--------+--------+-------+-----------+
| ID | 名前 | カード ID | ID | 名前 |
+----+--------+--------+-------+-----------+
| 1 | 張三| 1 | 1 | 食事カード|
| 2 | 李思 | 3 | 3 | 農業銀行カード |
+----+--------+--------+-------+-----------+
セット内の 2 行 (0.00 秒)

外部結合

左外部結合: 左left joinまたはleft outer join
---- 左外部結合は、左側のテーブルのすべてのデータを取得し、右側のテーブルのデータが等しい場合はそれが表示され、等しくない場合は NULL が入力されます。

person.cardId = card.id の person left join カードから * を選択します。

+----+--------+--------+-------+-----------+
| ID | 名前 | カード ID | ID | 名前 |
+----+--------+--------+-------+-----------+
| 1 | 張三| 1 | 1 | 食事カード|
| 2 | 李思 | 3 | 3 | 農業銀行カード |
| 3 | 王武 | 6 | NULL | NULL |
+----+--------+--------+-------+-----------+
セット内の 3 行 (0.00 秒)

右外部結合: right join結合またはright outer join

----右外部結合は、右側のテーブルのすべてのデータを取得し、左側のテーブルのデータが等しい場合はそれが表示され、等しくない場合は NULL が入力されます。

person.cardId = card.id の person right join card から * を選択します。

+------+--------+--------+-------+----------+
| ID | 名前 | カード ID | ID | 名前 |
+------+--------+--------+-------+----------+
| 1 | 張三| 1 | 1 | 食事カード|
| 2 | 李思 | 3 | 3 | 農業銀行カード |
| NULL | NULL | NULL | 2 | CCB カード |
| NULL | NULL | NULL | 4 | 名刺 |
| NULL | NULL | NULL | 5 | 郵便カード |
+------+--------+--------+-------+----------+
セット内の 5 行 (0.01 秒)

完全外部結合: full join外部結合またはfull outer join <mysql は完全結合をサポートしていません>

mysql> person から * を選択し、 person.cardId= card.id でカードを結合します。
エラー 1054 (42S22): 'on 句' に不明な列 'person.cardId' があります
**** MySQL が完全結合をサポートしていない問題を解決する方法 ****
 <左接続 + 右接続>、つまり、左接続と右接続を結合して接続します。<左接続結合右接続>。
例えば:

person の左から * を選択して、 person.cardId = card.id でカードを結合します。union person の右から * を選択して、 person.cardId = card.id でカードを結合します。

+------+--------+--------+-------+----------+
| ID | 名前 | カード ID | ID | 名前 |
+------+--------+--------+-------+----------+
| 1 | 張三| 1 | 1 | 食事カード|
| 2 | 李思 | 3 | 3 | 農業銀行カード |
| 3 | 王武 | 6 | NULL | NULL |
| NULL | NULL | NULL | 2 | CCB カード |
| NULL | NULL | NULL | 4 | 名刺 |
| NULL | NULL | NULL | 5 | 郵便カード |
+------+--------+--------+-------+----------+
セット内の6行(0.01秒)

要点

where と having の違いは何ですか?

(1) Having は通常、集計関数 (MAX、MIN、COUNT、SUM) をフィルター処理するために集計関数の前に使用されます。group by の後には where を追加できないため、Having は通常 group by と一緒に使用されます。
(2)はグループ化を制限するために使用されます。条件が満たされない場合、グループ化は実行されません。グループ化後に制限するために、having を使用します。結果が満たされない場合は、クエリは実行されません。Where の後に集計関数を続けることはできませんが、having を使用すると集計関数を判断できます。

MYSQL は厳密な順序でステートメントを実行し、選択ステートメントを変更することはできません。
から
どこ
グループ化
持つ
並び替え

MySQL トランザクション

業務について

MySQL では、トランザクションは実際には最小の分割不可能な作業単位です。トランザクションにより、ビジネスの整合性を確保できます。

分析:

例えば:
--> -100 です
ユーザーを更新し、money = money - 100 を設定します。name = 'a';
b --> +100
ユーザーを更新し、money = money + 100 を設定します。name = 'b';
-- 実際のプログラムでは、1 つの SQL 文のみが正常に実行され、もう 1 つの SQL 文が正常に実行されない場合は、前後のデータが不整合になります。
ユーザーを更新し、money = money - 100 を設定します。name = 'a';
ユーザーを更新し、money = money + 100 を設定します。name = 'b';
複数の SQL ステートメントでは、同時成功または同時失敗が要求される場合があります。

トランザクション制御

(1)トランザクションには主に自動コミット@@autocommit=1;、手動コミット;、トランザクションロールバック;が含まれます。
(2)MySQLはデフォルトでトランザクションを有効にします(自動コミット)。
----SQL 文を実行すると、その効果は即時に表示され、ロールバックすることはできません。
set autocommit = 0; MySQL が自動的にコミットするかどうかを設定します。<0 はいいえ、1 ははい。>
MySQL の自動送信モードを表示するには、@@autocommit; を選択します。
commit; 手動でコミットします。
具体的なトランザクション制御については、次のコード分析を参照してください。

mysql> @@autocommit を選択します。
+--------------+
| @@自動コミット |
+--------------+
| 1 |
+--------------+
セット内の 1 行 (0.00 秒)
//テーブルを作成 create database bank;
テーブルユーザーを作成 (
	id int 主キー、
 名前varchar(20),
 お金 int
 );
// まず、ユーザー データ a をテーブルに挿入します。
ユーザー値に挿入(1、'a'、1000);
クエリは正常、1 行が影響を受けました (0.00 秒)
// ロールバック操作を実行します。
mysql> ロールバック;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
// ロールバックを実行した後、データ テーブル情報を確認すると、ロールバックが呼び出されても挿入されたデータがまだ存在していることがわかります。これは、現時点ではロールバックが不可能であることを意味します。
mysql> ユーザーから * を選択します。
+----+------+-------+
| ID | 名前 | お金 |
+----+------+-------+
| 1 | 1000 |
+----+------+-------+
セット内の 1 行 (0.00 秒)
// msql のロールバック自動コミットを false に設定できます。
自動コミットを 0 に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> @@autocommit を選択します。
+--------------+
| @@自動コミット |
+--------------+
| 0 |
+--------------+
セット内の 1 行 (0.00 秒)
// つまり、上記の set autocommit = 0; 操作は、MySQL の自動コミットをオフにします。
*******データを再度挿入:*******
ユーザー値に挿入(2、'b'、1000);
クエリは正常、1 行が影響を受けました (0.00 秒)
// データを挿入した後にテーブルを確認すると、ユーザー 2 のデータが正常に追加されています。
mysql> ユーザーから * を選択します。
+----+------+-------+
| ID | 名前 | お金 |
+----+------+-------+
| 1 | 1000 |
| 2 | b | 1000 |
+----+------+-------+
セット内の 2 行 (0.00 秒)
// ロールバック操作を実行します。
mysql> ロールバック;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
// ロールバック後、テーブルを再度確認し、挿入したデータが削除されていることを確認します。
mysql> ユーザーから * を選択します。
+----+------+-------+
| ID | 名前 | お金 |
+----+------+-------+
| 1 | 1000 |
+----+------+-------+
セット内の1行(0.01秒)
**** このシナリオでは、ユーザー b がデータを正常に送信するようにするには、commit; コマンドを使用して手動で送信操作を実行できます。手動で送信した後、ロールバックによって再度元に戻すことはできません。つまり、トランザクションが送信されると、実行された SQL ステートメントを元に戻すことはできません。つまり、トランザクションが送信されると、データは永続的な効果を持つことになります。



(3)手動で取引を開始する
begin と start transaction はどちらも手動でトランザクションを開始できます。つまり、現在の MySQL がデフォルトで自動コミット モードになっている場合、rollback を実行してトランザクションをロールバックすることは無効です。ただし、begin と start transaction を通じてトランザクションを手動で開始することはできます。

今すぐ:
 現在のデフォルト モードは自動コミット モードであり、現時点ではロールバックの実行は無効です。次の SQL ステートメントを実行します。
 トランザクションを開始する(または開始する)
 ユーザーを更新し、money = money - 100 を設定します。name = 'a';
 ユーザーを更新し、money = money + 100 を設定します。name = 'b';
 ユーザーデータ a と b を挿入した後、再度ロールバックを実行し、トランザクションを正常にロールバックできることを確認します。トランザクションを手動で開くモードに正常に切り替えることができます。挿入したデータを有効にするには、操作をコミットするためにコミットも手動で実行する必要があります。
 トランザクションが開始されると、コミットされるとロールバックすることはできません。つまり、コミットされると現在のトランザクションは終了します。
 

不倫の4つの特徴

A 原子性: トランザクションは最小単位であり、分割できません。
C 一貫性: トランザクションの要件。同じトランザクション内の SQL ステートメントは、同時に成功および失敗することが保証される必要があります。
I 分離: トランザクション 1 とトランザクション 2 は互いに分離されています。
D 永続性: トランザクションが終了 (コミット、ロールバック) すると、元に戻すことはできません。
トランザクションの分離: 複数のトランザクションは分離され、互いに独立しています。ただし、複数のトランザクションが同じデータ バッチに対して操作を行う場合、いくつかの問題が発生する可能性がありますが、異なる分離レベルを設定することでこれらの問題を解決できます。

問題点:

(1)ダーティリード:トランザクションが別のトランザクションによってコミットされていないデータを読み取る。
(2)非反復読み取り(仮想読み取り):同じトランザクションで2度読み取られたデータは異なります。
(3)ファントムリード:あるトランザクションがデータテーブル内のすべてのレコードを操作(DML)し、別のトランザクションがデータの一部を追加すると、最初のトランザクションは自身の変更を照会できません。
コミットされていない読み取り; コミットされていない読み取り –> 発生する問題: ダーティ リード、繰り返し不可能な読み取り、ファントム リード。
コミットされた読み取り、コミットされた読み取り –>問題: 繰り返し不可能な読み取り、ファントム読み取り 繰り返し可能な読み取り、繰り返し可能な読み取り –>問題: ファントム読み取り
シリアル化可能; シリアル化 <パフォーマンスが非常に低い>

一般的に、分離レベルが高くなるほど、パフォーマンスは低下します。

(1)データベースの分離レベルを確認する
MySQL のデフォルトの分離レベル: REPEATABLE-READ
mysql8.0:
システムレベル: select @@global.transaction_isolation;
セッション レベル: select @@transaction_isolation;
mysql5.x:
システムレベル: @@global.tx_isolation を選択します。
セッション レベル: select @@tx_isolation;

mysql> @@global.transaction_isolation を選択します。
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| 繰り返し読み取り |
+--------------------------------+
セット内の 1 行 (0.00 秒)

(2)分離レベルを変更する
グローバルトランザクション分離レベルをコミットされていない読み取りに設定します。

3つの主要なデータベースパラダイム

最初のパラダイム

データ テーブル内のすべてのフィールドは分割できないアトミック項目です。フィールド値をさらに分割できる場合、最初の正規形を満たさないことが事前にわかります。
たとえば、テーブルに住所フィールドがあり、挿入された値は「中国陝西省西安市北林区白樹林11号」です。このフィールドの値はさらに分割することができ、原則として第1正規形を満たしていません。国/省/市/地区/通りなどに分割できます。
もちろん、パラダイム設計が詳細であればあるほど、実際の操作には適しているかもしれません。しかし、必ずしもそれがメリットになるわけではありません。<たとえば、住所フィールドの場合、そのような詳細な情報は分割後には使用されなくなる可能性があるため、分割する必要がない場合があります。>

第二のパラダイム

第 2 正規形では、第 1 正規形が満たされている場合、主キー以外のすべての列が主キーに完全に依存する必要があります。不完全な依存関係が発生するのは、結合主キーの場合にのみ発生します。

例えば:
テーブルmyorderを作成(
		製品ID int,
		顧客ID int,
		製品名 varchar(20)、
		顧客名varchar(20)、
		主キー(product_id, customer_id
	);
	現在のテーブルでは、主キー以外の列は主キーの一部のフィールドにのみ依存しています。これは第 2 正規形を満たしていないため、通常はテーブルを分割する必要があります。
テーブルmyorderを作成(
		order_id int 主キー、
		製品ID int,
		顧客ID int
	);
テーブル製品を作成 (
		id int 主キー、
		名前varchar(20)
	);
顧客テーブルを作成(
		id int 主キー、
		名前varchar(20)
		);
3 つのテーブルに分割された後、第 2 正規形が満たされます。

第三のパラダイム

まず、2 番目のパラダイムを満たす必要があります。主キー列以外の列間には推移的な依存関係があってはなりません。

付録

クエリに含まれるSQL文

テーブル学生を作成(
	sno varchar(20) 主キー、
	sname varchar(20) が null ではない、
	ssex varchar(20) NULLではない、
	誕生日の日時、
	クラスvarchar(20)
	);

テーブル学生を作成(
	sno varchar(20) 主キー、
	sname varchar(20) が null ではない、
	ssex varchar(10) NULLではない、
	誕生日日時、
	クラスvarchar(20)
)

テーブル教師を作成(
	tno varchar(20) 主キー、
	tname varchar(20) が null ではない、
	tsex varchar(20) NULLではない、
	誕生日日時、
	prof varchar(20) が null ではない、
	出発varchar(20) nullでない
	);

テーブルコースを作成(
	cno varchar(20) 主キー、
	cname varchar(20) が null ではありません。
	tno varchar(20) NULLではない、
	外部キー(tno)は教師(tno)を参照します
	);

テーブルスコアを作成(
	sno varchar(20) NULLではない、
	度小数、
	主キー(sno、cno)、
	外部キー(sno)は学生(sno)を参照します。
	外部キー (cno) 参照コース (cno)
	);

学生の値に挿入します('101'、'Zeng Hua'、'男性'、'1977-09-01'、'95033')。
学生の値に挿入します('102'、'匡明'、'男'、'1975-10-02'、'95031')。
学生の値に挿入します('103'、'王丽'、'女'、'1976-01-23'、'95033')。
学生の値に挿入します('104'、'李军'、'男'、'1976-02-20'、'95033')。
学生の値に挿入します('105'、'王芳'、'女'、'1975-02-10'、'95031')。
学生の値に挿入します('106'、'陆君'、'男'、'1974-06-03'、'95031')。
学生の値に挿入します('107'、'王尼马'、'男'、'1976-02-20'、'95033')。
学生の値に挿入します('108'、'張全蛋'、'男'、'1975-02-10'、'95031')。
学生の値に挿入します('109'、'赵铁柱'、'男'、'1974-06-03'、'95031')。

教師の値に挿入します('804'、'李成'、'男'、'1958-12-02'、'副教授'、'コンピュータ系');
教師の値に挿入します('856'、'張旭'、'男'、'1969-03-12'、'讲座师'、'電子工程部');
教師の値に挿入します('825'、'王萍'、'女'、'1972-05-05'、'教助手'、'コンピュータ系');
教師の値に挿入('831'、'Liu Bing'、'女性'、'1977-08-14'、'ティーチングアシスタント'、'電子工学科');

コースの値に挿入します('3-105'、'コンピュータ入門'、'825')。
コースの値に挿入します( '3-245'、 'オペレーティングシステム'、 '804')。
コースの値に挿入します('6-166'、'デジタル回路'、'856')。
コースの値に挿入します('9-888'、'上級数学'、'831')。
 
スコア値に挿入('103','3-245','86');
スコア値に挿入('105','3-245','75');
スコア値に挿入('109','3-245','68');
スコア値に挿入('103','3-105','92');
スコア値に挿入('105','3-105','88');
スコア値に挿入('109','3-105','76');
スコア値に挿入('103','3-105','64');
スコア値に挿入('105','6-166','79');
スコア値に挿入('109','6-166','81');


テーブル person を作成(
	id int 主キー auto_increment,
	名前varchar(20),
	カードID int
);

テーブルカードを作成 (
	id int、
	名前varchar(20)
);

カードの値に挿入します(1、「ライスカード」)。
カードの値に挿入します(2、「CC金行カード」)。
カードの値に挿入します(3、「農業銀行カード」)。
カードの値に挿入します(4、「名刺」)。
カードの値に挿入します(5、「郵便カード」)。

人の値に(1、'张三'、1)を挿入します。
人値に(2,'李四',3)を挿入します。
人値に(3,'王五',6)を挿入します。



MySQLの入門からデータベースの削除、逃げ方まで、よく使うSQLとコマンドについての記事はこれで終わりです。より関連性の高いMySQL入門コンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLコマンドが中国語で入力できない問題の解決方法
  • MySQL コマンドライン操作中のエンコードの問題の詳細な説明
  • MySQLソースコマンドの使い方の紹介
  • 誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装
  • MySQL ストアド プロシージャのクエリ コマンドの概要
  • MySQLデータベースでコマンドを自動補完する3つの方法
  • MySQL パスワードに特殊文字が含まれている場合とコマンドラインからログインする場合
  • MySQLデスクトップツールSQLyogのリソースとアクティベーション方法は、白黒のコマンドラインに別れを告げます
  • MySQL ログインおよび終了コマンドの形式
  • MySQLの認証コマンドgrantの使い方
  • MySQLの基本的な共通コマンドの概要

<<:  jsフェッチ非同期リクエストの使用の詳細な例

>>:  フローティングをクリアするいくつかの方法(推奨)

推薦する

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

Linux 占有ポートの強制解放と Linux ファイアウォールのポート開放方法の詳しい説明

nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...

TLS暗号化通信を使用してDockerにリモート接続する詳細な例

デフォルトでは、Docker はネットワーク化されていない UNIX ソケット上で実行されます。オプ...

ウェブページを作成するために最もよく使用されるHTMLタグ

1. よく使われるHTMLタグの最適化HTML は Web 編集者にとって基本的なスキルであるべきで...

MySQL 起動エラー 1067 および文字セットを変更して再起動した後の無効な回復

公式サイトからmysql-5.6.37-winx64.zipの解凍バージョンをダウンロードし、構成フ...

CSS3のボックスサイズプロパティの興味深いボックスモデルについての簡単な説明

誰もがボックス モデルの構成を、内側から外側まで、コンテンツ、パディング、境界線、マージンについて知...

mysql コマンドライン スクリプトの実行例

この記事では、例を使用して MySQL コマンドライン スクリプトの実行について説明します。ご参考ま...

VSCode の JS フォーマットでセミコロンを自動的に追加または削除する方法について

導入js コード文の末尾にセミコロンを追加しても追加しなくても問題ありません。一般的に、チームで開発...

Linux で特定のユーザーまたはユーザー グループに対して SSH を有効または無効にする方法

会社の基準により、特定のユーザーだけに Linux システムへのアクセスを許可することができます。あ...

Dockerコンテナとローカルマシン間でファイルを転送する方法

ホストとコンテナ間でファイルを転送するには、コンテナの完全な ID が必要です。取得方法は以下の通り...

Linux/Mac に MySQL をインストールするときにパスワードを忘れた場合の解決策

序文この記事では主に、Linux/Mac に MySQL をインストールするときにパスワードを忘れた...

JS ループで async と await を正しく使用する方法

目次概要(ループモード - 共通)配列と非同期メソッドを宣言して反復するforループで使用するマップ...

Linux の grep コマンドと egrep コマンドの詳細な説明

反復/egrep構文: grep [-cinvABC] 'word' ファイル名-c...

CSS 命名: BEM、スコープ付き CSS、CSS モジュール、CSS-in-JS の説明

CSS の適用範囲はグローバルです。プロジェクトがどんどん大きくなり、参加する人が増えるにつれて、命...

Linux システムで TCP 接続を作成するプロセスの紹介

目次LinuxでTCPを作成する手順サーバクライアントTCP確立プロセスサンプルコードLinuxでT...