三大範式
範式就是表設計的準則,目的是讓表的設計更加合理
- 第一範式
第一範式表示表中的每個字段,都是不可分割的,如圖:
可以看出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”的課程,如圖: