後端_數據庫_SQL

SQL基礎語法

概覽

SQL 的兩個標準, SQL92 和 SQL99,分別表明 92 年和 99 年頒佈的 SQL 標準,今天依然遵循這些標準。
按照功能劃分紅如下的 4 個部分:mysql

DDL,英文叫作 Data Definition Language,也就是數據定義語言,它用來定義咱們的數據庫對象,包括數據庫、數據表和列。經過使用 DDL,咱們能夠建立,刪除和修改數據庫和表結構。
DML,英文叫作 Data Manipulation Language,數據操做語言,咱們用它操做和數據庫相關的記錄,好比增長、刪除、修改數據表中的記錄。
DCL,英文叫作 Data Control Language,數據控制語言,咱們用它來定義訪問權限和安全級別。
DQL,英文叫作 Data Query Language,數據查詢語言,咱們用它查詢想要的記錄,它是 SQL 語言的重中之重。

在建立 DBMS 以前:還須要對它進行設計,對於 RDBMS 來講採用的是 ER 圖即實體 - 關係圖的方式進行設計。ER 圖評審經過後,再用 SQL 語句或者可視化管理工具(如 Navicat)建立數據表。
實體 - 關係圖: 用來描述現實世界的概念模型,模型中有 3 個要素:實體、屬性、關係。實體就是咱們要管理的對象,屬性是標識每一個實體的屬性,關係則是對象之間的關係。sql

DMBS數據庫管理系統

數據庫管理系統:DataBase Management System,簡稱DBMS,實際上它能夠對多個數據庫進行管理,能夠理解爲DBMS = 多個數據庫(DB) + 管理程序。
數據庫:DataBase。數據庫是存儲數據的集合,你能夠把它理解爲多個數據表。
數據庫系統:DataBase System。它是更大的概念,包括了數據庫、數據庫管理系統以及數據庫管理人員DBA。
關係型數據庫 絕對是 DBMS 的主流,其中使用最多的 DBMS 分別是 Oracle、MySQL 和 SQL Server。關係型數據庫創建在關係模型基礎上的數據庫,SQL 就是關係型數據庫的查詢語言。
非關係型數據庫:,NoSQL 泛指,包括鍵值型數據庫、文檔型數據庫、搜索引擎和列存儲,圖形數據庫。數據庫

鍵值型數據庫經過 Key-Value 鍵值的方式來存儲數據,其中 Key 和 Value 能夠是簡單的對象,也能夠是複雜的對象。Key 做爲惟一的標識符,優勢是查找速度快,在這方面明顯優於關係型數據庫,同時缺點也很明顯,它沒法像關係型數據庫同樣自由使用條件過濾(好比 WHERE),若是你不知道去哪裏找數據,就要遍歷全部的鍵,這就會消耗大量的計算。鍵值型數據庫典型的使用場景是做爲內容緩存。Redis 是最流行的鍵值型數據庫。
 文檔型數據庫用來管理文檔,在數據庫中文檔做爲處理信息的基本單位,一個文檔就至關於一條記錄,MongoDB 是最流行的文檔型數據庫。
 搜索引擎也是數據庫檢索中的重要應用,常見的全文搜索引擎有 Elasticsearch、Splunk 和 Solr。雖然關係型數據庫採用了索引提高檢索效率,可是針對全文索引效率卻較低。搜索引擎的優點在於採用了全文搜索的技術,核心原理是「倒排索引」。
 列式數據庫是相對於行式存儲的數據庫,Oracle、MySQL、SQL Server 等數據庫都是採用的行式存儲(Row-based),而列式數據庫是將數據按照列存儲到數據庫中,這樣作的好處是能夠大量下降系統的 I/O,適合於分佈式文件系統,不足在於功能相對有限。
 圖形數據庫,利用了圖這種數據結構存儲了實體(對象)之間的關係。最典型的例子就是社交網絡中人與人的關係,數據模型主要是以節點和邊(關係)來實現,特色在於能高效地解決複雜的關係問題。

Oracle 中的 SQL 是如何執行的:

1.png

