1. 程式人生 > >JavaWeb--MySQL多表與事務

JavaWeb--MySQL多表與事務

今日內容

  1. 多表關係(理解)

    一對一:在任意一方新增外來鍵指向另一方的主鍵,並且給外來鍵欄位新增unique約束;(瞭解)
    一對多:在多的一方新增外來鍵指向一的一方的主鍵;
    多對多:建立一張中間表,這個中間表中至少有兩個欄位作為外來鍵分別指向多對多雙方的主鍵;
    
  2. 多表查詢(重點)

    如何判斷連線哪些表:根據要查詢的結果來判斷需要連線的表;

    1. 內連線:獲取兩個表交集的資料,獲取能通過連線條件連線的資料。
    隱式內連線:(重點)
    	語法:select * from1,2,...where 連線條件;
    	連線條件:有關係的欄位進行連線,一般是主外來鍵連線;
    顯示內連線:
    	語法:select
    * from1 [inner] join2 on 連線條件; select * from1 [inner] join2 where 連線條件;只有內連線查詢可以用where連線
    1. 外連線:如果想獲取某個表的所有資料,那麼只能使用外連線;
    左外連線:能夠或左表(1)的所有資料以及和表2的交集資料;
    	語法:select * from1 left [outer] join2 on 連線條件;
    右外連線:能夠或右表(2)的所有資料以及和表1的交集資料;
    	語法:select * from1 right [outer] join2
    on 連線條件;
    1. 子查詢:查詢用巢狀查詢,巢狀的查詢就是子查詢
    where子句子查詢:將一個查詢的結果作為另一個查詢的條件;
    	子查詢結果是單行單列:適用於 where 基本條件的值 > = >= < <= = !=
    	子查詢結果是多行單列:適用於 where中帶in的條件
    from子句子查詢:將一個查詢的結果作為表和其他表進行連線查詢;
    	子查詢結果是單/多行多列:適用於作為表和其他表進行連線查詢;
    select子句子查詢:將一個帶條件的查詢結果作為另一個查詢的結果;(擴充套件)
    	SELECT id,NAME,gender,salary,
    join_date,(SELECT NAME FROM dept WHERE id=dept_id) 部門名稱 FROM emp;

    注意:在mysql中,子查詢作為表需要使用別名;

    技巧1:如何使用連線查詢:根據查詢結果判斷資料來源於哪些表(確定from後面的表);在根據是否要查詢某個表的所有資料判斷是內連線還是外連線;最後確定連線條件和select結果;

    技巧2:如何使用子查詢:將複雜的需求拆分成一個個小的需求;

  3. 事務

    什麼是事務**(記住):一組sql操作要麼同時成功要麼同時失敗**就稱為事務管理;

    事務管理的流程:(掌握)

     1. **開啟事務:start transaction;**
     2. **一組sql語句;**
    
    1. 提交/回滾事務:commit/rollback;

    注意:如果手動的通過start transaction開啟事務,那麼就需要手動的通過commit提交事務資料才持久化到資料庫中;

    隔離級別:read uncommitted/read committed/repeatable read/serializable

    設定/檢視事務的隔離級別:

    ​ set global transaction isolation level 級別字串;

    ​ select @@tx_isolation;

  4. DCL**(瞭解)**

    1. 新增使用者**(瞭解)**
    create user '使用者名稱稱'@'主機名' IDENTIFIED BY '密碼';
    例如: create user 'zhangsan'@'localhost' IDENTIFIED BY '123';
    
    1. 刪除使用者**(瞭解)**
    drop user '使用者名稱稱'@'主機名'
    例如: drop user 'zhangsan'@'localhost'
    
    1. 修改使用者密碼**(瞭解)**
    修改其他使用者密碼:
    	方式一: update user set password=password('123456') where user='使用者名稱';(這個語句有問題,儘量不使用,會發生更改密碼無效)
    	方式二:set password for '使用者名稱'@'主機名'=password('123456');
    越過許可權認證修改root使用者密碼:
    	1、關閉之前服務:
        2、在cmd下跳過許可權開啟服務:mysqld --skip-grant-tables   後面沒有分號,--skip有兩個-;
        3、重新開啟一個cmd,登入mysql資料庫,輸入mysql,直接按回車鍵就能進入資料庫
        4、操作mysql資料庫,修改user表中root的password的值
        use mysql;----------------------------------------------------->使用mysql資料庫
        set password for 'root'@'localhost' = password('root');-------------------->修改
        user表裡面user='root'的password值
        注意:password=password('新密碼')格式是固定的,password和user的欄位都是char型別。
    	5、在工作管理員中結束mysqld.exe程序,重新開啟mysql服務。
    
    1. 查詢所有使用者資訊(實際查詢mysql資料庫中的user表)(瞭解)
    use mysql;
    select * from user;
    
    1. 使用者授權管理**(瞭解)**
    檢視使用者授權:	SHOW GRANTS FOR '使用者名稱'@'主機名';
    給使用者授權:GRANT 許可權列表 ON 資料庫.表名 TO '使用者名稱'@'主機名';
    取消許可權:revoke 許可權列表 ON 資料庫.表名 from '使用者名稱'@'主機名';
    

多表查詢:

* 笛卡爾積:
	* 有兩個集合A,B .取這兩個集合的所有組成情況。
	* 要完成多表查詢,需要消除無用的資料

事務 transaction

1. 事務的四大特徵:yygc
	1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
	2. 一致性:事務操作前後,資料總量不變
	3. 隔離性:多個事務之間。相互獨立。
	4. 永續性:當事務提交或回滾後,資料庫會持久化的儲存資料。
2. 事務的隔離級別(isolation)
	* 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批資料,則會引發一些問題,設定不同的隔離級別就可以解決這些問題。
	* 存在問題:
		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  級別字串;
		set global transaction isolation level read uncommitted;

DCL:

* SQL分類:
	1. DDL:操作資料庫和表
	2. DML:增刪改表中資料
	3. DQL:查詢表中資料
	4. DCL:管理使用者,授權

* DBA:資料庫管理員

* DCL:管理使用者,授權
	1. 管理使用者
		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;
			
			* 萬用字元: % 表示可以在任意主機使用使用者登入資料庫

	2. 許可權管理:
		1. 查詢許可權:
			-- 查詢許可權
			SHOW GRANTS FOR '使用者名稱'@'主機名';
			SHOW GRANTS FOR 'lisi'@'%';

		2. 授予許可權:
			-- 授予許可權
			grant 許可權列表 on 資料庫名.表名 to '使用者名稱'@'主機名';
			-- 給張三使用者授予所有許可權,在任意資料庫任意表上
			
			GRANT ALL ON *.* TO 'zhangsan'@'localhost';
		3. 撤銷許可權:
			-- 撤銷許可權:
			revoke 許可權列表 on 資料庫名.表名 from '使用者名稱'@'主機名';
			REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';