1. 程式人生 > >測試眼中的數據庫

測試眼中的數據庫

開頭 asp 學分 avg 其它 等了 數據類型 額外 表之間

本人主要做一個知識的歸類與記錄,如是轉載類文章,居首都會備註原鏈接,尊重原創者,謝謝!
此文轉載原鏈接:https://www.cnblogs.com/bianfengjie/p/9224498.html

前言:

對於一名測試人員來說,數據庫的使用也是一項很基礎的技能要求。因為絕大多數的應用都跟數據緊密相關,比如weixin,QQ,都需要存放大量的數據信息:聯系人信息、發送的信息、朋友圈信息等等。這些信息絕大多數是存放在關系型數據庫中。

因此,軟件測試工程師對數據庫的了解,是基本的要求。

一、數據庫的本質(Mysql)

數據庫的關系型數據庫。

所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助於集合代數等數學概念和方法來處理數據庫中的數據。

1.1 RDBMS即關系數據庫管理系統(Relational Database Management System)的特點

  • 1.數據以表格的形式出現
  • 2.每行為各種記錄名稱
  • 3.每列為記錄名稱所對應的數據域
  • 4.許多的行和列組成一張表單
  • 5.若幹的表單組成database

關於RDBMS的一些術語

  • 數據庫: 數據庫是一些關聯表的集合。
  • 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
  • 列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
  • 行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
  • 冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性。
  • 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
  • 外鍵:外鍵用於關聯兩個表。
  • 復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用於復合索引。
  • 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。(關於索引,面試問的很多)
  • 參照完整性: 參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。

1.2 數據庫存儲遵循範式

數據庫範式(Normal forms):是用於規範關系型數據庫設計,以減少謬誤發生的一種準則。範式是符合某一種級別的關系模式的集合。關系數據庫中的關系必須滿足一定的要求,滿足不同程度要求的為不同範式。

1、第一範式(1nf)

第一範式是關系型數據庫的基礎條件。

第一範式可以概括為:

(1)不允許出現重復的行;

(2)沒有重復的列;

(3)每列(或者每個屬性)都是不可再分的最小數據單元,即符合原子性,而不能是集合,數組,記錄等非原子數據項;

舉例子:高三(1)班的小紅

技術分享圖片

這是不符合第一範式的,班級可以拆分成兩個字段:年級+班級

技術分享圖片

2、第二範式(2nf)

第二範式就是任意一個字段都只依賴表中的同一個字段 ,即屬性完全依賴於主鍵。 第二範式是指,首先滿足第一範式,並且表中非主鍵列不存在對主鍵的部分依賴。

技術分享圖片

表中主鍵為 (學號,課程),可以看出表示所有非主鍵列 (成績,課程學分)都依賴於主鍵。 但是,表中還存在另外一個依賴:(課程)->(課程學分)。這樣非主鍵列 ‘課程學分‘ 依賴於部分主鍵列 ’課程‘, 所以上表是不滿足第二範式的。

技術分享圖片

上面2個表,學生選課表主鍵為(學號,課程),課程信息表主鍵為(課程),表中所有非主鍵列都完全依賴主鍵。不僅符合第二範式,還符合第三範式。

技術分享圖片

上表中,主鍵為:學號,所有字段 (姓名,性別,班級,班主任)都依賴與主鍵,不存在對主鍵的部分依賴。所以是滿足第二範式。

3、第三範式(3nf)

第三範式定義是,滿足第二範式,並且表中的列不存在對非主鍵列的傳遞依賴,即消除對主鍵的傳遞依賴,簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。

對於上面的學生信息表,雖然滿足第二範式,所有字段都依賴主鍵(學號),但是,表中存在一個傳遞依賴,(學號)->(班級)->(班主任)。也就是說,(班主任)這個非主鍵列依賴與另外一個非主鍵列 (班級)。所以不符號第三範式。

學生信息表

技術分享圖片

班級信息表

技術分享圖片

這樣,對主鍵的傳遞依賴就消失了。上面的2個表都符合第3範式。

1.3 數據庫數據類型的存儲

1、數據庫數據存儲本質

數據庫數據存儲本質是存在磁盤裏面的。

數據以磁盤塊為單位存儲在磁盤上。塊分布於一張或多張盤片的同心環形磁道上。磁道可以在盤片的單面或雙面上錄制。

同一直徑的所有磁道的集合稱為柱面。

磁盤塊的大小在磁盤初始化時可以被設置成扇區大小的倍數。

每一個記錄的表面都有一個磁盤頭陣列。讀寫一塊時,磁頭必須定位在塊頭位置。

不能並行讀寫的主要原因是很難保證所有磁頭被精確定位在相應的磁道上。

磁盤控制器是磁盤驅動器與計算機的接口。

2、數據存儲過程