語法檢查:檢查 SQL 拼寫是否正確,若是不正確,Oracle 會報語法錯誤。
語義檢查:檢查 SQL 中的訪問對象是否存在。好比咱們在寫 SELECT 語句的時候,列名寫錯,系統就會提示錯誤。語法檢查和語義檢查的做用是保證 SQL 語句沒有錯誤。
權限檢查:看用戶是否具有訪問該數據的權限。
共享池檢查:共享池(Shared Pool)是一塊內存池,最主要的做用是緩存 SQL 語句和該語句的執行計劃。Oracle 經過檢查共享池是否存在 SQL 語句的執行計劃,來判斷進行軟解析,仍是硬解析。
在共享池中,Oracle 首先對 SQL 語句進行 Hash 運算,而後根據 Hash 值在庫緩存(Library Cache)中查找,若是存在 SQL 語句的執行計劃,就直接拿來執行,直接進入「執行器」的環節,這就是軟解析。
若是沒有找到 SQL 語句和執行計劃,Oracle 就須要建立解析樹進行解析,生成執行計劃,進入「優化器」這個步驟,這就是硬解析。
優化器:優化器中就是要進行硬解析,也就是決定怎麼作,好比建立解析樹,生成執行計劃。
執行器:當有了解析樹和執行計劃以後,就知道了 SQL 該怎麼被執行,這樣就能夠在執行器中執行語句。

軟解析 :在共享池中,首先對SQL語句進行Hash運算,而後根據Hash值在庫緩存(library cache)中查找,若是存在SQL語句的執行計劃,就直接拿來執行。也就是直接進入到執行器的環節。
共享池 :Oracle中的術語,包括了庫緩存(library cache),數據字典緩衝區等
硬解析 :若是沒有找到SQL語句和執行計劃,就須要本身來建立解析樹進行解析,生成執行計劃。對應的是優化器這個步驟。緩存

MySQL 中的 SQL 是如何執行的

首先 MySQL 是典型的 C/S 架構,即 Client/Server 架構,服務器端程序使用的 mysqld。總體的 MySQL 流程以下圖所示:
2.png安全

鏈接層:客戶端和服務器端創建鏈接,客戶端發送 SQL 至服務器端;
SQL 層:對 SQL 語句進行查詢處理;
存儲引擎層:與數據庫文件打交道,負責數據的存儲和讀取。

其中 SQL 層與數據庫文件的存儲方式無關,咱們來看下 SQL 層的結構:
1.jpg服務器

查詢緩存:Server 若是在查詢緩存中發現了這條 SQL 語句,就會直接將結果返回給客戶端;若是沒有,就進入到解析器階段。須要說明的是,由於查詢緩存每每效率不高,因此在 MySQL8.0 以後就拋棄了這個功能。
解析器:在解析器中對 SQL 語句進行語法分析、語義分析。
優化器:在優化器中會肯定 SQL 語句的執行路徑,好比是根據全表檢索,仍是根據索引來檢索等。
執行器:在執行以前須要判斷該用戶是否具有權限,若是具有權限就執行 SQL 查詢並返回結果。在 MySQL8.0 如下的版本,若是設置了查詢緩存,這時會將查詢結果進行緩存。

SQL語句在Oracle和Mysql的運行流程區別

SQL 語句→緩存查詢→解析器→優化器→執行器
在這一部分中,MySQL 和 Oracle 執行 SQL 的原理是同樣的。與 Oracle 不一樣的是,MySQL 的存儲引擎採用了插件的形式,每一個存儲引擎都面向一種特定的數據庫應用環境。同時開源的 MySQL 還容許開發人員設置本身的存儲引擎,如InnoDB 存儲引擎,MyISAM 存儲引擎,Memory 存儲引擎,NDB 存儲引擎,Archive 存儲引擎。網絡

Oracle 提出了共享池的概念,經過共享池來判斷是進行軟解析,仍是硬解析。而在 MySQL 中,8.0 之後的版本再也不支持查詢緩存,而是直接執行解析器→優化器→執行器的流程,這一點從 MySQL 中的 show profile 裏也能看到。數據結構

數據庫的設計在於表的設計,而在 MySQL 中每一個表的設計均可以採用不一樣的存儲引擎,咱們能夠根據實際的數據處理須要來選擇存儲引擎,這也是 MySQL 的強大之處。架構

相關文章
相關標籤/搜索