一、SQL基本概念: SQL 已經成為關係資料庫的標準語言,是一種資料庫查詢和程式設計語言,用 於存取數據以及查詢、更新和管理關係資料庫系統。 功能不僅僅是查詢,還包括數據定義、數據操縱和數據控制等於資料庫有關的 一系列功能。 四大功能:數據查詢、數據定義、數據操縱和數據控制。 1)嵌入式和動態 S ...
一、SQL基本概念:
SQL 已經成為關係資料庫的標準語言,是一種資料庫查詢和程式設計語言,用 於存取數據以及查詢、更新和管理關係資料庫系統。 功能不僅僅是查詢,還包括數據定義、數據操縱和數據控制等於資料庫有關的 一系列功能。
四大功能:數據查詢、數據定義、數據操縱和數據控制。
1)嵌入式和動態 SQL 規則 規定了 SQL 語句在高級程式設計語言中使用的規範方法,以便適應較為複雜的 應用。
2)SQL 調用和會話規則 調用包括 SQL 常式和調用規則,以便提高 SQL 的靈活性、有效性、共用性以 及使 SQL 具有更多的高級語言的特征。
3)關係資料庫系統支持三級模式結構,其模式、外模式和內模式中的基本對象有 資料庫模式、表、索引、視圖等。 SQL 標準提供的數據定義語句如下表:
二、MySQL
1、MySQL基礎概念
MySQL 是一個關係資料庫管理系統(RDBMS),它具有客戶/伺服器體繫結構。
MySQL 中的 SQL 作為一種關係型資料庫管理系統,遵循 SQL 標準,提供了對數據定義語言 DDL、數據操縱語言 DML、數據控制語言 DCL 的支持,同樣支持關係資料庫的三級模式結構。 MySQL 中一個關係對應一個基本表,一個或多個基本表對應一個存儲文件,一 個表可以有若幹索引,索引也存放在存儲文件中。
MySQL 在 SQL 標準的基礎上增加了部分擴展的語言要素:包括常量、變數、 運算符、表達式、函數、流程式控制制語句和註解等。
1)常量 是指在程式運行過程中值不變的量,也稱為字面值或標量值。常量的使用格式 取決於值的數據類型,可分為字元串常量、數值常量、十六進位常量、時間日期常量、位欄位值、布爾值和 NULL 值。
字元串常量是指用單引號或雙引號括起來的字元序列,分為 ASCII 字元串常量 和 Unicode 字元串常量。
十六進位值通常指定為一個字元串常量,每對十六進位數字被轉換為一個 字元,其最前面有一個大寫字母 X 或小寫字母 x。
日期和時間常量是用單引號將表示日期時間的字元串括起來構成的。 使用 b‘value’格式書寫位欄位值。Value 是一個用 0 或 1 書寫的二進位值。
2)變數 在 MySQL 中,變數分為用戶變數和系統變數。用戶變數前常添加一個符號 “@”,大多數系統變數前,添加兩個“@”符號。
3)運算符 MySQL 幾類編程語言中常用的運算符:
算術運算符:+(加)、—(減)、*(乘)、/(除)和%(求模)
位運算符有:&(位與)、|(位或)、^(位異或)、~(位取反)、>>(位右 移)、<<(位左移)。
比較運算符:=(等於)、>(大於)、<(小於)、>=(大於等於)、<=(小 於等於)、<>(不等於)、!=(不等於)、<=>(相等或都等於空)。
邏輯運算符:NOT 或!(邏輯非)、AND 或&&(邏輯與)、OR 或||(邏輯 或)、XOR(邏輯異或)
4)表達式 是常量、變數、列名、複雜計算、運算符和函數的組合。 表達式可分為字元表達式、數值型表達式和日期表達式。
5)內置函數 MySQL 包含了 100 多個函數,基本分類如下:
數學函數,例如 ABS()函數、SORT()函數; 聚合函數,例如 COUNT()函數;
字元串函數,例如 ASCII()函數、CHAR()函數;
日期和時間函數,例如 NOW()函數、YEAR()函數;
加密函數,例如 ENCODE()函數、ENCRYPT()函數;
控制流程函數,例如 IF()函數、IFNULL()函數;
格式化函數,例如 FORMAT()函數;
類型轉換函數,例如 CAST()函數;
系統信息函數,例如 USER()函數、VERSION()函數。
2、索引定義
(1)索引是 DBMS 根據表中的一列或若幹列按照一定順序建立的列值與記錄行之間的對應關係表,因而索引實質上是一張描述索引列的列值與原表中記錄行之間 一一對應關係的有序表。
(2)索引在邏輯上通常包含以下幾類:
2.1)普通索引:最基本的索引類型,沒有任何限制;
2.2)唯一性索引:索引列中的所有值都只能出現一次,必須是唯一的;
2.3)主鍵:一種唯一性索引。
(3)索引存在的弊端如下:
3.1)索引是以文件的形式存儲的,DBMS 會將一個表的所有索引保存在同一個索引文件中,索引文件需要占用磁碟空間。
3.2)索引在提高查詢速度的同時,卻會降低更新表的速度。
(4)相關SQL
查詢已創建的索引 show {index|indexes} {in|from} test_table;
創建索引 create index index_name on test_table(s_name,s_age);
創建索引(使用alter table的方式) alter table test_table add index index_name(s_name,s_age)
刪除索引 drop index index_name on test_table;
刪除索引(使用alter table的方式) alter table test_table drop index index_name;
3、視圖
(1)視圖是資料庫中的一個對象,它是資料庫管理系統提供給用戶的以多種角度觀察資料庫中數據的一種重要機制。外模式對應到資料庫中的概念就是視圖。 (2)視圖仍不同於資料庫中真實存在的基本表,它們存在以下區別: 1)視圖不是資料庫中真實的表,而是一張虛擬表。 2)視圖的內容是由存儲在資料庫中進行查詢操作的 SQL 語句來定義的,它的列數據與行數據均來自於定義視圖的查詢所引用的真實表,並且這些數據是在引用視圖時動態生成的。 3)視圖不是以數據集的形式存儲在資料庫中,它所對應的數據實際上是存儲在視圖所引用的真實表中。 4)視圖是用來查看存儲在別處的數據的一種虛擬表,而其自身並不存儲數據。 (3)使用視圖有如下優點: 1)集中分散數據; 2)簡化查詢語句; 3)重用 SQL 語句:保護數據安全;共用所需數據;更改數據格式。 (4)相關SQL示例 創建視圖 create or replace view cus_view as select * from test_table where s_age = 19 with check option; 刪除視圖 drop view cus_view; 查詢創建的視圖 show create view cus_view; 數據操作 -- 添加 insert into customers_view values(0,'ww',1,'ww','ww'); -- 更新 update customers_view set cust_name='qq' where cust_id=5; -- 刪除 delete from customers_view where cust_id=5; -- 查詢 select * from cus_view; 4、觸發器 (1)觸發器是用戶定義在關係表上的一類由事件驅動的資料庫對象,也是一種保證數據完整性的方法。觸發器一旦定義,無須用戶調用,任何對錶的修改操作均為資料庫伺服器自動激活相應的觸發器。觸發器與表的關係十分密切,其主要作用是實現主鍵和外鍵不能保證的複雜的參照完整性和數據的一致性,從而有效地保護表中的數據。 (2)SQL示例 創建觸發器 create trigger trigger_name trigger_time trigger_event on table_name for each row trigger_body; 5、封鎖 封鎖是最常用的併發控制技術,它的基本思想是:需要時,事務通過向系統請求對它所希望的數據對象加鎖,以確保它不被非預期改變。 (1) 鎖 一個鎖實際上就是允許或組織一個事務對一個數據對象的存取特權。基本的封鎖類型有兩種:排他鎖和共用鎖。 (2)用封鎖進行併發控制 工作原理是: (1) 若事務 T 對數據 D 加了 X 鎖,則所有別的事務對數據 D 的鎖請求都必須等待直到事務 T 釋放鎖。 (2) 若事務 T 對數據 D 加了 S 鎖,則別的事務還可對數據 D 請求 S 鎖,而對數據 D 的 X 鎖請求必須等待直到事務 T 釋放鎖。 (3) 事務執行資料庫操作時都要先請求相應的鎖,即對讀請求 S 鎖,對更新(插入、刪除、修改)請求 X 鎖。這個過程一般是由 DBMS 在執行操作時自動隱含地進行。 (4) 事務一直占有獲得的鎖直到結束(COMMIT 或 ROLLBACK)時釋放。因此,利用封鎖機制可以解決併發操作所帶來的三個不一致問題。 (3)封鎖的粒度 以粒度來描述封鎖的數據單元的大小。DBMS 可以決定不同粒度的鎖。由最底層的數據元素到最高層的整個資料庫,粒度越細,併發性就越大,但軟體複雜性和系統開銷也就越大。 (4)封鎖的級別 封鎖的級別又稱為一致性級別或隔離度。 由各種鎖的類型與其封鎖期限組合可形成不同的封鎖級別: (1)0 級封鎖 (2)1 級封鎖 (3)2 級封鎖 (4)3 級封鎖 (5)活鎖與死鎖 在併發事務處理過程中,由於鎖會使一事務處於等待狀態而調度其他事務處理,因而該事務可能會因優先順序低而永遠等待下去,這種現象稱為“活鎖”。活鎖問題的解決與調度演算法有關,一種最簡單的辦法是“先來先服務”。兩個以上事務迴圈等待被同組中另一事務鎖住的數據單元的情形,稱為“死鎖”。DBMS 需要提供死鎖預防、死鎖檢測和死鎖發生後的處理技術與方法。預防死鎖的辦法在操作系統中已普遍討論,其中主要有如下幾種: (1) 一次性鎖請求 (2) 鎖請求排序 (3) 序列化處理 (4) 資源剝奪 (6)可串列性 一組事務的一個調度就是它們的基本操作的一種排序。若在一個調度中,對於任意兩個事務 T1 和 T2,要麼 T1 的所有操作都在 T2 所有操作之前,要麼反之,則該調度室串列的,因而是正確的。通常,在資料庫系統中,可串列性就是併發執行的正確性準則,即當且僅當一組事務的併發執行調度是可串列化,才認為它們是正確的。 (7)兩段封鎖法 採用兩段封鎖法是一種最簡單而有效的保障封鎖其調度是可串列性的方法。兩段鎖協議規定在任何一個事務中,所有加鎖操作都必須在所有釋放鎖操作之前。其中,事務劃分成如下兩個階段。 (1) 發展(Growing)或加鎖階段 (2) 收縮(Shrinking)或釋放鎖階段 定理:遵循兩段鎖協議的事務的任何併發調度都是可串列化的。