數據庫的設計:mysql
一、多表之間的關係sql
一對一:例如:人和身份證,實現方式:能夠在任意一方添加惟一外鍵指向另外一方的主鍵數據庫
一對多:例如:部門和員工,實現方式:在多的一方創建外鍵,指向一的一方的主鍵安全
多對多:例如:學生和課程,實現方式:須要藉助第三張中間表,中間表至少包含兩個字段,這兩個字段做爲第三張表的外鍵,分別指向兩張表的主鍵 數據庫設計
二、數據庫設計範式ide
概念:設計數據庫時,須要遵循的一些規範,要遵循後邊的範式要求,必須先遵循錢包的全部範式要求函數
分類:一、第一範式:每一列都是不可分割的原子數據項命令行
二、第二範式:在第一範式的基礎上,非碼屬性必須徹底依賴於候選碼,消除部分依賴設計
函數依賴:若是經過A屬性(屬性組)的值,能夠肯定惟一B屬性的值,則稱B依賴A事務
徹底函數依賴:若是A是一個屬性組,則B屬性值得肯定須要依賴A屬性組中全部的屬性值
部分函數依賴:若是A是一個屬性組,則B屬性值得肯定只須要依賴於A屬性組中的某一些值便可
傳遞函數依賴:若是經過A屬性(屬性組)的值,能夠肯定惟一B屬性的值,經過B屬性(屬性組)的值能夠肯定惟一C屬性的值
碼:若是在一張表中,一個屬性或屬性組,被其餘屬於屬性所徹底依賴,則稱這個屬性(屬性組)爲該表的碼
三、第三範式:在第二範式的基礎上,任何非主屬性不依賴於其餘非主屬性,消除傳遞依賴
數據庫的備份和還原:
命令行:備份 :mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存路徑
還原:一、登錄數據庫
二、建立數據庫
三、使用數據庫
四、執行文件。source 文件路徑
多表查詢:
笛卡爾積:有兩個集合A,B,取這兩個集合的全部組成狀況
要完成多表查詢,須要消除無用的數據
多表查詢的分類:
一、內鏈接查詢
隱式內鏈接:使用where條件消除無用數據
例如:select 列名組 from 表名1,表名2 where 表名1.列 = 代表2.列名
顯式內鏈接:
select 列名組 from 表名1 inner join 表名2 on 表名1.列 = 表名2 .列
內鏈接查詢:一、從哪些表中查詢數據
二、條件是什麼
三、查詢哪些字段
二、外鏈接查詢
左外鏈接:
select 字段列表 from 表1 left outer join 表2 on 條件;
查詢的是左表全部數據以及其交集部分
右外鏈接:
select 字段列表 from 表1 right outer join 表2 on 條件
查詢的是右表全部數據以及其交集部分
三、子查詢
概念:查詢中嵌套查詢
子查詢的結果是單行單列的
子查詢能夠做爲條件,使用運算符其判斷
例如:select *from emp where emp.salary < (select avg(aslary) from emp)
子查詢的結果是多行單列的
例如:select * from emp where dept_id in(select id from dept where name = 財務部 or name = 市場部)
子查詢的結果是多行多列的
這裏的子查詢做爲一張虛擬表
例如:select *from dept t1 ,(select *from emp where emp.join_date >「2011-11-11」)t2 where t1.id = t2.dept_id;
事務:
基本介紹:若是一個包含多個步驟的業務操做,被一個事務管理,要麼都成功,要麼都失敗
事務的操做:一、開啓事務,start transaction;
二、回滾,rollback;
三、提交,commit;
例如:start transaction ;
update account set balance = balance -500 where name = zhang;
update account set balance = balance + 500 where name = li;
commit;
rollback;
在MySQL數據庫中事務默認自動提交
一條DML語句會自動提交一次事務,開啓事務後,須要手動提交
修改事務的默認提交方式:select @@ autocommit; 1表明自動提交,0表明手動提交
set @@ autocommit = 0;修改成手動提交
四大特徵:一、原子性,是不可分割的最小操做單位
二、持久性,事務提交或者回滾後,數據庫會發生持久化的保持數據
三、隔離性,多個事務之間,相互獨立
四、一致性,事務操做先後數據總量不變
隔離級別:多個事務之間隔離的,相互獨立的,可是若是多個事務操做同一批數據,則會發生一些問題,設置不一樣的隔離級別就能夠解決這些問題
存在的問題:一、髒讀:一個事務讀取到另外一個事務中,沒有提交的數據
二、不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不同
三、幻讀 :一個事務操做數據表中全部的記錄,另外一個事務添加了一條數據,則第一個事務查詢不到本身的修改
隔離級別分類:一、read uncommitted:讀未提交,會產生髒讀,虛讀,幻讀
二、read committed :讀已提交,會產生虛讀,幻讀
三、repeatable read :可重複讀,會產生幻讀(MySQL 默認級別)
四、serializable:串行化,都不產生
注意:隔離級別從小到大,安全性愈來愈高,效率愈來愈低
數據庫設置隔離級別:查詢隔離級別 select @@ tx_isolation;
設置隔離級別 set global transaction isolation level 級別字符串
DCL:
管理用戶:
一、添加用戶:create user ‘用戶名’@‘主機名’ identified by ‘密碼’;
二、刪除用戶:drop user ‘用戶名’@‘主機名’;
三、修改用戶密碼:update user set password = password(’新密碼‘)where uesr = ’用戶名‘;
set password for ’用戶名‘@’主機名‘ =password(’新密碼‘);
四、查詢用戶:use mysql ;select * from user;
注意:主機名能夠用通配符%,表明能夠遠程訪問
權限管理:
一、查詢權限:show grants for ’用戶名‘@’主機名‘;
二、授予權限:grant 權限列表 on 數據庫名.表名 to ‘用戶名’@‘主機名’
grant all on *.* to ‘用戶名’@‘主機名’;授予全部表的全部權限
三、撤銷權限:revoke 權限列表 on 數據庫名.表名 from ‘用戶名’@‘主機名’;