函數與關鍵字
用法 | 說明 |
---|---|
round(x, n) | 四舍五入,x為浮點數,n為保留的位數 |
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
truncate(x, n) | 截斷x,n為保留的位,該位之后的數值置零,位數表示示例:321.123,其中小數點前用負值表示,小數點位數為0,即 truncate(x, 0) 等同于舍棄小數部分取整 |
mod(a, b) | 返回 a 除以 b 的余數 |
abs(x) | 返回 x 的絕對值 |
rand() | 返回 0-1 的隨機浮點數 |
sign(x) | 返回數值的符號,1、-1或者0 |
avg(column) | 返回字段或數組切片的均值 |
var_pop(column) | 返回字段或數組切片的總體方差 |
var_samp(column) | 返回字段或數組切片的樣本方差(計算方法不同) |
std(column) | 總體標準差 |
stddev_samp(column) | 樣本標準差 |
replace(str, a, b) | 將字符串中的 a 替換為 b(從頭開始檢索,替換所有存在的片段) |
concat(a, b) | 合并字符串(不能直接 a + b)(接受多個參數,按順序合并) |
concat_ws(fill, a, b) | 合并并在兩者之間填充 fill 片段 |
left(str, n) / right(str, n) | 左起 / 右起取 n 個字符 |
substring(str, x, n) | 左起 x 位(含)取 n 個字符 |
ltrim / rtrim / trim(str) | 去除 左 / 右 / 兩邊的空格 |
repeat(str, n) | 重復 n 次 |
char_length(str) / length(str) | 返回字符數 / 字節數(mysql 中中文字符默認 3 字節) |
coalesce(column, value) | 使用 value 填充字段 column 中的空值 |
cast(column as dtype) | 將 column 字段的數據類型轉換為 dtype(如 char) |
convert(column, dtype) | 同上 |
now() | 返回當前的年月日時分秒,默認格式為"%Y-%m-%d %h:%i:%s" |
year/month/day/hour/minute/second(x) | 依次返回 x 中包含的年/月/日/時/分/秒 |
date(time)/time(x) | 返回 x 中的日期/時間 |
weekofyear(x)/dayofweek(x) | 顧名思義,注意每周以周日為第 0 天,周一為第 1 天 |
date_format(x, format) | format 可以是 “%Y-%m-%d”,或者"%w"(返回周幾) |
date_add/date_sub(x, interval n unit) | x前移或后移一段時間,n 為數值,unit 為 year、month、day 等關鍵字 |
date_diff(a, b) | 兩個時間日期的差值 |
select * INTO OUTFILE filename from tablename; | 輸出到文件,默認在安裝目錄的 Data 文件夾 |
select * from tablename LIMIT n, m | 從 n 行開始(含)取 m 行 |
select … where column LIKE “%str%” | 匹配字符串,用 % 表示任意數量的任意字符,用 - 表示單個任意字符 |
select … where column REGEXP “regexp” | 類似 LIKE,使用正則表達式,更精準的匹配 |
select … IF(condition, true_value, false_value) from table | 條件賦值 |
select … CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 … ELSE last_value END from table | 多個條件匹配賦值 |
面試問題
1. 規范化與反規范化
規范化(Normalization)是通過組織數據庫的字段和表來最小化冗余和依賴性的過程。規范化的主要目的是添加、刪除或修改可以在單個表中進行的字段。
反規范化(Denormalization)是一種用于從數據庫的高范式到低范式訪問數據的技術。這也是通過合并相關表中的數據將冗余引入到表中的過程。
2. 規范化的 5 中范式(Normal Form)
1NF
:從表中刪除所有重復的列。創建相關數據表并識別唯一列。2NF
:滿足第一范式的所有要求。將數據子集放置在單獨的表中并使用主鍵在表之間創建關系。3NF
:滿足 2NF 的所有要求。刪除不依賴于主鍵約束的列。4NF
:滿足第三范式的所有要求,并且不應該具有多值依賴。5NF
:滿足第四范式,且表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。
3. 索引的三種類型
索引是一種性能優化方法,可以更快地從表中檢索記錄。索引為每個值創建一個條目,檢索數據會更快
- 唯一索引:如果列是唯一索引的,則此索引不允許字段具有重復值。當定義主鍵時,可以自動應用唯一索引。
- 聚集索引:這種類型的索引重新排序表的物理順序并根據鍵值進行搜索。每個表只能有一個聚集索引。
- 非聚集索引:非聚集索引不會改變表的物理順序并保持數據的邏輯順序。每個表可以有 999 個非聚集索引。
區別:聚集索引用于通過改變記錄的存儲方式來輕松地從數據庫中檢索數據。數據庫按設置為聚集索引的列對行進行排序。非聚集索引不會改變其存儲方式,而是在表中創建一個完全獨立的對象。搜索后它指向原始表行。
4. 什么是游標?
數據庫游標是一種可以遍歷表中的行或記錄的控件。這可以被視為指向一組行中的一行的指針。游標對于檢索、添加和刪除數據庫記錄等遍歷非常有用。
5. 什么是觸發器?
數據庫觸發器是自動執行以響應數據庫中的表或視圖上的某些事件的代碼或程序。主要是觸發器有助于維護數據庫的完整性。觸發器允許您在對特定表執行插入、更新或刪除命令時執行一批 SQL 代碼。實際上,觸發器是特殊類型的存儲過程,被定義為就地或數據修改后自動執行。
示例:當新學生添加到學生數據庫時,應在相關表(如考試、分數和出勤表)中創建新記錄。
6. 什么是局部變量和全局變量以及它們的區別?
局部變量是可以在函數內部使用或存在的變量。其他函數不知道它們,并且無法引用或使用這些變量。每當調用該函數時都可以創建變量。
全局變量是可以在整個程序中使用或存在的變量。在全局中聲明的相同變量不能在函數中使用。每當調用該函數時都無法創建全局變量。
7. 什么是自增?
自動增量關鍵字允許用戶創建一個在將新記錄插入表中時生成的唯一編號。Oracle 中可以使用 AUTO INCREMENT 關鍵字,SQL SERVER 中可以使用 IDENTITY 關鍵字。大多數情況下,只要使用 PRIMARY KEY,就可以使用此關鍵字。
8. 什么是數據倉庫?
數據倉庫是來自多個信息源的數據的中央存儲庫。這些數據經過整合、轉換并可用于挖掘和在線處理。倉庫數據有一個數據子集,稱為數據集市。
9. 存儲過程的優點和缺點?
存儲過程可以用作模塊化編程——意味著創建一次、存儲并在需要時多次調用。這支持更快的執行而不是執行多個查詢。這減少了網絡流量并為數據提供了更好的安全性。缺點是只能在數據庫中執行,占用數據庫服務器較多的內存。
10. 什么是在線事務處理(OLTP)?
在線事務處理或 OLTP 管理基于事務的應用程序,可用于數據輸入和輕松的數據檢索處理。這種處理使得簡單性和效率變得更容易。與 OTLP 相比,它更快、更準確的結果和費用。(示例 – 每天的銀行交易)
11. SQL支持編程嗎?
不,SQL 沒有循環或條件語句。它像命令語言一樣用于訪問數據庫。
12. 什么是數據庫的 ACID 屬性?
ACID 是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
ACID 屬性用于確保數據事務在數據庫系統中得到可靠處理。對數據的單個邏輯操作稱為事務。
- 原子性:要求每筆交易要么全有,要么全無。這意味著如果事務的一部分失敗,則整個事務失敗并且數據庫狀態保持不變。
- 一致性:一致性屬性確保數據必須滿足所有驗證規則。簡而言之,您可以說您的事務在未完成其狀態的情況下永遠不會離開數據庫。
- 隔離性:該屬性確保不滿足執行的并發性。提供隔離的主要目標是并發控制。
- 持久性:持久性僅僅意味著一旦事務被提交,它將保持不變,甚至可能出現斷電、崩潰或錯誤。