《SQL基礎教程》簡要總結
偶然間從朋友那看到了這本書(《SQL基礎教程》MICK著),感覺還不錯,於是花了4個小時認真的過了一遍,在這裡簡單的總結一下要點(個人觀點)
基礎知識點
- SQL不區分關鍵字的大小寫
- 推薦參考阿里的MySQL規約
- SQL語句中表示字串用單引號
'
將字元括起來 - 修改表名
- PostgreSQL:
ALTER TABLE oldname RENAME TO newname
- Mysql:
RENAME TABLE oldname TO newname
- PostgreSQL:
- SQL註釋
--
:單行註釋,即--
加上半形空格/* */
:可進行多行註釋
NOT
運算子- 不建議用
...... where not xxx>0
- 不建議用
AND
運算子的優先順序高於OR
- SQL中的邏輯運算是
三值邏輯
,即真、假和不確定(NULL) - 聚合函式會預設將NULL值排除
count(*)
:查詢的是包含NULL在內的全部資料行數count(1)
或者count(column_name)
:不包含NULL在內的資料行數sum(column_name)
:column_name
為NULL或為零,其計算效果是一樣的avg(column_name)
:NULL值和零值,其計算效果是不一樣的(分母不一樣)- 聚合函式可以在SELECT子句、HAVING子句和ORDER BY子句中使用
- COUNT等函式對錶中的資料進行聚合操作時,DBMS內部會先進行排序處理
GROUP BY
子句的聚合結果是無序的
ORDER BY
字句中可以使用SELECT字句中已定義的列的別名- 可使用SELECT子句中未出現的列或者聚合函式
- ORDER BY 子句中不建議使用編號(將來會被編號會被取消)
- 兩個詞:
INSERT INTO
,DELETE FROM
,UPDATE SET
,DROP TABLE
UPDATE tblname SET (name1, name2, name3) = (Name1, Name2, Name3) WHERE ......
UPDATE tblname SET name1 = Name11, name2 = Name12 WHERE ......
- 事務是需要在同一個處理單元中執行的一系列更新處理的集合
BEGIN TRANSCATION
,START TRANSCATION
(mysql),COMMIT;
- ACID
- Atomicity
- Consistency:滿足約束
- Isolation: 不同事務間不相干擾
- Durability
- 檢視的定義中不能包含
ORDER BY
子句 - 標量子查詢就是返回單一值的子查詢
- scalar subquery,即返回一行一列的結果
- 標量子查詢的位置可以是在SELECT子句、GROUP BY子句、HAVING子句、ORDER BY子句、WHERE字句等地方
- 字串拼接函式
||
在SQL和MySQL中無法使用,等價的函式是CONCAT(str1, str2, str3)
LENGTH(str1)
SUBSTRING(str1 FROM 3 FOR 2)
:擷取字串str1中第三位和第四位字元(字元位置從1開始)
EXTRACT(日期元素 FROM 日期)
EXTRACT(YEAR FROM CURRENT_TIMESTAMP)
- 型別轉換函式:
CAST(xx AS yy)
- NULL值轉換函式:
COALESCE(str1, str2, str3)
會返回可變引數中左側開始第一個不是NULL的值 - 謂詞
LIKE
:%
,_
EXIST
,NOT EXIST
- CASE表示式
- 簡單的CASE表示式:
CASE 表示式 WHEN ... THEN ... END
- 搜尋CASE表示式:
CASE WHEN ... THEN ... WHEN THEN ... END
- 簡單的CASE表示式:
- 集合運算
UNION
:可以使用任何一個select語句,但order by字句只能在最後使用UNION ALL
不會消除重複行INTERSET
:求交集EXCEPT
:求差集
- JOIN
- 內連線:
INNER JOIN
- 外連線:
OUTER JOIN
選擇主表 - 交叉連線:
CROSS JOIN
-- 笛卡爾積
- 內連線:
視窗函式
視窗函式:OLAP(OnLine Analytical Processing)函式,對資料庫資料進行實時分析處理,如市場分析、財務報表、建立計劃等; 可以進行排序、生成序列等一般的聚合函式無法實現的高階操作
- 語法
<視窗函式> OVER ([PARTITION BY <列清單>] ORDER BY <排序清單>)
- PARTITION BY 對錶的橫向進行分組
- ORDER BY 決定縱向的排序規則
- PARTITION BY 分組後的記錄集合成為“視窗”
- 專用視窗函式
RANK
: 計算排序時,如果存在相同位次的記錄,則會跳過之後的位次DENSE_RANK
: 即使存在相同的位次記錄,也不回跳過之後的位次ROW_NUMBER
: 賦予唯一的連續位次- 專用視窗函式無序引數,故括號都是空的
- 聚合函式作為視窗函式使用
- SUM, AVG, COUNT, MIN, MAX等 都是進行
累計
統計的,和GROUP BY 不同
- SUM, AVG, COUNT, MIN, MAX等 都是進行
- 指定框架(統計範圍)
AVG(col1) OVER (ORDER BY col2 ROWS 2 PRECEDING)
- 使用了
ROWS
和PRECEDING
關鍵字制定了框架,即統計物件先定位“截止到之前2行” AVG(col1) OVER (ORDER BY col2 ROWS 2 FOLLOWING)
“截止到之後~行”
- OVER 字句中的 ORDER BY 只是用來決定視窗函式按照什麼順序進行計算的,對最後結果的排序沒有影響!
GROUPING 運算子
- GROUPING運算子可以同時計算出
小計值
、合計值
ROLL UP
同時計算出合計值和小計值GROUP BY ROLL UP(col1, col2)
, 在MySQL中要改寫為GROUP BY col1 with ROLLUP
- 上述語句即相當於
GROUP BY ()
(超級分組記錄)和GROUP BY (col1)
和GROUP BY (col1, col2)
的結果
GROUPING
函式 可判斷超級分組記錄中的NULL值GROUPING(col1)
如果col1是超級分組記錄所產生的NULL值時返回1, 其他返回0
CUBE
即將GROUP BY子句中聚合鍵
的所有“可能組織”的聚合結果集中到一個結果中GROUPING SETS
可以從 ROLLUP或者CUBE的記過中取出部分記錄- 不想得到
合計記錄和使用多個聚合鍵的記錄
時可以使用 GROUP BY GROUPING SETS(col1, col2)
結果集中的每個記錄只包含col1(或col2)的單個合計
- 不想得到
相關文章
- Java基礎集合簡單總結Java
- C++基礎簡單總結C++
- git 簡要總結Git
- 《SQL基礎教程(第2版)》簡單筆記SQL筆記
- SQL基礎教程問題SQL
- Java IO簡要方法總結Java
- JavaScript基礎總結JavaScript
- 安全基礎總結
- VUE基礎總結Vue
- MongoDB基礎總結MongoDB
- 機器學習基礎總結機器學習
- 【HTML——基礎總結】HTML
- 【總結】Javascript基礎JavaScript
- Java基礎總結Java
- jQuery基礎總結jQuery
- sql注入簡單總結SQL
- 我入門 Python 後總結的基礎教程Python
- 《SQL基礎教程》筆記(3)SQL筆記
- Metasploit漏洞利用基礎教程要出版了
- 資料結構簡單要點總結資料結構
- 連結串列基礎總結
- 《簡明 PHP 教程》04 基礎PHP
- 動態SQL開發基礎和經驗再總結SQL
- JavaScript基礎總結(三)——陣列總結JavaScript陣列
- 最全JavaScript基礎總結JavaScript
- 【Python】基礎總結Python
- JavaScript基礎總結(二)JavaScript
- 最全Drawable基礎總結
- html基礎總結版HTML
- java基礎總結一Java
- C++基礎總結C++
- 【多執行緒總結(一)-基礎總結】執行緒
- 《MySQL 8 DBA基礎教程》簡介MySql
- 關於vue基礎總結Vue
- 前端基礎 — Web事件總結前端Web事件
- 9Java基礎總結Java
- JVM 基礎面試題總結JVM面試題
- hive基礎總結(面試常用)Hive面試