文章目錄
基礎
- 模式定義了數據如何存儲、存儲何種數據以及數據如何分解等信息,數據庫和表都有模式。
- 主鍵的值不允許修改,也不允許複用(不能使用已經刪除的主鍵值賦給新數據行的主鍵)。
- SQL(Structured Query Language),標準 SQL 由 ANSI 標準委員會管理,從而稱爲 ANSI SQL
- 各個 DBMS 都有自己的實現,如 PL/SQL、Transact-SQL 等。
- SQL 語句不區分大小寫,但是數據庫表名、列名和值是否區分依賴於具體的 DBMS 以及配置
創建和修改表
增刪改查
增加
修改
刪除
查詢
distinct和limit
排序與過濾
排序
SELECT *
FROM mytable
ORDER BY col1 DESC, col2 ASC;
過濾
- AND和OR用於連接多個過濾條件,優先處理AND,可食用()來決定優先級
通配符(❤)
- 只能用於文本字段
- % 匹配 >=0 個任意字符;
- _ 匹配 ==1 個任意字符;
- 可以匹配集合內的字符,例如 [ab] 將匹配字符 a 或者 b。用脫字符 ^ 可以對其進行否定,也就是不匹配集合
內的字符。 - 使用 Like 來進行通配符匹配
計算字段
- as關鍵字與concat連接兩個字段
函數
文本處理
日期時間處理
- 日期格式:YYYY-MM-DD
- 時間格式:HH:MM:SS
## 科學數據計算
分組
- 分組就是把具有相同的數據值的行放在同一組中。
- 可以對同一組數據使用匯總函數進行處理,例如求分組數據的平均值等。
- 指定的分組字段除了能按該字段進行分組,也會自動按該字段進行排序
- 大多數 SQL 實現不支持 GROUP BY 列具有可變長度的數據類型
子查詢
連接
- 連接用於連接多個表,使用 JOIN 關鍵字,並且條件語句使用 ON 而不是 WHERE。
- 連接可以替換子查詢,並且比子查詢的效率一般會更快。
- 可以用 AS 給列名、計算字段和表名取別名,給表名取別名是爲了簡化 SQL 語句以及連接相同表
內連接
自連接
- 自連接可以看成內連接的一種,只是連接的表是自身而已。
- 一張員工表,包含員工姓名和員工所屬部門,要找出與 Jim 處在同一部門的所有員工姓名
自然連接
外連接
組合查詢
視圖
- 視圖是虛擬的表,本身不包含數據,也就不能對其進行索引操作
- 對視圖的操作和對普通表的操作一樣。
- 視圖好處:
- 簡化SQL 操作,比如複雜的連接;
- 只使用實際表的一部分數據
- 通過只給用戶訪問視圖的權限,保證數據的安全性
- 更改數據格式和表示
存儲過程(?)
- 存儲過程可以看成是對一系列 SQL 操作的批處理
- 使用存儲過程的好處:
- 代碼封裝,保證了一定的安全性;
- 代碼複用;
- 由於是預先編譯,因此具有很高的性能。
- 命令行中創建存儲過程需要自定義分隔符,因爲命令行是以 ; 爲結束符,而存儲過程中也包含了分號,因此會錯誤把這部分分號當成是結束符,造成語法錯誤。
- 包含 in、out 和 inout 三種參數。
- 給變量賦值都需要用 select into 語句。
- 每次只能給一個變量賦值,不支持集合的操作
遊標(?)
- 在存儲過程中使用遊標可以對結果集進行移動遍歷。
- 遊標主要用於交互式應用,其中用戶需要對數據集中的任意行進行瀏覽和修改。
- 使用遊標的四個步驟:
- 聲明遊標,這個過程沒有實際檢索出數據;
- 打開遊標;
- 取出數據;
- 關閉遊標;
事務處理
- 基本術語:
- 事務(transaction)指一組 SQL 語句;
- 回退(rollback)指撤銷指定 SQL 語句的過程;
- 提交(commit)指將未存儲的 SQL 語句結果寫入數據庫表;
- 保留點(savepoint)指事務處理中設置的臨時佔位符(placeholder),你可以對它發佈回退(與回退整個事務處理不同)。
- 不能回退 SELECT 語句,回退 SELECT 語句也沒意義;也不能回退 CREATE 和 DROP 語句。
- MySQL 的事務提交默認是隱式提交,每執行一條語句就把這條語句當成一個事務然後進行提交。
- 當出現 STARTTRANSACTION 語句時,會關閉隱式提交
- 當 COMMIT 或 ROLLBACK 語句執行後,事務會自動關閉,重新恢復隱式提交
- 通過設置 autocommit 爲 0 可以取消自動提交;autocommit 標記是針對每個連接而不是針對服務器的。
- 如果沒有設置保留點,ROLLBACK 會回退到 START TRANSACTION 語句處;如果設置了保留點,並且在 ROLLBACK中指定該保留點,則會回退到該保留點
START TRANSACTION
// ...
SAVEPOINT delete1
// ...
ROLLBACK TO delete1
// ...
COMMIT
字符集
權限管理
- myuser是賬戶名