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 級別字符串