Java EE day04學習總結

今天主要學習聚合函數&表約束

思維導圖:

一.級聯操作

1.概念:

當我們的一張表存在外鍵的時候,這個時候我們希望修改或者刪除數據,如果刪除了或者修改了主表數據,且從表會跟隨着主表聯動修改或者刪除從表數據,這個時候就可以使用級聯操作。

2.級聯操作關鍵字:

級聯刪除:ON DELETE CASCADE

級聯更新:ON UPDATE CASCADE

代碼示例:

-- 創建員工表

CREATE TABLE emp(

    id INT PRIMARY KEY auto_increment,

    name VARCHAR(20),

    dept_id INT,

    -- 給外鍵字段添加級聯更新(ON UPDATE CASCADE)、級聯刪除(ON DELETE CASCADE)

    CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE

);    

 

-- 修改主表主鍵ID,從表聯動修改

UPDATE dept SET id = 3 WHERE id = 1;

-- 刪除主表主鍵ID,從表聯動刪除

DELETE FROM dept WHERE id = 3;

 

二.數據庫設計與規範

1.數據庫層次兩個階段

(1)數據庫的需求分析

<1>原始需求(我需要上傳一個視頻並且顯示)

<2>我們需要將客戶或者產品的原始需求轉換爲業務需求

<3>我需要上傳一個視頻並且顯示的分析

圖片字段

標題字段

價格字段

訪問量字段

評價字段

....

(2)數據庫的需求設計

<1>將整理好的需求轉換爲一個業務模型

class voide[String img,String title,doube price..]

<2>將後端或者其他代碼轉化爲數據庫參數 

create table voide(img varchar(20),title varchar(20),price double(8,2)...)

2.多表之間的關係(重要)

在現實的生活當中,對象跟對象之間肯定是有一定練習的,比如學生和老師,員工和部門,司機與乘客。其實這也是就我們第一節課所說的關係型數據和非關係的區別。
那麼我們這種關係型數據庫就一定要設計好表和表之間的關係

 

3.一對多關係(多對一) [最常用]

一對多(1:n),比如一個老師對應多個學生

一個部門對應多個員工

一個賬號對應多個訂單

一對多的建表原則:在多的一方設定爲從表(外鍵),在少的一方設定爲主表(主鍵),然後從表的外鍵關聯了主表的主鍵。 

 

 

 

4.多對多關係 [一般]

多對多(m:n):

學生和課程

老師和學生

多對多的建表原則:這個關係比較特殊,所有需要實現多對多就一定要依靠一箇中間表完成,且這個中間表必須最少具備兩個字段,然後這兩個字段分別指向了主表和從表 

 

 

5.一對一關係 [幾乎不用,因爲一張表完全就可以實現一對一]

一對一(1:1),在實際的開發當中,基本不用,因爲1:1的關係其實完全可以一張表完成

學號對姓名

公民對身份證 

 

三.表設計的五大範式

1.什麼是範式?

一個好的數據庫設計多存儲和性能以及後期從程序的開發維護起到了一個至關重要的作用,爲了建立更加科學、更加合理的數據庫流程,就有人設計了一套來優化數據庫存儲的規則,這個規則就被稱之範式規則。

2.有哪一些範式?

目前關係型數據庫一共存在了5-6種設計範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第五範式(5NF)【完美級範式】。
最低要求的第一範式,必須遵循 否則數據庫無法跟程序代碼接軌、一般實現第二或者第三範式就可以。 

3.第一範式

(1)要求數據庫的表字段每一個是不可分割的,必須是具備原子性,不能是數組或者集合類的非原子性,就是說表中的每一個列,裏面數據一旦定義好,那麼就不要去切割他(不要去拆分)

 

4.第二範式

