多表很難水很深弄懂要慢慢理解

2021-08-27 04:02:14 字數 3683 閱讀 6681

1.笛卡爾積

select*from 表1,表2; -- 計算公式 表1*表2
2.內連線查詢:
a.隱式:select*from 表1,表2 where 表1.列1=表2.列2;-- 其中的表可以取別名(常用)

b.顯式:select*from 表1 inner join 表2 on 表1.列1=表2.列2;-- inenr可以省略

①.特點 兩表交集部分取資料多的

②.兩表內連線查詢的時候 最多的結果數是交集多的 最少0條(完全不相交)

3.外連線查詢
a.左外連線:select*from 表1 left outer join 表2 on 表1.列1=表2.列2;-- outer可以省略 特點:左表的全部內容+左右表的交集 

b.右外連線:select*from 表1 right outer join 表2 on 表1.列1=表2.列2;-- outer可以省略 特點:右表的全部加上左右表的交集

c.例如:兩個表左外連線查詢的時候,

表1有5條資料,表2有10條資料

左表是 表1,右表是 表2

最多14條,最少5條

4.子查詢:乙個查詢語句的結果是下乙個查詢語句的條件.
a.乙個查詢語句的結果是下乙個查詢語句的條件.

查到的最高工資的員工作為條件

select * from yuangong where gongzi = (select max(gongzi) from yuangong);

b.多行單列,主要採用的 in(選項1,選項2,選項3)

查詢到的市場部和財務部的id作為條件

select * from yuangong where id in (select id from yuangong where name in ('財務部','市場部'));

c.多行多列,作為虛擬表,進行的連線查詢.

(**都是舉例的相應替換就好) 查詢入職日期是2011-11-11日之後的員工資訊和部門資訊

①:子查詢結果

select * from bumen t1 ,(select * from yuangong where yuangong.join_date > '2011-11-11') t2 where t1.id = t2.bumen_id;

②:普通內連線

select * from bumen t1 , yuangong t2 where t1.id = t2.bumen_id and t2.join_date > '2011-11-11';

5、多表查詢的分析思路:
a.確定查詢的表         from 表名稱...

b.查詢的條件 where 條件... ---> 需要檢視表結構(主外來鍵) 大小...

c.查詢的結果 select 結果...

1、事務的概念
在多個操作的sql語句當中,要麼同時成功執行,要麼同時失敗執行。
2、操作步驟:
a.開啟事務                              start transaction

b.回滾(出問題了,需要回到開啟事務之前) rollback

c.提交(正常執行,將改變的資料提交結束事務) commit

3、檢視和修改事務的提交方式
a.檢視事務的提交方式 select @@autocommit;

b.修改事務的提交方式 set @@autocommit = 0; -- 0表示手動提交,1表示自動提交

4、事務的四大特徵
a.原子性: 在事務的多個sql語句當中,不可以分割開來

b.永續性: 發生回滾和提交的時候,資料持久的儲存在硬碟上面

c.隔離性: 盡可能的多個事務之間沒有影響

d.一致性: 事務前後的總量不能改變

5、隔離級別
a.存在問題

a.髒讀:事務x讀取到事務y,未提交的資料.

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

c.幻讀:事務x在運算元據庫當中所有的記錄,事務y在新增一條新的記錄。事務x讀取不到自己的修改

b.對應的級別

a. read uncommited 讀未提交 (出現"髒讀","虛讀","幻讀")

b. read commited 讀提交 (出現"虛讀","幻讀") ---> oracle 預設採用

c. repeatable read 可重複讀 (出現"幻讀") ---> mysql 預設採用

d. serializable 序列化 (可以解決所有問題,效率低)

c.設定和檢視隔離級別

a.檢視隔離級別

select @@tx_isolation;

b.設定隔離級別

set global transaction isolation level 級別字串;

1、建立使用者(賬號密碼)
語法: create user '使用者名稱'@'主機名' identified by '密碼';  -- 主機名 本機 localhost 任意主機 %
2、刪除使用者(賬號)
語法: drop user '使用者名稱'@'主機名';
3、修改使用者密碼
語法1: update user set password = password('新密碼') where user = '使用者名稱';

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

4、查詢使用者(賬號密碼)
語法: use mysql;  select * from user;  -- 先要使用mysql自己的資料庫,然後查詢user表
5、忘記了超級管理員使用者密碼之後的解決方案:
a. cmd 輸入 net stop mysql  -- 停止mysql服務 需要管理員執行該cmd

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

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

d. use mysql;

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

f. 關閉兩個視窗

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

h. 啟動mysql服務

i. 使用新密碼登入。

6、資料庫許可權
a.查詢許可權

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

b.授予許可權

語法: grant 許可權列表 on 資料庫名.表名 to '使用者名稱'@'主機名'; -- 標準格式

語法: grant all on *.* to 'zhangsan'@'localhost'; -- 給張三本機使用者授予所有的許可權

c.撤銷許可權

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

案例: revoke update on db3.`account` from 'lisi'@'%'; -- 撤銷李四在所有機器上面的 update 許可權