存儲過程可以使得對數據庫的管理、以及顯示關於數據庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。
存儲過程可包含程序流、邏輯以及對數據庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:
(1)可以在單個存儲過程中執行一系列 SQL 語句。
(2)可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
(3)存儲過程在創建時即在服務器上進行編譯,所以執行起來比單個 SQL 語句快。

具體參考:https://blog.csdn.net/guxianga/article/details/1795619

3、存儲函數

Microsoft SQL Server 2000 允許創建用戶定義函數。與任何函數一樣,用戶定義函數是可返回值的例程。根據所返回值的類型,每個用戶定義函數可分成以下三個類別:
(1)返回可更新數據表的函數

如果用戶定義函數包含單個 SELECT 語句且該語句可更新,則該函數返回的表格格式結果也可以更新。
(2)返回不可更新數據表的函數
如果用戶定義函數包含不止一個 SELECT 語句,或包含一個不可更新的 SELECT 語句,則該函數返回的表格格式結果也不可更新。
(3)返回標量值的函數
用戶定義函數可以返回標量值。

存儲過程和存儲函數的區別:

(1)一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。

(2)對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。

(3)存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。

(4)當存儲過程和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裏沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。

4、觸犯器

觸發器是一種特殊類型的存儲過程,不由用戶直接調用。創建觸發器時會對其進行定義,以便在對特定表或列作特定類型的數據修改時執行。

觸發器可以查詢其他表,而且可以包含復雜的 SQL 語句。 它們主要用於強制服從復雜的業務規則或要求。 例如,您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。

SQL Server 包括兩種常規類型的觸發器:數據操作語言 (DML) 觸發器和數據定義語言 (DDL) 觸發器。 INSERT、UPDATE 或 DELETE 語句修改指定表或視圖中的數據時,可以使用 DML 觸發器。 DDL 觸發器激發存儲過程以響應各種 DDL 語句,這些語句主要以CREATE、ALTER 和 DROP 開頭。 DDL 觸發器可用於管理任務,例如審核和控制數據庫操作。

通常說的觸發器就是DML觸發器。

DML 觸發器在 INSERT、UPDATE 和 DELETE 語句上操作,並且有助於在表或視圖中修改數據時強制業務規則,擴展數據完整性。

參考:https://www.cnblogs.com/yank/p/4193820.html

5、存儲引擎

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

Mysql常見四種存儲引擎:InnoDB、MyISAM、MEMORY、MERGE

參考:https://blog.csdn.net/qq_27028821/article/details/52267991

二、數據庫操作

2.1 數據庫和表結構操作

1、創建數據庫和表

create database dbname 和 create table tbname

2、對表字段的增刪改查

ALTER TABLE 語句用於在已有的表中添加、修改或刪除列。

在表中添加列

1 ALTER TABLE table_name ADD column_name datatype

刪除表中的列

1 ALTER TABLE table_name DROP COLUMN column_name

改變表中列的數據類型

如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

ALTER TABLE testalter_tbl MODIFY c CHAR(10)   #把字段 c 的類型從 CHAR(1) 改為 CHAR(10)
1 在 CHANGE 關鍵字之後,緊跟著的是你要修改的字段名,然後指定新字段名及類型。
1 ALTER TABLE testalter_tbl CHANGE j j INT; # 把字段 j 的類型改為int

 小結:1、create和drop它既操作數據庫也操作表,所有你在操作的時候一定要告訴人家,你到底操作是表還是數據庫

2、alter 這個關鍵字很特別,它在操作字段的時候也需要加table關鍵字

3、表數據操作

增:MySQL 表中使用 INSERT INTO SQL語句來插入數據。

1 2 3 INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );

刪:可以使用 SQL 的 DELETE FROM 命令來刪除 MySQL 數據表中的記錄。

1 DELETE FROM table_name [WHERE Clause]

改:需要修改或更新 MySQL 中的數據時可以使用UPDATE 命令來操作。

1 2 UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] 

查:MySQL 數據庫使用SQL SELECT語句來查詢數據。

SELECT column_name,column_name
FROM table_name
[WHERE Clause]

分組:GROUP BY 語句用於結合聚合函數,根據一個或多個列對結果集進行分組,在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。

參考:http://www.runoob.com/sql/sql-having.html

1 2 3 4 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

  技術分享圖片

執行下面語句:

1 2 3 4 5 SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log INNER JOIN Websites ON access_log.site_id=Websites.id) GROUP BY Websites.name HAVING SUM(access_log.count) > 200; #查找總訪問量大於 200 的網站

LIKE:SQL LIKE 子句中使用百分號 %字符來表示任意字符,類似於UNIX或正則表達式中的星號 *。如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的。

1 2 3 SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = ‘somevalue‘
  • 可以在 WHERE 子句中指定任何條件。
  • 可以在 WHERE 子句中使用LIKE子句。
  • 可以使用LIKE子句代替等號 =。
  • LIKE 通常與 % 一同使用,類似於一個元字符的搜索。
  • 可以使用 AND 或者 OR 指定一個或多個條件。
  • 可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。

