很久沒有更新博客了,埋頭工作有時候都忘了思考,但學習積累的步伐不能停止,今兒個把 SQL 相關知識點重新撿起來,供大家參考,也方便自己查閱備忘。梳理的主線主要基於牛客網《數據庫SQL實戰》,以 SQLite 爲例進行總結梳理。
1. left join, right join 和 inner join
left join(左聯接):返回包括左表中的所有記錄和右表中聯結字段相等的記錄;
right join(右聯接):返回包括右表中的所有記錄和左表中聯結字段相等的記錄;
inner join(等值連接):只返回兩個表中聯結字段相等的行。
2. having
having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數,使用 having 條件顯示特定的組,也可以使用多個分組標準進行分組。與 where 和 select 的交互方式類似。where 搜索條件在進行分組操作之前應用;而 having 搜索條件在進行分組操作之後應用。
3. like
like 操作符用於在 where 子句中搜索列中的指定模式,"%" 可用於定義通配符(模式中缺少的字母)。
4. explain
explain 可以對 select 語句進行分析並且輸出 select 執行過程的詳細信息,讓開發者從這些信息中獲得優化的思路。具體輸出字段可參考:explain SQL語句。
5. 字符串連接
不同數據庫連接字符串的方法不完全相同,MySQL、SQL Server、Oracle 等數據庫支持 concat 方法,而 SQLite 數據庫只支持用連接符號"||"來連接字符串。
6. insert ignore 與 insert into
insert ignore 與 insert into 的區別:insert ignore 會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。
7. 唯一索引與普通索引
用 create unique index … on … 對某列創建唯一索引值,再用 create index … on … 對某列創建普通索引值。關於兩者區別,可參考:選擇唯一索引還是普通索引?
8. 視圖
視圖是一個虛擬的表,是一個表中的數據經過某種篩選後的顯示方式,視圖由一個預定義的查詢 select 語句組成。關於更詳細的視圖知識點,可參考:SQL視圖。
9. 觸發器
SQLite 觸發器(Trigger)是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用。具體可參考:SQL觸發器。
10. 外鍵(foreign key)
表的外鍵是另一個表的主鍵,可重複、可空值。更細緻的分析可參考:數據庫的主鍵和外鍵。
11. 系統表 sqlite_master
SQLite 數據庫中一個特殊的名叫 sqlite_master 上執行一個 select 查詢以獲得所有表的索引。每一個 SQLite 數據庫都有一個叫 sqlite_master 的表, 它定義數據庫的模式。sqlite_master 表可參考:sqlite 的系統表 sqlite_master。
12. 聚合函數 group_concat(X,Y)
SQLite的聚合函數 group_concat(X,Y),其中X是要連接的字段,Y是連接時用的符號,可省略,默認爲逗號。此函數必須與 group by 配合使用,指將分組中的數據聚合。
13. 分頁查找
分頁查找可結合 limit 關鍵字。
14. in 和 exists
in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。如果是exists,那麼以外層表爲驅動表,先被訪問,如果是 in,那麼先執行子查詢,所以我們會以驅動表的快速返回爲目標,那麼就會考慮到索引及結果集的關係了 ,另外 in 時不對 NULL 進行處理。相關實例和詳細解析可參考:SQL 中 in 和 exists 區別。
15. case 表達式
case 表達式爲SQL條件選擇語句,參考牛客網實例:case 表達式。