《SQL基礎教程》讀書小記
阿新 • • 發佈:2019-01-09
看了《SQL進階教程》之後,感覺很不錯,趁618入手了這本《SQL基礎教程》,希望有什麼可以讓人眼前一亮的知識。
- 將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合稱為資料庫。
- DCL(Data Control Language,資料控制語言)用來確認或者取消對資料庫中的資料進行的變更。比如:COMMIT,ROLLBACK,GRANT,REVOKE。
- 列的資料型別是CHAR型,字串以定長字串的形式儲存在被指定為CHAR型的列中。所謂定長字串,就是當列中儲存的字串長度達不到最大長度的時候,使用半形空格進行補足。
- VARCHAR型是可變長字串。
- 在使用DISTINCT時,NULL
- DISTINCT關鍵字只能用在查詢的第一個列名之前。
- 算術運算子有NULL時,結果都是NULL。比如
NULL/0
不會發生錯誤,結果是NULL。 - 比較字串以字典順序進行比較。
- 用於彙總的函式稱為聚合函式或聚集函式,就是將多行彙總為一行。
- 不使用GROUP BY子句時,是將表中的所有資料作為一組來對待的。
- 把聚合鍵之外的列名書寫在SELECT子句之中會出現錯誤,MYSQL除外。
- 實際上,只有SELECT子句和HAVING子句,以及ORDER BY子句中能使用COUNT等聚合函式。(執行順序在GROUP BY之後的)
- HAVING
- SELECT執行的順序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY;這也是為什麼ORDER BY可以使用列的別名的原因。
- 多行INSERT可以同時插入多行資料,但是ORACLE並不支援,ORACLE使用如下實現多行插入:
INSERT ALL INTO table1() VALUES() INTO table2() VALUES() SELECT 1 FROM dual;
INSERT ALL WHEN condition1 THEN INTO table1 VALUES() WHEN condition2 THEN INTO table2 VALUES() SELECT * FROM table
INSERT ALL WHEN condition1 THEN INTO table1 VALUES() ELSE INTO table2 VALUES() SELECT * FROM table
- 事務就是需要在同一個處理單元中執行的一系列更新處理的集合。
- MySQL的事務開始語句是
START TRANSACTION
,ORACLE沒有;事務的結束語句都是:COMMIT
,ROLLBACK
。 - 實際上,幾乎所有的資料庫產品的事務都無需開始指令。這是因為大部分情況下,事務在資料庫連線建立時就已經悄悄開始了,並不需要使用者再明確發出開始指令。例如,使用ORACLE時,資料庫建立連線以後,第一條SQL執行的同時,事務就已經悄悄開始了。
- 通常有兩種模式:①每條SQL就是一個事務。比如MYSQL。②直到使用者執行COMMIT或者ROLLBACK為止算作一個事務。比如ORACLE。所以ORACLE執行了DELETE也可以通過ROLLBACK回滾。
- 事務的一致性:指的是事務中包含的處理要滿足資料庫提前設定的約束。
- 檢視不儲存實際的資料。實際上檢視儲存的是SELECT語句。
- 檢視中的資料會隨著原表的變化自動更新,檢視歸根到底是SELECT語句,所謂“參照檢視”也就是“執行SELECT語句”的意思。
- 多重檢視會降低SQL的效能,應該避免在檢視的基礎上建立檢視。
- 定義檢視時,不要使用ORDER BY。
- 檢視只有滿足以下條件,才能被更新:①SELECT子句中沒有使用DISTINCT。②FROM子句中只有一張表。③未使用GROUP BY子句。④未使用HAVING子句。
- 子查詢就是一張一次性檢視。
- 標量子查詢必須而且只能返回一行一列的結果。就是返回單一值的查詢,所以可以使用
=
,<>
等進行比較。 CAST(轉換前的值 AS 想要轉換的資料型別)
- COALESCE函式會返回可變引數中左側開始第一個不是NULL的值。
- 謂詞的返回值是真值(TRUE、FALSE、UNKNOWN)。
- 內聯結是交叉聯結的一部分,“內”也可以理解為“包含在交叉聯結結果中的部分”。相反,外聯結的“外”可以理解為“交叉聯結結果之外的部分”。
- 視窗函式也稱作OLAP函式,意思是對資料庫資料進行實時分析處理。
- 能夠作為視窗函式使用的函式:①聚合函式(SUM、AVG、COUNT、MAX、MIN)。②RANK、DENSE_RANK、ROW_NUMBER等專用視窗函式。
- PARTITION BY子句並不具備GROUP BY子句的彙總功能。
- 通過PARTITION BY分組後的記錄集合稱為視窗。此處的視窗並非“窗戶”的意思,而是代表範圍。
- 視窗函式只寫在SELECT子句中。在SELECT子句外使用視窗函式是沒有意義的。
- 在DBMS內部,視窗函式是對WHERE子句或者GROUP BY子句處理後的“結果”進行的操作。
- 視窗函式指定範圍:
ROWS n PRECENDING
(從自身往前n行,加上自己一共n+1行),ROWS n FOLLOWING
(從自身往後n行,加上自己一共n+1行),ROWS BETWEEN n PRECENDING AND n FOLLOWING
(自身前後n行,加上自己一共2n+1行)。 - OVER子句中的ORDER BY只是用來決定視窗函式按照什麼樣的順序進行計算的,對結果的排列順序並沒有影響。
ROLLUP
可以同時得出合計和小計。會同時得出①GROUP BY()
②GROUP BY(colum1)
③GROUP BY(colum1,colum2)
…GROUP BY(colum1...column)
的彙總。- 使用
GROUPING
函式能夠簡單地分辨出原始資料中的NULL和超級分組記錄中的NULL。 CUBE
函式是在ROLLUP
的基礎上增加GROUP BY中的每個單獨聚合鍵彙總結果。