1.自連接
a》求所有計算機組成原理比java成績高的同學id。
1>先找到計算機組成原理和java課程的id
2>根據id再成績表中進行篩選
2.子查詢
單行子查詢(子查詢的結果只有一種)
a》查詢和“不想畢業”同班的同學有哪些
多行查詢
a》查詢語文或者英文對應的成績
1>藉助in
2>藉助exists
3.合併查詢
把多個查詢的結果集合合併成一個集合(需保證多個結果集之間的字段類型和數目都得一致)
a》查詢id<3或者名字爲英文的課程
1>用or
2>用union
(如果兩個查詢中有相同的記錄,只會保留一個,如果不想去重,可以使用union all)
4.索引
索引:相當於目錄
如果沒有索引,我們在查找的時候,就需要把整個表遍歷一遍,相當於“順序表”。數據庫的數據是在磁盤上。磁盤訪問速度比較慢,並且數據量也可能很多,這個速度就會很慢,索引就可以很好解決這一點。
索引可以考慮的數據結構:
1.二叉搜索樹:查找效率O(logN)
2.哈希表 查找效率是O(1)
但是哈希表只能進行一些相等的判斷查詢,對於一些查詢某一範圍內的數據,是不行的。但是對於二叉搜索樹,她的中序遍歷結果是有序的,假如查詢[a,b]範圍內的數據,可以先找到a,再找到b,中序遍歷a,b之間的結果就是想要的數據。但是當數據量比較大的時候,最終操作效率也會越低。
真實的索引結構是一種N叉搜索樹:B+樹
每個節點是N叉,每個節點也可以存多個數據
每個節點的度=存的數據個數+1。
4和8兩個數據把整個數據集切分爲3部分,比4小,比4大比5小,比5大三部分,此時就相當於N分查找,比二分查找還快。
B+樹的真實索引結構:
相比B樹:
1.每一層元素之間都鏈接一起了
2.數據只再葉子節點上保存,非葉子節點只保存一些輔助查找的邊界信息。
這裏的葉子節點放到磁盤上,非葉子節點放到內存中,查找效率就更高了。(減少了讀磁盤次數)
其實索引本質也就是使用空間來換時間。
加在主鍵上的索引和其他列的索引是截然不同的。
主鍵索引的葉子節點存的是數據的完整記錄,其他索引的葉子節點存的是主鍵的id
查看索引:
創建索引:
刪除索引:
5.事務
把一組操作封裝在一起,成爲了一個共同的執行單元。
基本特性:
ACID
1.原子性:事務中的若干操作,要麼全部成功,要麼就全不執行。(假如中間某個步驟出錯,就把之前執行的步驟給回滾回去)
2.一致性:執行事務前後,數據一致出於一種合法的狀態。
3.持久性:事務一旦執行完畢,此時對於數據的修改就是持久生效的(寫入磁盤了,數據存到內存就是不持久的,重啓就沒了)
4.隔離性:涉及併發執行事務,比較複雜