mysql---表的設計

三大範式

範式就是表設計的準則,目的是讓表的設計更加合理

  • 第一範式
    第一範式表示表中的每個字段,都是不可分割的,如圖:
    在這裏插入圖片描述
    可以看出address字段是可以分割的,可以分割爲:
    在這裏插入圖片描述
    這種情況就不滿足第一範式;
  • 第二範式
    第二範式就是在第一範式的基礎上,表中所有字段都應該與表中的主鍵全部關聯,而不是部分關聯,一般常見於組合主鍵,如圖:
    在這裏插入圖片描述
    可以看出這個表有兩個主鍵訂單號和產品號,產品數和產品單價都與訂單號和產品號相關,但是訂單金額和訂單時間只與訂單號相關,不與產品號相關,這就不符合第二範式的特點,數據冗餘,因此可以對這個表進行分割,如圖:
    在這裏插入圖片描述
    也就是第二範式通過完整相關減少數據冗餘;
  • 第三範式
    第三範式就是在第二範式的基礎上,表中的所有字段都應該和主鍵直接相關,而不是部分相關,如圖:
    在這裏插入圖片描述
    這個表的主鍵是學生ID,但是班主任信息和學生ID不是直接相關的,產生了數據冗餘,可以分割,如圖:
    在這裏插入圖片描述
    第三範式就是通過直接相關減少數據冗餘
聯合查詢
  • 笛卡爾積
    笛卡爾積就是如圖:
    在這裏插入圖片描述
    也就是A集合*B集合;

  • 內連接
    再進行笛卡爾積之後,進行多表查詢,首先是內連接,它使用inner join關鍵字(inner可以省略)實現,使用on關鍵字實現條件,例如建立四個表並插入以下數據,如圖:
    classes表
    在這裏插入圖片描述
    student表
    在這裏插入圖片描述
    course表
    在這裏插入圖片描述
    score表
    在這裏插入圖片描述
    內連接就是將兩張表的數據取交集(不關聯的信息自動過濾掉),例如
    (1)查詢"小王"同學的成績,如圖:
    在這裏插入圖片描述
    (2)查詢所有同學的總成績,並顯示出個人信息
    在這裏插入圖片描述
    這個是需要分組查詢的,因爲是每一組每一組顯示信息;
    (3)查詢所有同學的成績,並顯示個人信息
    在這裏插入圖片描述
    查詢所有同學成績,因此要顯示出來課程名,最終結果以stu.id的升序顯示;

  • 外連接
    外連接分爲左連接和右連接;
    1、左連接:以左表爲主表,左表中的數據全都顯示,若沒有對應右表的信息,則以NULL顯示;
    例如:
    (1)查詢每個學生所在的班級,顯示出學生的id和name,如圖:
    在這裏插入圖片描述
    2、右連接:以右表爲主表,左表中的數據全部顯示,若沒有對應右表的信息,則以NULL顯示;
    例如查詢每個學生所在的班級,給出班級id和名字,如圖:
    在這裏插入圖片描述

  • 自連接
    自連接就是在同一張表連接自身進行查詢,例如查詢學生java和計算機組成原理的成績,並顯示對應科目,如圖:
    在這裏插入圖片描述

  • 子查詢
    子查詢就是在SQL語句中嵌套其他SQL語句,例如:
    (1)查詢小王同學的同班同學
    在這裏插入圖片描述
    或者使用in關鍵字
    在這裏插入圖片描述
    (2)查詢“高等數學”或者“英語”課程的成績信息
    如圖:
    在這裏插入圖片描述
    或者可以使用exists關鍵字,例如:
    在這裏插入圖片描述
    在from子句中使用子查詢,子查詢語句出現在from子句中,把一個子查詢當做一個臨時表使用,例如:查詢所有比“計算機科學與技術1班”平均分高的成績信息,如圖:
    在這裏插入圖片描述
    我這裏是沒有這種情況的;

  • 合併查詢
    在實際應用中,爲了合併多個select的執行結果,可以使用集合操作符,例如union和union all,注意使用時前後查詢的結果集中,字段要一致;

  • union
    這個是用於取得兩個結果集的並集,自動去除重複行
    例如查詢id小於3,或者名字爲“英語”的課程,如圖:
    在這裏插入圖片描述
    當然也可以使用select* from cource where id<3 or name=“英語”;這個語句;

  • union all

這個與union的區別就是它不會去掉重複行,例如查詢id小於3,或者名字爲“java”的課程,如圖:
在這裏插入圖片描述

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