1. 程式人生 > >《SQL基礎教程》讀書小記

《SQL基礎教程》讀書小記

看了《SQL進階教程》之後,感覺很不錯,趁618入手了這本《SQL基礎教程》,希望有什麼可以讓人眼前一亮的知識。

  • 將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合稱為資料庫。
  • DCL(Data Control Language,資料控制語言)用來確認或者取消對資料庫中的資料進行的變更。比如:COMMITROLLBACKGRANTREVOKE
  • 列的資料型別是CHAR型,字串以定長字串的形式儲存在被指定為CHAR型的列中。所謂定長字串,就是當列中儲存的字串長度達不到最大長度的時候,使用半形空格進行補足。
  • VARCHAR型是可變長字串
  • 在使用DISTINCT時,NULL
    也被視為一類資料,NULL存在於多行中時,也會被合併為一條NULL資料。
  • DISTINCT關鍵字只能用在查詢的第一個列名之前。
  • 算術運算子有NULL時,結果都是NULL。比如NULL/0不會發生錯誤,結果是NULL
  • 比較字串以字典順序進行比較。
  • 用於彙總的函式稱為聚合函式聚集函式,就是將多行彙總為一行。
  • 不使用GROUP BY子句時,是將表中的所有資料作為一組來對待的。
  • 把聚合鍵之外的列名書寫在SELECT子句之中會出現錯誤,MYSQL除外。
  • 實際上,只有SELECT子句和HAVING子句,以及ORDER BY子句中能使用COUNT等聚合函式。(執行順序在GROUP BY之後的)
  • HAVING
    子句中能夠使用的3種要素是:①常數;②聚合函式;③GROUP BY子句中指定的列名(即聚合鍵)。都是對組來說是唯一值得。
  • 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沒有;事務的結束語句都是:COMMITROLLBACK
  • 實際上,幾乎所有的資料庫產品的事務都無需開始指令。這是因為大部分情況下,事務在資料庫連線建立時就已經悄悄開始了,並不需要使用者再明確發出開始指令。例如,使用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中的每個單獨聚合鍵彙總結果。