導語:如果說前端應用為網路世界搭建起了一座座房子,那麼資料庫資料就是住進這些房子的人。
網路世界(或者程式設計者的世界)與人類世界是相反的。程式設計世界的技術核心與真相,是在底層的。個人認為,無論是用怎樣的架構部署,用怎樣的語言編碼或者方式展示,web應用和手機應用的底層,就是資料庫裡面的資料。在這些資料下面,有更底層的東西,值得我們去學習、去探索、去挖掘。或許哪天一不小心,我們就能挖到這個世界的真相。
主要參考:https://www.w3school.com.cn
https://baike.baidu.com/item/資料庫
思維導圖:
1- 思維導圖
1、資料庫的定義資料庫是“按照資料結構來組織、儲存和管理資料的倉庫”。是一個長期儲存在計算機內的、有組織的、有共享的、統一管理的資料集合。
1、 資料庫是一個實體,它是能夠合理保管資料的“倉庫”,使用者在該“倉庫”中存放要管理的事務資料,“資料”和“庫”兩個概念結合成為資料庫。
2、 資料庫是資料管理的新方法和技術,它能更合適的組織資料、更方便的維護資料、更嚴密的控制資料和更有效的利用資料。
2、資料庫管理系統資料庫管理系統(Database Management System)是一種操縱和管理資料庫的大型軟體,用於建立、使用和維護資料庫,簡稱DBMS。它對資料庫進行統一的管理和控制,以保證資料庫的安全性和完整性。使用者通過DBMS訪問資料庫中的資料,資料庫管理員也通過DBMS進行資料庫的維護工作。它可以支援多個應用程式和使用者用不同的方法在同時或不同時刻去建立,修改和詢問資料庫。大部分DBMS提供資料定義語言DDL(Data Definition Language)和資料操作語言DML(Data Manipulation Language),供使用者定義資料庫的模式結構與許可權約束,實現對資料的追加、刪除等操作。
3、資料庫型別3.1、關係型資料庫
關係型資料庫,儲存的格式可以直觀地反映實體間的關係。關係型資料庫和常見的表格比較相似,關係型資料庫中表與表之間是有很多複雜的關聯關係的。 常見的關係型資料庫有Mysql,SqlServer等。
雖然關係型資料庫有很多,但是大多數都遵循SQL(結構化查詢語言,Structured Query Language)標準。 常見的操作有查詢,新增,更新,刪除,求和,排序等
3.2 非關係型資料庫(NoSQL)
NoSql資料庫如MongoDB、Redis、Memcache出於簡化資料庫結構、避免冗餘、影響效能的表連線、摒棄複雜分散式的目的被設計。
非關係型資料庫的分類:
(1)鍵值對儲存(key-value):代表軟體Redis,它的優點能夠進行資料的快速查詢,而缺點是需要儲存資料之間的關係。
(2)列儲存:代表軟體Hbase,它的優點是對資料能快速查詢,資料儲存的擴充套件性強。而缺點是資料庫的功能有侷限性。
(3)文件資料庫儲存:代表軟體MongoDB,它的優點是對資料結構要求不特別的嚴格。而缺點是查詢性的效能不好,同時缺少一種統一查詢語言。
(4)圖形資料庫儲存:代表軟體InfoGrid,它的優點可以方便的利用圖結構相關演算法進行計算。而缺點是要想得到結果必須進行整個圖的計算,而且遇到不適合的資料模型時,圖形資料庫很難使用。
3.3 NoSQL 與關係型資料庫的區別
首先一般非關係型資料庫是基於CAP模型,而傳統的關係型資料庫是基於ACID模型的。
其次在 資料儲存結構、可擴充套件性、資料一致性上,兩者有一定的區別。
CAP定理:在理論電腦科學中,CAP定理(CAP theorem),又被稱作布魯爾定理(Brewer's theorem),它指出對於一個分散式計算系統來說,不可能同時滿足以下三點:
一致性(Consistency)(所有節點在同一時間具有相同的資料)
可用性(Availability)(保證每個請求不管成功或者失敗都有響應)
分隔容忍(Partition tolerance)(系統中任意資訊的丟失或失敗不會影響系統的繼續運作)
ACID模型:ACID,是指資料庫管理系統(DBMS)在寫入/異動資料的過程中,為保證交易(transaction)是正確可靠的,所必須具備的四個特性:
原子性(Atomicity,或稱不可分割性)、
一致性(Consistency)
隔離性(Isolation,又稱獨立性)
永續性(Durability)。
4、分散式資料庫所謂的分散式資料庫技術,就是結合了資料庫技術與分散式技術的一種結合。具體指的是把那些在地理意義上分散開的各個資料庫節點,但在計算機系統邏輯上又是屬於同一個系統的資料結合起來的一種資料庫技術。
5、SQL定義與語法5.1 什麼是SQL
SQL 是用於訪問和處理資料庫的標準的計算機語言
SQL 指結構化查詢語言
SQL 使我們有能力訪問資料庫
SQL 是一種 ANSI 的標準計算機語言
5.2 語法
SQL 對大小寫不敏感。
SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL)。
DML部分:
SELECT - 從資料庫表中獲取資料
UPDATE - 更新資料庫表中的資料
INSERT INTO - 向資料庫表中插入資料
DDL部分:
CREATE DATABASE - 建立新資料庫
ALTER DATABASE - 修改資料庫
CREATE TABLE - 建立新表
ALTER TABLE - 變更(改變)資料庫表
CREATE INDEX - 建立索引(搜尋鍵)
6、SQL基本語句6.1、SELECT語句SELECT 列名稱 FROM 表名稱 ;SELECT * FROM 表名稱。
SELECT 語句用於從表中選取資料。
結果被儲存在一個結果表中(稱為結果集)。
星號(*)是選取所有列的快捷方式。
6.2、distinct語句關鍵詞 DISTINCT 用於返回唯一不同的值。
SELECT DISTINCT 列名稱 FROM 表名稱
6.3、where語句WHERE 子句用於規定選擇的標準
SELECT 列名稱 FROM 表名稱 WHERE 列 運算子 值;
運算子:= <> > < >= <= BETWEEN LIKE AND OR
6.4、AND & OR語句AND 和 OR 運算子用於基於一個以上的條件對記錄進行過濾。
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算子顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算子顯示一條記錄。
6.5、Order By語句ORDER BY 語句用於根據指定的列對結果集進行排序。
ORDER BY 語句預設按照升序(AES) 對記錄進行排序。
如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。
6.6、insert 語句INSERT INTO 語句用於向表格中插入新的行;
INSERT INTO 表名稱 VALUES (值1, 值2,....)
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
6.7、update 語句Update 語句用於修改表中的資料。
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
DELETE FROM 表名稱 WHERE 列名稱 = 值
6.8、Top子句TOP 子句用於規定要返回的記錄的數目。
註釋:並非所有的資料庫系統都支援 TOP 子句。
SQL Server 中:
SELECT TOP number|percent column_name(s) FROM table_name
MySql中:
SELECT column_name(s) FROM table_name LIMIT number
Oracle中:
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
6.9、萬用字元在搜尋資料庫中的資料時,SQL 萬用字元可以替代一個或多個字元。
SQL 萬用字元必須與 LIKE 運算子一起使用。
% 替代一個或多個字元
_ 僅替代一個字元
[charlist] 字元列中的任何單一字元
[^charlist] 或者 [!charlist] 不在字元列中的任何單一字元
6.10、IN操作符IN 操作符允許我們在 WHERE 子句中規定多個值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
6.11、Aliases別名通過使用 SQL,可以為列名稱和表名稱指定別名(Alias)。
SELECT column_name AS alias_name FROM table_name
7、SQL基本資料庫操作7.1、JOIN表連線SQL join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料。
JOIN: 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行
關鍵字語法:
SELECT column_name(s)
FROM table_name1
JOIN(或者INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN) table_name2
ON table_name1.column_name=table_name2.column_name
7.2、UNION合併UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
注意:UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 SELECT 語句中的列的順序必須相同。
關鍵字語法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
註釋:預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
7.3、表備份SQL SELECT INTO 語句可用於建立表的備份復件。
SELECT INTO 語句從一個表中選取資料,然後把資料插入另一個表中。
SELECT INTO 語句常用於建立表的備份復件或者用於對記錄進行存檔。
語法:
SELECT * (或者指定列column_name(s))
INTO new_table_name [IN externaldatabase]
FROM old_tablename
注意:可以新增where子句,或者join連線等。
7.4、建立資料庫CREATE DATABASE 用於建立資料庫。
語法:CREATE DATABASE database_name
7.5、建立資料庫表CREATE TABLE 語句用於建立資料庫中的表。
語法:
CREATE TABLE 表名稱
(
列名稱1 資料型別,
列名稱2 資料型別,
列名稱3 資料型別,
....
)
7.6、建立索引CREATE INDEX 語句用於在表中建立索引。
在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。
建立簡單索引的語法(允許使用重複的值):
CREATE INDEX index_name ON table_name (column_name);
在表上建立一個唯一的索引。唯一的索引意味著兩個行不能擁有相同的索引值。
CREATE UNIQUE INDEX index_name ON table_name (column_name);
例如MySQL:ALTER TABLE table_name DROP INDEX index_name
SQL Server:DROP INDEX table_name.index_name
例如:
ALTER TABLE table_name ADD column_name datatype
8、資料型別8.1、常用的資料型別:8-常用的資料型別圖
8.2、Microsoft Access、MySQL 以及 SQL Server 所使用的資料型別和範圍。請參考W3school:SQL資料型別
9、約束(Constraints)約束用於限制加入表的資料的型別。
可以在建立表時規定約束(通過 CREATE TABLE 語句),或者在表建立之後也可以(通過 ALTER TABLE 語句)。
主要約束:
NOT NULL 非空
NOT NULL 約束強制列不接受 NULL 值。
NOT NULL 約束強制欄位始終包含值。這意味著,如果不向欄位新增值,就無法插入新記錄或者更新記錄。
UNIQUE 唯一標識
UNIQUE 約束唯一標識資料庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
PRIMARY KEY 主鍵
PRIMARY KEY 約束唯一標識資料庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
AUTO INCREMENT 欄位
我們通常希望在每次插入新記錄時,自動地建立主鍵欄位的值。
我們可以在表中建立一個 auto-increment 欄位。
FOREIGN KEY 外來鍵
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
CHECK 限制值的範圍
DEFAULT 預設值
10、檢視View10.1、什麼是檢視在 SQL 中,檢視是基於 SQL 語句的結果集的視覺化的表。
檢視包含行和列,就像一個真實的表。檢視中的欄位就是來自一個或多個數據庫中的真實的表中的欄位。我們可以向檢視新增 SQL 函式、WHERE 以及 JOIN 語句,我們也可以提交資料,就像這些來自於某個單一的表。
註釋:資料庫的設計和結構不會受到檢視中的函式、where 或 join 語句的影響。
10.2、語法建立檢視
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
註釋:檢視總是顯示最近的資料。每當使用者查詢檢視時,資料庫引擎通過使用 SQL 語句來重建資料。
更新檢視
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
DROP VIEW view_name
10.3、檢視的作用檢視僅支援查詢,不支援增刪改等資料操作。您可以將檢視當作是一種臨時表。
檢視的作用:
1、 提高了sql程式碼的複用性。
當一個查詢你需要頻頻的作為子查詢使用時,檢視可以簡化程式碼,直接呼叫而不是每次都去重複寫這個東西。
2、 提高了資料的安全性。
系統的資料庫管理員,需要給他人提供一張表的某兩列資料,而不希望他可以看到其他任何資料,這時可以建一個只有這兩列資料的檢視,然後把檢視公佈給他。
11、索引索引是一種特殊的查詢表,可以被資料庫搜尋引擎用來加速資料的檢索。簡單說來,索引就是指向表中資料的指標。資料庫的索引同書籍後面的索引非常相像。
儘管建立索引的目的是提升資料庫的效能,但是還是有一些情況應當避免使用索引。下面幾條指導原則給出了何時應當重新考慮是否使用索引:
1、小的資料表不應當使用索引;
2、需要頻繁進行大批量的更新或者插入操作的表;
3、如果列中包含大數或者 NULL 值,不宜建立索引;
4、頻繁操作的列不宜建立索引。
SQL中的索引分為兩種,一種為聚集索引和非聚集索引。
12、函式常用的函式:
AVG () : 返回數值列的平均值。NULL 值不包括在計算中
COUNT() : 返回匹配指定條件的行數
MAX() : 返回一列中的最大值。NULL 值不包括在計算中
MIN() : 返回一列中的最小值。NULL 值不包括在計算中
SUM() : 返回數值列的總數(總額)
不常用:
FIRST() : 返回指定的欄位中第一個記錄的值
LAST() : 返回指定的欄位中最後一個記錄的值。
UCASE() : 把欄位的值轉換為大寫
LCAS() : 把欄位的值轉換為小寫
MID() : 用於從文字欄位中提取字元
LEN() : 返回文字欄位中值的長度
ROUND() : 用於把數值欄位舍入為指定的小數位數
NOW() : 返回當前的日期和時間
FORMA() : 用於對欄位的顯示進行格式化
REPLACE() : 字串替換函式
CONCAT():將兩個字串連線為一個字串
GROUP BY 語句:
合計函式 (比如 SUM) 常常需要新增 GROUP BY 語句。
語法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING 語句:
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用。
語法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
例如:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000