小結: 1、表操作語句沒有table關鍵字,因為操作就是表數據,所以不需要table關鍵字

2、insert into 字面意思是:往表裏面插入數據,而不是從表裏面獲取數據,所以沒有from關鍵字

3、delete from 表示從表中刪除 一條或者多條數據,所以在刪除的時候 不能加 *

4、update tbname 字面意思: 更新表 --> 不需要from 更新(update) 表(tbname) 裏面的字段內容(set feildname=‘123‘) 條件在哪裏(where id = 1 )

5、select * :*代表字段 從哪張表裏面查詢出數據 條件在where .....

6、group by 作用:主要跟HAVING聯合配合聚合函數使用

4、復雜數據庫查詢

在數據庫的查詢(select),遵循的原則:一切皆表!

(1) 嵌套查詢

在SQL語言中,一個 SELECT-FROM-WHERE 語句稱為一個查詢塊。將一個查詢塊嵌套在另一個查詢塊的 WHERE 子句或 HAVING 短語的條件中的查詢稱為 嵌套查詢。

參考:https://www.cnblogs.com/OctoptusLian/p/8183241.html

1 2 3 4 SELECT Sname /*外層查詢或父查詢*/ FROM Student WHERE Sno IN (SELECT Sno /*內層查詢或子查詢*/ FROM SC WHERE Cno=‘2‘);

註意:

1、子查詢的SELECT語句中不能使用 ORDER BY 子句,因為 ORDER BY 子句只能對最終查詢結果排序。

2、在嵌套查詢中,子查詢的結果往往是一個集合,所以謂詞 IN 是嵌套查詢中最經常使用的謂詞。

3、帶有比較運算符的子查詢是指父查詢與子查詢之間用比較運算符進行連接。當用戶能確切知道內層查詢返回的是單個值時,可以用 >、<、=、>=、<=、!=、或<>等比較運算符。

1 2 3 4 SELECT Sno,Cno FROM SC X WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno); #找出每個學生超過他自己選修課程平均成績的課程號

(2) 聯合查詢

參考:http://www.runoob.com/mysql/mysql-join.html

a、內聯: 只查詢出左右表鏈接字段相等的數據,以左表(from tbname)為基準,只要左表的數據和右表(join 表明)的數據相匹配,就能查詢出來。

1 select t1.score_id,t2.id from tabname t1 (inner) join tabname2 t2 on t1.score_id = t2.id where t2.id = 10

b、左鏈接: 只查詢出以左表為基準,右表不存在值,則顯示為null

1 select t1.score_id,t2.id from tabname t1 left join tabname2 t2 on t1.score_id = t2.id where t2.id = 10

c、右鏈接:只查詢出以右表為基準,左表不存在值,則顯示為null

1 select t1.score_id,t2.id from tabname t1 right join tabname2 t2 on t1.score_id = t2.id where t2.id = 10

小結:1、復雜sql查詢 把一個sql當做臨時表的時候,一定要加一個別名

1 2 3 4 5 select * from ( select * from ( select t1.score_id,t2.id from tabname t1 right join tabname2 t2 on t1.score_id = t2.id where t2.id = 10 ) as s left join .... where ....) as a join ....

2、看復雜的sql:

a、select 和 from 之間永遠是字段

b、from 後面永遠是表

c、where 後面永遠是條件

d、看懂邏輯:主要找表關系,從from後面下手

總結:

本文註意總結了測試人員需要掌握的數據庫知識,其中,存儲過程、存儲函數、觸犯器、存儲引擎等了解即可,有興趣的可深入研究。

面試經常問到的數據庫的問題主要有:

1、聯合查詢,即內鏈接、左鏈接、右鏈接

2、分組:GROUP BY 和HAVING的使用

3、索引

4、常見聚合函數

5、分頁sql

1 2 3 select top 50 * from pagetest where id not in (select top 9900 id from pagetest order by id) order by id #每頁50條,198*50=9900,取第199頁數據。

6、視圖

是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改會影響基本表。它使得我們獲取數據更容易,相比多表查詢。

視圖的優缺點

優點: 1)對數據庫的訪問,因為視圖可以有選擇性的選取數據庫裏的一部分。 2 )用戶通過簡單的查詢可以從復雜查詢中得到結果。 3 )維護數據的獨立性,試圖可從多個表檢索數據。 4 )對於相同的數據可產生不同的視圖。 缺點: 性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那麽,那麽就無法更改數據

7、主鍵和外鍵的區別

主鍵在本表中是唯一的、不可唯空的,外鍵可以重復可以唯空;外鍵和另一張表的主鍵關聯,不能創建對應表中不存在的外鍵。

測試眼中的數據庫