來源:https://github.com/v-DavidTang/StudyNotes/blob/master/SQL/sql_study_notes.md
廖雪峰:https://www.liaoxuefeng.com/wiki/1177760294764384
SQL簡(jiǎn)介
SQL = Structured Query Language,訪問和處理關(guān)系數(shù)據(jù)庫(kù)的計(jì)算機(jī)標(biāo)準(zhǔn)語言
總的來說债朵,SQL語言定義了這么幾種操作數(shù)據(jù)庫(kù)的能力:
-
DDL:Data Definition Language
DDL允許用戶定義數(shù)據(jù)疏唾,也就是創(chuàng)建表擎椰、刪除表布朦、修改表結(jié)構(gòu)這些操作臀突。通常,DDL由數(shù)據(jù)庫(kù)管理員執(zhí)行储玫。 -
DML:Data Manipulation Language
DML為用戶提供添加岖常、刪除驯镊、更新數(shù)據(jù)的能力,這些是應(yīng)用程序?qū)?shù)據(jù)庫(kù)的日常操作竭鞍。 -
DQL:Data Query Language
DQL允許用戶查詢數(shù)據(jù)板惑,這也是通常最頻繁的數(shù)據(jù)庫(kù)日常操作。
數(shù)據(jù)庫(kù)類別
- 關(guān)系型數(shù)據(jù)庫(kù)(SQL)
- 非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)
MongoDB, Cassandra, Dynamo
關(guān)系模型
主鍵
主鍵是關(guān)系表中記錄的唯一標(biāo)識(shí)偎快。選取主鍵的一個(gè)基本原則是:不使用任何業(yè)務(wù)相關(guān)的字段作為主鍵洒放。
ALTER TABLE <student>
ADD CONSTRAINT <pk_id>
PRIMARY KEY (<id>);
外鍵
外鍵是用來關(guān)聯(lián) 2 個(gè)表結(jié)構(gòu)的,表直接的約束分為以下 3 種:
1.一對(duì)一
2.一對(duì)多 - 外鍵建立在‘多’的表中(即從表)
3.多對(duì)多 - 需要建立中間表
- 創(chuàng)建外鍵
ALTER TABLE <student>
ADD CONSTRAINT <fk_class_id>
FOREIGN KEY (<class_id>)
REFERENCES classes (<id>);
- 刪除外鍵
ALTER TABLE <students>
DROP FOREIGN KEY <fk_class_id>;
索引
索引是關(guān)系數(shù)據(jù)庫(kù)中對(duì)某一列或多個(gè)列的值進(jìn)行預(yù)排序的數(shù)據(jù)結(jié)構(gòu)滨砍。通過使用索引往湿,可以讓數(shù)據(jù)庫(kù)系統(tǒng)不必掃描整個(gè)表妖异,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度领追。
ALTER TABLE <students>
ADD INDEX <idx_name_score> (<name>, <score>);
- 唯一索引
ALTER TABLE <students>
ADD UNIQUE INDEX <uni_name> (<name>);
約束
根據(jù)業(yè)務(wù)要求他膳,像身份號(hào)、手機(jī)號(hào)绒窑、郵箱地址等棕孙,它們具有業(yè)務(wù)含義不易作為主鍵,但是又具有唯一性:即不能出現(xiàn)兩條記錄存儲(chǔ)了同一個(gè)身份證號(hào)些膨。這個(gè)時(shí)候蟀俊,就可以給該列添加一個(gè)唯一約束。
ALTER TABLE <students>
ADD CONSTRAINT <uni_name>
UNIQUE (<name>);
SQL 查詢
不帶 FROM
子句的 SELECT
語句有一個(gè)有用的用途订雾,就是用來判斷當(dāng)前到數(shù)據(jù)庫(kù)的連接是否有效肢预。許多檢測(cè)工具會(huì)執(zhí)行一條 SELECT 1
; 來測(cè)試數(shù)據(jù)庫(kù)連接。
1.基本查詢 - SELECT * FROM <students>
2.條件查詢 - SELECT * FROM <students> WHERE id = 1
3.投影查詢 - SELECT id, name FROM <students>
4.排序 - SELECT * FROM <students> ORDER BY id DESC
注意: OREDER BY
要在 WHERE
條件后
5.分頁查詢 - SELECT * FROM <students> LIMIT <10> OFFSET <0>
注:pageIndex
從 1 開始洼哎,而 OFFSET
從 0 開始;
LIMIT
總是設(shè)定為pageSize
烫映;
OFFSET
計(jì)算公式為pageSize * (pageIndex - 1)
。
6.聚合查詢 聚合函數(shù) -COUNT(), SUM(), AVG(), MAX(), MIN()
通過 GROUP BY
進(jìn)行分組 SELECT <class_id>, <gender>, COUNT(*) num FROM <students> GROUP BY <class_id>, <gender>
;
7.多表查詢 - SELECT * FROM <students>, <classes>
; 獲得的集合為 A 表行數(shù) * B 表行數(shù)
8.連接查詢
- 內(nèi)連接(INNER JOIN)
-
外連接(OUTER JOIN):左連接(LEFT OUTER JOIN)噩峦,右連接(RIGHT OUTER JOIN)锭沟,全連接(FULL OUTER JOIN)
SQL 修改
關(guān)系數(shù)據(jù)庫(kù)的基本操作就是增刪改查,即 CRUD:Create识补、Retrieve族淮、Update、Delete
凭涂。
對(duì)于增瞧筛、刪、改导盅,對(duì)應(yīng)的SQL語句分別是:
-
INSERT:插入新記錄 -
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...)
; -
UPDATE:更新已有記錄 -
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...
; -
DELETE:刪除已有記錄 -
DELETE FROM <表名> WHERE ...
;
常用SQL語句
數(shù)據(jù)庫(kù) + 表操作 SQL 語句
SQL 語句 | 含義 |
---|---|
SHOW DATABASES | 列出所有數(shù)據(jù)庫(kù) |
CREATE DATABASE <database_name> | 創(chuàng)建數(shù)據(jù)庫(kù) |
DROP DATABASE <database_name> | 刪除數(shù)據(jù)庫(kù) |
USE <database_name> | 切換當(dāng)前數(shù)據(jù)庫(kù) |
SHOW TABLES | 列出所有表 |
DESC <table_name> | 查看表結(jié)構(gòu) |
SHOW CREATE TABLE <table_name> | 查看創(chuàng)建表的 SQL 語句 |
DROP TABLE <table_name> | 刪除表 |
ALTER TABLE <table_name> ADD COLUMN <column_name> VARCHAR(10) NOT NULL | 新增列 |
ALTER TABLE <table_name> CHANGE COLUMN <column_name> VARCHAR(20) NOT NULL | 修改列屬性 |
ALTER TABLE <table_name> DROP COLUMN <column_name> | 刪除列 |
EXIT | 退出 MYSQL連接 |
實(shí)用 SQL 語句
-
插入或替換
REPLACE INTO <students> (<id>, <class_id>, <...>) VALUES(<1>, <1>, <...>)
若id=1
記錄不存在,插入新紀(jì)錄揍瑟; 若id=1
記錄存在白翻,當(dāng)前id=1
記錄被刪除,然后再插入新紀(jì)錄绢片。 -
插入或更新
INSERT INTO <students> (<id>, <class_id>, <name>, <...>) VALUES(<1>, <1>, <'xiao_min'>, <...>) ON DUPLICATE KEY UPDATE <name>=<'xiao_min'>, <...>
; 若id=1
記錄不存在滤馍,插入新紀(jì)錄; 若id=1
記錄存在底循,當(dāng)前id=1
記錄被更新巢株,更新字段有UPDATE
指定。 -
插入或忽略
INSERT IGNORE INTO <students> (<id>, <class_id>, <...>) VALUES(<1>, <1>, <...>)
; 若id=1
記錄不存在熙涤,INSERT
語句將插入新記錄阁苞,否則困檩,不執(zhí)行任何操作。 -
快照
CREATE TABLE <students_of_class1> SELECT * FROM <students> WHERE <class_id>=<1>
; 通過查詢集合創(chuàng)建新表
事務(wù)操作
多條語句作為一個(gè)整體進(jìn)行操作的功能那槽,被稱為數(shù)據(jù)庫(kù)事務(wù)悼沿。數(shù)據(jù)庫(kù)事務(wù)可以確保該事務(wù)范圍內(nèi)的所有操作都可以全部成功或者全部失敗。如果事務(wù)失敗骚灸,那么效果就和沒有執(zhí)行這些 SQL 一樣糟趾,不會(huì)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)有任何改動(dòng)。
- BEGIN: 開啟一個(gè)事務(wù)
- COMMIT: 提交一個(gè)事務(wù)
- ROLLBACK: 回滾事務(wù)
隔離級(jí)別
-
臟讀 DIRTY READ: 查詢同一記錄甚牲,2 次結(jié)果不一樣义郑,讀到還未
commit
的數(shù)據(jù)結(jié)果; -
不可重復(fù)讀 NON REPEATABLE READ: 查詢同一記錄丈钙,2 次結(jié)果不一樣非驮,讀到的結(jié)果在另一事務(wù)
commit/rollback
之間; -
幻讀 PHANTOM READ:查詢同一記錄著恩,2 次結(jié)果是一樣院尔,但是會(huì)出現(xiàn) 事務(wù) A 新增的列,事務(wù) B 讀不到(
SELECT
)喉誊,但是卻可以更新(UPDATE
)邀摆,更新后才可以讀到。
隔離水平 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
READ UNCOMMITTED | YES | YES | YES |
READ COMMITTED | - | YES | YES |
Repeatable Read | - | - | YES |
Serializable | - | - | - |
Serializable 雖然隔離級(jí)別最高伍茄,但是效率會(huì)大大下降栋盹。