mysql快取問題 相關引數的檢視
MYSQL高階
- 掌握約束的使用
- 掌握表關係及建表原則
- 重點掌握多表查詢操作
- 掌握事務操作
一、約束
1.1 概念
-
約束是作用於表中列上的規則,用於限制加入表的資料
例如:我們可以給id列加約束,讓其值不能重複,不能為null值。
-
約束的存在保證了資料庫中資料的正確性、有效性和完整性
新增約束可以在新增資料的時候就限制不正確的資料,年齡是3000,數學成績是-5分這樣無效的資料,繼而保障資料的完整性。
1.2 分類
-
非空約束: 關鍵字是 NOT NULL
保證列中所有的資料不能有null值。
-
唯一約束:關鍵字是 UNIQUE
保證列中所有資料各不相同。
-
主鍵約束: 關鍵字是 PRIMARY KEY
主鍵是一行資料的唯一標識,要求非空且唯一。一般我們都會給沒張表新增一個主鍵列用來唯一標識資料。
-
檢查約束: 關鍵字是 CHECK
保證列中的值滿足某一條件。
-
預設約束: 關鍵字是 DEFAULT
儲存資料時,未指定值則採用預設值。
-
外來鍵約束: 關鍵字是 FOREIGN KEY
外來鍵用來讓兩個表的資料之間建立連結,保證資料的一致性和完整性。
1.3 非空約束
-
語法
-
新增約束
-- 建立表時新增非空約束 CREATE TABLE 表名( 列名 資料型別 NOT NULL, … ); -- 建完表後新增非空約束 ALTER TABLE 表名 MODIFY 欄位名 資料型別 NOT NULL;
-
刪除約束
ALTER TABLE 表名 MODIFY 欄位名 資料型別;
-
1.4 唯一約束
-
語法
-
新增約束
-- 建立表時新增唯一約束 CREATE TABLE 表名( 列名 資料型別 UNIQUE [AUTO_INCREMENT], -- AUTO_INCREMENT: 當不指定值時自動增長 … ); CREATE TABLE 表名( 列名 資料型別, … [CONSTRAINT] [約束名稱] UNIQUE(列名) ); -- 建完表後新增唯一約束 ALTER TABLE 表名 MODIFY 欄位名 資料型別 UNIQUE;
-
刪除約束
ALTER TABLE 表名 DROP INDEX 欄位名;
-
1.5 主鍵約束
-
語法
-
新增約束
-- 建立表時新增主鍵約束 CREATE TABLE 表名( 列名 資料型別 PRIMARY KEY [AUTO_INCREMENT], … ); CREATE TABLE 表名( 列名 資料型別, [CONSTRAINT] [約束名稱] PRIMARY KEY(列名) ); -- 建完表後新增主鍵約束 ALTER TABLE 表名 ADD PRIMARY KEY(欄位名);
-
刪除約束
ALTER TABLE 表名 DROP PRIMARY KEY;
-
1.6 預設約束
-
語法
-
新增約束
-- 建立表時新增預設約束 CREATE TABLE 表名( 列名 資料型別 DEFAULT 預設值, … ); -- 建完表後新增預設約束 ALTER TABLE 表名 ALTER 列名 SET DEFAULT 預設值;
-
刪除約束
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
-
1.7 外來鍵約束
- 新增外來鍵約束
-- 建立表時新增外來鍵約束
CREATE TABLE 表名(
列名 資料型別,
…
[CONSTRAINT] [外來鍵名稱] FOREIGN KEY(外來鍵列名) REFERENCES 主表(主表列名)
);
-- 建完表後新增外來鍵約束
ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名稱 FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱(主表列名稱);
- 刪除外來鍵約束
ALTER TABLE 表名 DROP FOREIGN KEY 外來鍵名稱;
二、資料庫設計
2.1 資料庫設計簡介
-
資料庫設計概念
- 資料庫設計就是根據業務系統的具體需求,結合我們所選用的DBMS,為這個業務系統構造出最優的資料儲存模型。
- 建立資料庫中的表結構以及表與表之間的關聯關係的過程。
- 有哪些表?表裡有哪些欄位?表和表之間有什麼關係?
-
資料庫設計的步驟
- 需求分析(資料是什麼? 資料具有哪些屬性? 資料與屬性的特點是什麼)
- 邏輯分析(通過ER圖對資料庫進行邏輯建模,不需要考慮我們所選用的資料庫管理系統)
- 物理設計(根據資料庫自身的特點把邏輯設計轉換為物理設計)
- 維護設計(1.對新的需求進行建表;2.表優化)
表關係
-
一對一
- 如:使用者 和 使用者詳情
- 一對一關係多用於表拆分,將一個實體中經常使用的欄位放一張表,不經常使用的欄位放另一張表,用於提升查詢效能
-
一對多
-
如:部門 和 員工
-
一個部門對應多個員工,一個員工對應一個部門
-
-
多對多
-
如:商品 和 訂單
-
一個商品對應多個訂單,一個訂單包含多個商品
-
2.2 表關係(一對多)
-
實現方式
在多的一方建立外來鍵,指向一的一方的主鍵
2.3 表關係(多對多)
-
實現方式
建立第三張中間表,中間表至少包含兩個外來鍵,分別關聯兩方主鍵
2.4 表關係(一對一)
-
實現方式
在任意一方加入外來鍵,關聯另一方主鍵,並且設定外來鍵為唯一(UNIQUE)
三、多表查詢
從多張表中一次性的查詢出我們想要的資料
3.1 內連線查詢
- 語法
-- 隱式內連線
SELECT 欄位列表 FROM 表1,表2… WHERE 條件;
-- 例子
select emp.name from emp, dept where emp.dep_id = dept.did;
-- 顯示內連線
SELECT 欄位列表 FROM 表1 [INNER] JOIN 表2 ON 條件;
-- 例子
select * from emp inner join dept on emp.dep_id = dept.did;
內連線相當於查詢 A B 交集資料
3.2 外連線查詢
-
語法
-- 左外連線 SELECT 欄位列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件; --例子 select * from emp left join dept on emp.dep_id = dept.did; -- 右外連線 SELECT 欄位列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件; -- 例子 select * from emp right join dept on emp.dep_id = dept.did;
左外連線:相當於查詢A表所有資料和交集部分資料
右外連線:相當於查詢B表所有資料和交集部分資料
3.3 子查詢
-
概念
查詢中巢狀查詢,稱巢狀查詢為子查詢
-
例子
-
查詢 '財務部' 和 '市場部' 所有的員工資訊
-- 查詢 '財務部' 或者 '市場部' 所有的員工的部門did select did from dept where dname = '財務部' or dname = '市場部'; select * from emp where dep_id in (select did from dept where dname = '財務部' or dname = '市場部');
-
查詢入職日期是 '2011-11-11' 之後的員工資訊和部門資訊
-- 查詢入職日期是 '2011-11-11' 之後的員工資訊 select * from emp where join_date > '2011-11-11' ; -- 將上面語句的結果作為虛擬表和dept表進行內連線查詢 select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;
-
四、事務
4.1 概述
資料庫的事務(Transaction)是一種機制、一個操作序列,包含一組資料庫操作命令。
事務把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼同時成功,要麼同時失敗。
事務是一個不可分割的工作邏輯單元
4.2 語法
-
開啟事務
START TRANSACTION; 或者 BEGIN;
-
提交事務
commit;
-
回滾事務
rollback;
4.3 事務的四大特徵
-
原子性(Atomicity): 事務是不可分割的最小操作單位,要麼同時成功,要麼同時失敗
-
一致性(Consistency) :事務完成時,必須使所有的資料都保持一致狀態
-
隔離性(Isolation) :多個事務之間,操作的可見性
-
永續性(Durability) :事務一旦提交或回滾,它對資料庫中的資料的改變就是永久的
說明:
mysql中事務是自動提交的。
也就是說我們不新增事務執行sql語句,語句執行完畢會自動的提交事務。
可以通過下面語句查詢預設提交方式:
SELECT @@autocommit;
查詢到的結果是1 則表示自動提交,結果是0表示手動提交。當然也可以通過下面語句修改提交方式
set @@autocommit = 0;