MYSQL多表查詢以及事務概念補充

1.多表查詢概念

  • 笛卡爾積:

      * 有兩個集合  A  , B 	,取這兩個集合的所有組成情況。
      * 要完成多表查詢, 需要消除無用的數據
    
  • 多表查詢的分類:

    1.內連接查詢:

      	1.隱式內連接查詢:使用where條件消除無用數據
      		* 例子:	
      		-- 查詢所有員工信息和對應的部門信息
      	
      		SELECT * FROM A(員工表 ) V(部門表) where A.id = B.id
    
      		-- 查詢員工表的名稱, 性別。部門表的名稱
      		
      		SELECT 
      			t1.name ,  --- 員工表的姓名
      			 t1.sex ,    ---  員工表的性別
      			 t2.name  --- 部門表的名稱
      		FROM
      			emp t1 , 員工表的別名  t1 
      			dept t2  部門表的別名  t2
      		WHERE
      			t1.id = t2.id
      			
           2.顯示內連接:		
      		* 語法: select 字段名稱 from A [ inner ] join B on A.id = B.id
    
      			 select * from emp join dept on emp.id = dept.id
    

    2.外連接查詢:

      	  1.左外連接:
      		* 語法:select 字段列名 from 表名A left join 表名B ON A.id = B.id
      		* 查詢的是左表所有的數據以及交集的數據
       	  2.右外
      		* 語法:select 字段列名 from 表名A right join 表名B ON A.id = B.id
      		* 查詢的是右表所有的數據以及交集的數據
    

3.子查詢:

	       * 概念:查詢中嵌套另外一個查詢,稱嵌套查詢爲子查詢
		例如:			

		-- 查詢工資最高的員工
		-- 1 查詢最高工資
		SELECT MAX(salary) FROM 表A; -- 假設是1000
		
		-- 2 查詢員工信息 , 並且工資等於1000的信息

		SELECT * FROM 表A  WHERE salary = 1000;

		-- 3 子查詢示例:查詢自身
			
		SELECT * FROM 表A WHERE salary = (SELECT MAX(salary)FROM 表A)
	       
	* 子查詢不同情況
		
		1. 子查詢的結果是單行單列的:
		
			SELECT * FROM 表A WHERE salary < (SELECT AVG(salary)FROM 表A)
		
		2. 子查詢的結果是多行單列的:
			
			* 子查詢可以作爲條件,使用運算符IN來判斷

			SELECT * FROM 表A WHERE salary IN (SELECT id FROM 表B where  條件xxx ) ;

		3. 子查詢的結果是多行多列的:
			
			* 子查詢可以作爲一張虛擬表。
			
			SELECT 
				字段列名 
			
			FROM 表A  t1,(SELECT * FROM 表B WHERE xx > '條件' )  虛擬表B  t2
			
		                WHERE
				t1.id = t2.id;

2.事務

1.事務的基本介紹

	1. 概念:
		*  如一個包含多個步驟的業務操作 , 被事務管理 , 那麼這些操作要麼同時成功, 要麼同時失敗
	2. 操作 :
		1.開啓事務: start transaction;
		2. 回滾 : rollback; 
		3. 提交 :commit ;
		4.MYSQL數據庫中事務默認自動提交
			* 事務提交的兩種方式:
				* 自動提交:
					* mysql就是自動提交的
					* 一條DML(增刪改)語句會自動提交一次事務。
				* 手動提交:
					* 需要先開啓事務,再提交
			* 修改事務的默認提交方式:
				* 查看事務的默認提交方式:SELECT @@autocommit ; -- 1 代表自動提交  0 代表手動提交
				 * 修改默認提交方式: set @@autocommit = 0 ;	

2.事務的四大特徵

	1. 原子性:是不可分割的最小操作單位,要麼同時成功, 要麼同時失敗。
	2. 持久性:當食物提交或回滾後,數據庫會持久化的保存數據。
	3.隔離性:多個事務之間。相互影響
	4.一致性:事務操作前後,數據總量不變

3.事務的隔離級別(瞭解)

	* 概念:多個事務之間隔離的 , 相互獨立的 。 但是如果多個事務操作同一批數據 ,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。
	* 存在問題:
		1. 髒讀:一個事務, 讀取到另一個事務中沒有提交的數據
		2. 不可重複讀:在同一個事物,兩次讀取到的數據不一樣
		3. 幻讀 :一個事務操作(DML) 數據包中所有記錄 , 另一個事務添加了一條數據 , 則第一個事務查詢不到自己的修改
	   * 隔離級別:
		1. read unncommitted:讀未提交
			* 產生的問題:髒讀,不可重複讀,幻讀
		2.read committed : 讀已提交 (Oracle)
			* 產生的問題:不可重複讀,幻讀
		3.repeatable read: 可重複讀 (MYSQL)
			* 產生的問題:幻讀
		4.serializable: 串行化 
			* 可以解決所有問題

		* 注意:隔離級別從小到大安全性越來越高 , 但是效率越來越低 
		* 數據庫查詢隔離級別 :
			* select @@tx_isolation;
		* 數據庫設置隔離級別:
			* set global transaction isolation level 級別字符串
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章