MySQL03 多表 事務

2022-07-10 23:33:11 字數 3590 閱讀 1248

有兩個集合a,b .取這兩個集合的所有組成情況。

要完成多表查詢,需要消除無用的資料

1.2.1 內連線查詢:

1.隱式內連線:使用where條件消除無用資料

2.顯式內連線:

1

select 字段列表 from 表名1 [

inner

]join 表名2 on 條件

3.內連線查詢總結:

1. 從哪些表中查詢資料

2. 條件是什麼

3. 查詢哪些字段

1.2.2 外連線查詢:

1. 左外連線:

1

select 字段列表 from 表1 left

[outer

]join 表2 on 條件;

查詢的是左表所有資料以及其交集部分。

2.右外連線:

1

select 字段列表 from 表1 right

[outer

]join 表2 on 條件;

查詢的是右表所有資料以及其交集部分。

3.子查詢

概念:查詢中巢狀查詢,稱巢狀查詢為子查詢。

假設有表1中員工最高工資是12000,想要查詢他的所有資訊。

以前的寫法是:

1.查詢最高工資

1

select

max(salary) from emp;

2.查詢工資為12000的員工資訊

1

select

*from emp where emp.`salary` =

9000;

現在一條語句就可以:

1

select

*from emp where emp.`salary` = (select

max(salary) from emp);

這就是子查詢。

子查詢不同情況:

1. 子查詢的結果是單行單列的:

子查詢可以作為條件,使用運算子去判斷。 運算子: > >= < <= =

2. 子查詢的結果是多行單列的:

子查詢可以作為條件,使用運算子in來判斷

3. 子查詢的結果是多行多列的:

子查詢可以作為一張虛擬表參與查詢

概念:如果乙個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。

操作:1. 開啟事務: start transaction;

2. 回滾:rollback;

3. 提交:commit;

事務提交的兩種方式:

自動提交:

mysql就是自動提交的

一條dml(增刪改)語句會自動提交一次事務。

手動提交:

oracle 資料庫預設是手動提交事務

需要先開啟事務,再提交

修改事務的預設提交方式:

檢視事務的預設提交方式:select @@autocommit; -- 1 代表自動提交 0 代表手動提交

修改預設提交方式: set @@autocommit = 0;

1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。

2. 永續性:當事務提交或回滾後,資料庫會持久化的儲存資料。

3. 隔離性:多個事務之間。相互獨立。

4. 一致性:事務操作前後,資料總量不變。

概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級別就可以解決這些問題。

存在問題:

1. 髒讀:乙個事務,讀取到另乙個事務中沒有提交的資料

2. 不可重複讀(虛讀):在同乙個事務中,兩次讀取到的資料不一樣。

3. 幻讀:乙個事務操作(dml)資料表中所有記錄,另乙個事務新增了一條資料,則第乙個事務查詢不到自己的修改。

隔離級別:

1. read uncommitted:讀未提交

產生的問題:髒讀、不可重複讀、幻讀

2. read committed:讀已提交 (oracle)

產生的問題:不可重複讀、幻讀

3. repeatable read:可重複讀 (mysql預設)

產生的問題:幻讀

4. serializable:序列化

可以解決所有的問題

注意:隔離級別從小到大安全性越來越高,但是效率越來越低

資料庫查詢隔離級別:

select @@tx_isolation;

資料庫設定隔離級別:

set global transaction isolation level 級別字串;

sql分類:

1. ddl:運算元據庫和表

2. dml:增刪改表中資料

3. dql:查詢表中資料

4. dcl:管理使用者,授權

dba:

資料庫管理員

dcl:

管理使用者,授權

1. 新增使用者:

語法:create user '使用者名稱'@'主機名' identified by '密碼';

2. 刪除使用者:

語法:drop user '使用者名稱'@'主機名';

3. 修改使用者密碼:

update user set password = password('新密碼') where user = '使用者名稱';

update user set password = password('abc') where user = 'lisi';

set password for '使用者名稱'@'主機名' = password('新密碼');

set password for 'root'@'localhost' = password('123');

mysql中忘記了root使用者的密碼?

1. cmd -- > net stop mysql 停止mysql服務

需要管理員執行該cmd

2. 使用無驗證方式啟動mysql服務: mysqld --skip-grant-tables

3. 開啟新的cmd視窗,直接輸入mysql命令,敲回車。就可以登入成功

4. use mysql;

5. update user set password = password('你的新密碼') where user = 'root';

6. 關閉兩個視窗

7. 開啟任務管理器,手動結束mysqld.exe 的程序

8. 啟動mysql服務

9. 使用新密碼登入。

4. 查詢使用者:

1. 切換到mysql資料庫

use myql;

2. 查詢user表

select * from user;

萬用字元: % 表示可以在任意主機使用使用者登入資料庫

1. 查詢許可權:

查詢許可權

show grants for '使用者名稱'@'主機名';

2. 授予許可權:

授予許可權

grant 許可權列表 on 資料庫名.表名 to '使用者名稱'@'主機名';

3. 撤銷許可權:

撤銷許可權:

revoke 許可權列表 on 資料庫名.表名 from '使用者名稱'@'主機名';

MySQL 03 建立和管理表

use 資料庫名 shwo databases create database 資料庫名 drop database 資料庫名 int 整數。使用4個位元組儲存 char size 定長字元。若未指定,預設長度1個字元 varchar size 可變長字元。根據字串的實際長度儲存,最長為指定長度。注...

MySQL 03(建立資料庫)

我們可以在登陸 mysql 服務後,使用 create 命令建立資料庫,語法如下 create database 資料庫名 以下命令簡單的演示了建立資料庫的過程,資料名為 runoob root host mysql u root p enter password 登入後進入終端 mysql cre...

mysql 03 資料表的設計

資料庫三大正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 第一正規化1nf 資料表中的所有欄位都是不可分割的原子值 資料表 1 create table student2 id int primary key,name varchar 20 address 30 向資料表中插入資...