1、多表查詢
2译红、事務(wù)
3、DCL
多表查詢:
*查詢語法
select
列名列表
from
表名列表
where
....
select * from emp,dept
---笛卡爾積 A , B
笛卡爾積:
有兩個集合A,B 兴溜,取這兩個集合的所有組成情況侦厚。
要完成多表查詢,需要消除無用的數(shù)據(jù)
多表查詢的分類:
1拙徽、內(nèi)鏈接查詢
*1.隱式內(nèi)連接:使用where條件消除無用的數(shù)據(jù)
image.png
在以后寫sql中一行寫一個方便注釋
image.png
* 2.顯式內(nèi)連接:
image.png
語法:select 字段列表 from 表名1 inner join 表名2 on 條件
inner可以省略
3.內(nèi)鏈接查詢
-1刨沦、從那些表中查詢數(shù)據(jù)
-2.條件是什么
-3.查詢哪些字段
2、外鏈接查詢
1.左外連接
* select 字段列表 from 表1 left outer join 表2 on 條件
* 查詢的是左表所有數(shù)據(jù)以及其交集部分
2.右外連接
* select 字段列表 from 表1 right outer join 表2 on 條件
*查詢的右表的所有記錄以及交集部分
3膘怕、子查詢
概念:查詢中嵌套查詢想诅,稱嵌套的查詢?yōu)樽硬樵?/p>
image.png
子查詢的不同情況:
1.子查詢的結(jié)果是單行單列的:
子查詢可以作為條件,可以使用運算符去判斷。運算符:> >= < <= =
image.png
2.子查詢的結(jié)果是多行單列的:
子查詢可以作為條件来破,使用運算符in來判斷
image.png
3.子查詢的結(jié)果是多行多列的:
子查詢可以作為一張?zhí)摂M表篮灼。參與查詢
image.png
image.png
也可以通過普通查詢完成這個需求查詢,可能更好理解一下徘禁。
事務(wù)
1诅诱、事務(wù)的基本介紹
* 概念:
如果一個包含多個步驟的業(yè)務(wù)操作,被事務(wù)管理送朱,那么這些操作要么同時成功娘荡,要么同時失敗。
image.png
操作:
開啟事務(wù):start transaction驶沼;
回滾:rollback;
提交:commit炮沐;
image.png
在MYSQL數(shù)據(jù)庫中事務(wù)默認(rèn)提交
事務(wù)提交的兩種方式:
自動提交:
mysql就是自動提交的,
*一條DML(增刪改)語句會自動提交一次事務(wù)
手動提交:
Oracle數(shù)據(jù)庫默認(rèn)是手動提交事務(wù)的
需要先開啟事務(wù)商乎,再提交
修改事務(wù)的默認(rèn)提交方式
查看事務(wù)的提交方式:select @@autocommit央拖;--1代表自動提交, 0 代表手動提交
修改默認(rèn)提交方式:set @@autocommit = 0鹉戚;
這個時候?qū)慏ML不寫commit鲜戒,是不會提交的
2、事務(wù)的四大特征
1抹凳、原子性:是不可分割的最小操作單位遏餐,要么同時成功,要么同時失敗赢底。
2失都、持久性:當(dāng)事務(wù)提交或回滾后,數(shù)據(jù)庫會持久化的保存數(shù)據(jù)幸冻。
3粹庞、隔離性:多個事務(wù)之間。相互獨立洽损。
4庞溜、一致性:事務(wù)操作前后數(shù)據(jù)總量不變。
3碑定、事務(wù)的隔離級別(了解)
概念:多個事務(wù)之間是隔離的流码,相互獨立的,但是如果多個事務(wù)延刘,操作同一批數(shù)據(jù)漫试,則會引發(fā)一些問題,設(shè)置不同的隔離級別就可以解決這些問題碘赖。
存在的問題:
1.臟讀:一個事務(wù)讀取到另一個事務(wù)中沒有提交的數(shù)據(jù)驾荣。
2.不可重復(fù)讀(虛讀):在同一個事務(wù)中兩次讀取到的數(shù)據(jù)不一樣外构。
3.幻讀:一個事務(wù)操作(DML)數(shù)據(jù)表中所有的記錄,另一個事務(wù)添加了一條數(shù)據(jù)秘车,則第一個事務(wù)查詢不到自己的修改典勇。
隔離級別:
1.read uncommitted:讀未提交
產(chǎn)生的問題:臟讀、不可重復(fù)讀叮趴、幻讀
2.read committed:讀已提交(Oracle默認(rèn))
產(chǎn)生的問題:不可重復(fù)度割笙、幻讀
3.repeatable read :可重復(fù)度(MYSQL默認(rèn))
產(chǎn)生的問題:幻讀
4.serializable:串行化
可以解決所有的問題
注意:隔離級別從小到大,安全性越來越高眯亦,但是效率越來越低伤溉,
數(shù)據(jù)庫查詢隔離級別:
* select @@tx_isolation;
數(shù)據(jù)庫設(shè)置隔離級別:
* set global transaction isolation level 級別字符串;
演示:
DCL :
SQL 分類:
1.DDL:操作數(shù)據(jù)庫和表
2.DML:操作增刪改表中的數(shù)據(jù)
3.DQL:查詢表中的數(shù)據(jù)
4.DCL:管理用戶妻率,并對用戶進(jìn)行授權(quán)操作
*DBA:數(shù)據(jù)庫管理員
DCL:管理用戶乱顾,并對用戶進(jìn)行授權(quán)操作
1.管理用戶
1、添加用戶:
語法:CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
2宫静、刪除用戶:
DROP USER '用戶名'@'主機名'走净;
3、修改用戶密碼:
UPDETE USER SET PASSWORD = PASSWORD('新密碼') WHERE USER = '用戶名'孤里;
SET PASSWORD FOR '用戶名'@'主機名' = PASSWORD ('新密碼');
4伏伯、查詢用戶:切換到mysql數(shù)據(jù)庫(USE mysql;)--->查詢USER表(select * from user)
image.png
mysql 中忘記了root用戶密碼
1、cmd ----->net stop mysql 停止mysql的服務(wù)(需要管理員運行該CMD)
2捌袜、使用無驗證方式啟動mysql服務(wù):mysqld --skip-grant-tables
3说搅、重新打開一個cmd窗口,輸入mysql虏等,敲回車弄唧,進(jìn)入SQL,使用修改用戶密碼方式修改root密碼
UPDETE USER SET PASSWORD = PASSWORD('新密碼') WHERE USER = '用戶名'霍衫;
4候引、修改完畢,關(guān)閉所有cmd窗口敦跌,然后右鍵打開任務(wù)管理器背伴,找到mysqld.exe服務(wù),右鍵手動關(guān)閉服務(wù)
5峰髓、再打開cmd(管理員)---->啟動mysql服務(wù) net start mysql
注意:%通配符,表示可以在任意主機使用用戶登錄數(shù)據(jù)庫
權(quán)限管理:
1息尺、查詢權(quán)限:
SHOW GRANTS FOR '用戶名'@'主機名';
2携兵、授予權(quán)限:
GRANT 權(quán)限列表(可以寫多個權(quán)限)ON 數(shù)據(jù)庫名.表名 TO '用戶名'@'主機名';
GRANT ALL ON *.* TO '用戶名'@'主機名'; -- 給這個用戶所有權(quán)限在任意數(shù)據(jù)庫上
3、撤銷權(quán)限:
revoke 權(quán)限列表 on 數(shù)據(jù)庫名.表名 from '用戶名'@'主機名';