SQL基礎(chǔ)

來源: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)
    image.png

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ì)大大下降栋盹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敷矫,隨后出現(xiàn)的幾起案子例获,更是在濱河造成了極大的恐慌,老刑警劉巖曹仗,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨汤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怎茫,警方通過查閱死者的電腦和手機(jī)收壕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轨蛤,“玉大人蜜宪,你說我怎么就攤上這事∠樯剑” “怎么了圃验?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缝呕。 經(jīng)常有香客問我澳窑,道長(zhǎng)斧散,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任照捡,我火速辦了婚禮颅湘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栗精。我一直安慰自己闯参,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布悲立。 她就那樣靜靜地躺著鹿寨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪薪夕。 梳的紋絲不亂的頭發(fā)上脚草,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音原献,去河邊找鬼馏慨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姑隅,可吹牛的內(nèi)容都是我干的写隶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼讲仰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慕趴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鄙陡,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤冕房,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后趁矾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耙册,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年毫捣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了详拙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡培漏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胡本,到底是詐尸還是另有隱情牌柄,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布侧甫,位于F島的核電站珊佣,受9級(jí)特大地震影響蹋宦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒锻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一冷冗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惑艇,春花似錦蒿辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恭取,卻和暖如春泰偿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜈垮。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工耗跛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒发。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓调塌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晨继。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烟阐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容