2六、MySQL數據庫(二)

數據庫的設計: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 ‘用戶名’@‘主機名’;

相關文章
相關標籤/搜索