【SQL】以mysql為例系統(tǒng)學(xué)習(xí)DQL理論知識
1、思維導(dǎo)圖-知識體系
一、sql是什么?一種計(jì)算機(jī)語言,一種操作數(shù)據(jù)庫的結(jié)構(gòu)化查詢語言
SQL 是關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,所有的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),比如 MySQL、、SQL
二、數(shù)據(jù)庫是什么?大量數(shù)據(jù)的集合,按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫
數(shù)據(jù)庫的分類:1、關(guān)系型數(shù)據(jù)庫、2、非關(guān)系型數(shù)據(jù)庫
1、關(guān)系型數(shù)據(jù)庫,存儲的格式可以直觀地反映實(shí)體間的關(guān)系。關(guān)系型數(shù)據(jù)庫和常見的表格比較相似sql語言和數(shù)據(jù)庫有什么關(guān)系,數(shù)據(jù)以行和列的方式進(jìn)行存儲
2、非關(guān)系型數(shù)據(jù)庫(NoSQL):對于非結(jié)構(gòu)化海量的數(shù)據(jù)的處理更合適sql語言和數(shù)據(jù)庫有什么關(guān)系,大量的NoSql數(shù)據(jù)庫如、Redis;通常以數(shù)據(jù)集的方式,大量的數(shù)據(jù)集中存儲在一起,類似于鍵值對、圖結(jié)構(gòu)或者文檔。
2、數(shù)據(jù)庫相關(guān)操作-查詢 2.1、單一簡單查詢
2.2、復(fù)雜數(shù)據(jù)庫查詢(重點(diǎn))
重點(diǎn):join操作(mysql的sql為例)
https://blog.csdn.net/qq_45911678/article/details/123682784
2.3、單一的SQL語句執(zhí)行過程理解
一個(gè)簡單sql語句一般包含的關(guān)鍵字以及執(zhí)行順序如下圖所示:
(8)SELECT (9)DISTINCT
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>

(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
(11)LIMIT <limit_number>
(1)from我需要知道我從哪個(gè)表里獲取數(shù)據(jù),如果from中包含多個(gè)表,則所有表執(zhí)行笛卡爾積(交叉鏈接)如下圖1所示。形成一個(gè)虛擬表1
(2)on這一步需要對虛擬表1 進(jìn)行篩選,一般就是兩個(gè)表的連接條件具有一個(gè)列,然后列值對應(yīng),然后只有那些使<join_condition>為真的行記錄才被插入虛擬表2
(3)join要看<join_type>形成保留表:(preserved table:左外部聯(lián)接把左表標(biāo)記為保留表,右外部聯(lián)接把右表標(biāo)記為保留表,完全外部聯(lián)接把兩個(gè)表都標(biāo)記為保留表)
把保留表中未找到匹配的行將作為外部行添加到 虛擬表2 形成虛擬表3
注:如果FROM子句包含兩個(gè)以上的表,則對上一個(gè)聯(lián)接生成的結(jié)果表和下一個(gè)表重復(fù)執(zhí)行步驟1到步驟3,
直到處理完所有的表數(shù)據(jù)。
(4)where用一些條件篩選虛擬表3 ,只有使<where_condition>為true的行才被插入 虛擬表4

(5)GROUP BY:按GROUP BY子句中的某一或者多個(gè)列的類型對虛擬表4中的行分組,對于同一類型列的其他列需要進(jìn)行執(zhí)行count聚合、max函數(shù)聚合等 形成虛擬表5
分組:如果是多個(gè)列類型進(jìn)行分組操作,這里把某一列和另一列看成一個(gè)整體,例如:把名字和成績看成一個(gè)整體,只要是name相同,grade不同,就不同的類型,也就是兩條記錄
(6)高級分組/超組:看參考資料
(7)SELECT:處理SELECT列表,就是需要展示虛擬表5的哪幾列 形成虛擬表6
并且,group by 操作的字段列必須包含在select后面;
同時(shí),從這一步開始,后面的語句中都可以使用SELECT中的別名。
(8)HAVING:對虛擬表5應(yīng)用HAVING篩選器。HAVING是過濾聚合值,WHERE 關(guān)鍵字無法與聚合函數(shù)一起使用;只有使<having_condition>為 true 的組的記錄才會(huì)被插入虛擬表7
(9)DISTINCT:(用distinct來返回不重復(fù)單字段或者多字段組合的條數(shù))將重復(fù)的行從虛擬表7中移除
(10)Order by把查詢出來的結(jié)果進(jìn)行一個(gè)默認(rèn)升序asc,降序排列desc,即order by;

如果根據(jù)一個(gè)列排序,那么按照字母順序或者數(shù)字順序;如果按照多個(gè)列排序,按照順序,先一列,在此列中在按某中順序排其他列,保持第一列順序不變;如圖實(shí)例2所示
注:order by 生成的不是虛擬表了,而是游標(biāo):
這一步是第一步也是唯一 一步可以使用SELECT列表中的列別名的步驟。
這一步不同于其它步驟的 是,它不返回有效的表,而是返回一個(gè)游標(biāo)。
SQL是基于集合理論的。
集合不會(huì)預(yù)先對它的行排序,它只是成員的邏輯集合,成員的順序無關(guān)緊要。
對表進(jìn)行排序 的查詢可以返回一個(gè)對象,包含按特定物理順序組織的行。
ANSI把這種對象稱為游標(biāo)。
(11)limit做一個(gè)限制就行,也就是limit
參考資料:
http://ty2y.com/study/sqlyjzhbzxj.html
分組操作理解:
https://www.cnblogs.com/YH-shjd-senvn/p/15890258.html
高級分組(超組(Suppergroups)):
https://www.cnblogs.com/marxist/p/12149863.html
去重distinct
https://blog.csdn.net/shenziheng1/article/details/102536146
重點(diǎn):join操作(mysql的sql為例)
https://blog.csdn.net/qq_45911678/article/details/123682784
3、擴(kuò)展:Mysql結(jié)構(gòu)