(1)概念:第二範式的要求是必須滿足第一範式,要求表中的每一個字段都強烈的依賴於主鍵,其實就是第二範式就是在第一範式的基礎上,要所有的列必須依賴於主鍵。
(2)第二範式的特點:
<1>一張表只能表述一件事情
<2>表中的每一個字段都必須和主鍵有依賴關係

 

 

5.第三範式

第三範式的要求是必須先滿足第二範式,表中的每一個字段列都直接依賴於主鍵,任何非主鍵列都不能進行任何形式的傳遞依賴。
什麼是傳遞依賴,如果現在有三張表 A<--B<--C,

6.總結

 

範式名稱

特點

1NF

要求表的數據是不可拆分,具備原子性

2NF

一張表只做一件事,表字段都跟主鍵有直接依賴關係

3NF

不產生傳遞關係,表的每一個字段和主鍵必須是直接依賴,而不是間接依賴

 

 

 

四.多表查詢

1.交叉連接查詢

SELECT 表1.字段名,表2.字段名 FROM 表1,表2;

SELECT  dept1.name,emp.name FROM dept1,emp;

2.交叉連接查詢產生笛卡爾積

所謂的笛卡爾積,又被稱之爲笛卡爾乘積。
就是左邊的數據 * 右邊的數據 = 查詢數據

 

3.解決笛卡爾積

笛卡爾積的主要問題還是有因爲數據沒有進行過濾,此時只需要將外鍵和主鍵進行匹配限制即可。

 

4.內連接查詢

兩張表交叉後的,且過濾後的數據查詢稱之爲內連接查詢

 

 

 

 

5.隱式內連接查詢(解決笛卡爾積)

SELECT  * FROM 主鍵表,外鍵表 WHERE 主鍵表.主鍵列 = 外鍵表.外鍵類;

SELECT  dept1.name,emp.name FROM dept1,emp WHERE dept1.id = emp.dept_id;

 

-- 爲了解決多表查詢時候,表名過長的問題 我們可以是表別名縮減

SELECT  d.name,e.name FROM dept1 d,emp e WHERE d.id = e.dept_id;

6.顯式內連接

SELECT  * FROM 

        emp 

    INNER JOIN 

        dept1 

    ON 

        emp.dept_id = dept1.id;

 

7.左外連接查詢

當兩張表進行查詢的時候,可能出現數據量不一致的問題,那麼這個時候就需要覺得以誰作爲參考,而左外連接則以LEFT OUTER JOIN的左邊數據表作爲參考。
當左表和右表數據滿足連接條件的時候,就顯示所滿足條件的數據,如果不滿足 則顯示null.

SELECT e.name,d.name  FROM 

        emp  e 

    LEFT OUTER JOIN 

        dept d  

    ON 

        e.dept_id = d.id;

8.右外連接查詢

當兩張表進行查詢的時候,可能出現數據量不一致的問題,那麼這個時候就需要覺得以誰作爲參考,而左外連接則以RIGHT OUTER JOIN的右邊數據表作爲參考。
當左表和右表數據滿足連接條件的時候,就顯示所滿足條件的數據,如果不滿足 則顯示null.

    SELECT e.name,d.name  FROM 

        emp  e 

    RIGHT OUTER JOIN 

        dept d  

    ON 

        e.dept_id = d.id;

9.子查詢

所謂的子查詢就是將一個SQL語句查詢出來的結果充當爲一個單列數據,然後這個結果提供其他SQL語句操作

普通查詢方式:查詢員工最高的員工信息

  1. 先查詢最高工資SELECT MAX(salary) FROM emp;
  2. 根據最高工資查詢員工信息SELECT * FROM emp WHERE salary = 200000;

子查詢完成

SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp);

10.如果是雙列子查詢需要使用IN關鍵字進行處理

查詢開發部和人事部是所有員工信息

SELECT id FROM dept1 WHERE name = '人事部';

SELECT * FROM emp WHERE dept_id = 3;

子查詢完成

SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept1 WHERE name = '人事部' OR name = '研發部'); 

 

`

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章