轉載請註明出處❤️
作者:測試蔡坨坨
原文連結:caituotuo.top/747a74ea.html
你好,我是測試蔡坨坨。
對於測試同學來說,除了知道測試基礎知識外,還需要掌握一些測試基本技能,主要有Linux、資料庫、計算機網路等,在此之前我們已經討論過Linux基礎知識以及在實際工作中的應用,可參考往期文章「學會 Linux,看完這篇就行了!」。
今天,我們就來聊一聊資料庫,資料庫是大學本科計算機系核心課程之一,其重要性不言而喻。
資料庫在面試中基本屬於必考內容,最多的就是手寫SQL或口述SQL,面試官會給你出一個場景,比如班級、分數、課程之類的,一般考察表查詢語句居多,例如多表查詢、連線查詢、子查詢等。所以,當你準備轉行踏入IT行業的時候,就首先需要掌握資料庫。
本文主要科普作為一枚測試應該知道的資料庫理論基礎知識,知道這些不僅可以在面試時加分,而且可以加深你對資料庫的理解,而不是僅僅停留在只會寫幾個SQL上面。
測試人員對於資料庫理論知識的學習,肯定不需要像開發那麼深入,但是一些基本的內容需要知道並掌握,簡單來說,資料庫基礎,看完接下來的文章並搞明白就完全夠用了。
當然,關於資料庫進階知識,比如資料庫索引、事務、資料庫三大正規化、資料庫調優、儲存過程等內容也會在後續的文章中與大家討論。
作為測試,資料庫在日常工作中的權重佔比還是比較大的,主要有以下幾個應用場景:
專案部署及部署完後資料的準備
開發設定好環境,但是沒有連線資料庫,就需要我們自己新建資料庫並連線。
已經建好資料庫,但是沒有建立資料表,就需要我們自己建立資料表。
已經建立好資料庫和資料表,但是資料表中沒有資料,就需要我們自己新增資料。
資料表中有資料,但是資料量不夠,開發只提供一兩條樣例資料,測試就需要大量造資料。
專案的後臺管理沒有註冊功能,就需要我們自己手動向資料表中插入使用者名稱和密碼。
在前端頁面增刪改查,檢視資料庫是否做了相應更新,核對資料儲存的準確性
舉慄1:在CRM專案中,新建客戶以後,在資料庫的表中檢視是否與新建的客戶資訊一致。
舉慄2:支付交易產生的訂單可以從資料庫中檢視訂單是否真實儲存,資料資訊是否一致。
對資料直接操作來滿足測試用例所需的極限場景
比如有些場景像CRM專案中的新建客戶功能,我們只是要驗證一個輸入框的邊界值,但是卻需要在前端頁面一直新建,一直提交儲存,每次新建都需要填寫暫時不需要測試的必填項,太麻煩,就可以直接去修改資料表中對應的欄位值。
效能測試或自動化測試通過指令碼產生大量資料時,檢視資料庫是否批次有效儲存
通過運算元據庫優化測試用例,提升測試效率
前端輸入框欄位報錯時,可能是資料庫引數型別設定有誤或欄位長度不夠,就可以開啟資料庫檢視欄位引數型別和長度是否正確
效能測試,通過優化SQL語句或表結構來提高系統的效能,例如慢查詢等
造資料場景,構造某些用例的前置條件
舉慄1:統計年盈利額,需要1~12月都需要資料,不可能一個需求測一年吧,就可以在資料庫中直接插入資料。
舉慄2:手機號註冊時,通過改資料庫表欄位非唯一狀態來重複使用一個手機號,進行反覆註冊。
舉慄3:通過修改金額、價格等用來做支付測試,比如原本需要100¥,就可以通過修改資料為0.01¥。
舉慄4:會員積分,就可以在資料庫直接修改積分,看是否達到會員。
理解如何通過介面運算元據庫
做測試結構分析時,可以通過資料庫搞清楚資料流向,哪個表放哪個欄位什麼時候在哪裡展示
and so on ……
以上,僅列舉了一些日常工作中比較常見的場景,供大家參考。
同時歡迎評論區補充哦~
緊接著,就來介紹一下資料庫以及常用的SQL語句。
資料庫的英文單詞:Database ,簡稱DB。
資料庫方向的崗位叫DBA(Database Administrat),也就是資料庫管理員,專門和資料庫打交道的,屬於運維工程師的一個分支,主要負責業務資料庫從設計、測試到部署交付的全生命週期管理。
資料庫實際上就是一個檔案集合,是一個儲存資料的倉庫,本質就是一個檔案系統,資料庫是按照特定的格式把資料儲存起來,使用者可以對儲存的資料進行增刪改查操作。
簡單概括,資料庫就是用於儲存和管理資料的倉庫。
具體來說,就是前端頁面使用者輸入的資料通過介面傳給後端,然後儲存到資料庫中,同時也支援從資料庫中取資料傳給前端頁面做一個展示。
關係型資料庫:是建立在關係模型基礎上的資料庫,比如MySQL、Oracle、SQL Server、DB2、PostgreSQL等,還有一些國產的資料庫比如達夢資料庫、神通資料庫、人大金倉資料庫等。
非關係型資料庫(NO SQL):通常指資料之間無關係的資料庫,比如MongoDB、Redis,以鍵值對的方式儲存。
上面說了這麼多資料庫,而目前企業中使用最多的就是MySQL和Oracle資料庫,後者因為是收費的,所以網際網路公司尤其是中小型企業使用最多的就是MySQL資料庫,資料庫的學習其實和程式語言一樣,當你熟練掌握其中一種時,其他的也就分分鐘上手了。
因此,推薦初學者從MySQL資料庫開始學習。
所謂安裝資料庫伺服器,只是在機器上裝一個資料庫管理系統(比如: MySQL、Oracle、SQL Server),用來管理多個資料庫,一般開發人員會針對每一個應用建立一個資料庫。
為儲存應用中實體的資料,一般會在資料庫建立多個表,以儲存程式中實體的資料。
PS:Xshell或Xftp連線Linux伺服器預設埠:22
Structured Query Language:結構化查詢語言。
SQL是專門為資料庫而建立的操作命令集,是一種功能齊全的資料庫語言。在使用它時,只需要發出「做什麼」命令,「怎麼做」是不用使用者考慮的。
在哪裡練習?想要練習資料庫需要首先需要有資料的環境,有以下兩種方法:
本地安裝一個資料庫,例如MySQL
推薦線上練習SQL網站:www.nowcoder.com/ta/sql
可以線上練習SQL實戰,會根據你的輸入實時判斷對錯,不會的話還可以參考別人寫的SQL語句。
mysql -uroot -p密碼
mysql -uroot -p(回車)
Enter password: (輸入密碼)
mysql -hip -P埠 -uroot -p
mysql --host=ip --user=root --password=密碼
exit
quit
建立資料庫命令
建立資料庫:
格式:create database [資料庫名稱];
例如:
create database caituotuo;
建立資料庫,並指定字元集:
格式:create database [資料庫名稱] character set [字元集名];
例如:
create database caituotuo character set utf8;
建立資料庫,並指定字元集、排序規則:
格式:create database [資料庫名稱] character set [字元集名] collate [排序規則];
例如:
create database caituotuo character set utf8 collate utf8_general_ci;
檢視資料庫命令
顯示所有資料庫:
show databases;
模糊查詢資料庫:
show databases like '%tuotu%';
檢視查詢某個資料庫的建立語句、字元集:
格式:show create database [資料庫名稱];
例如:
show create database caituotuo;
刪除資料庫命令
格式:drop database [資料庫名稱];
例如:
drop database caituotuo;
選中某個資料庫
格式:use [資料庫名稱];
例如:
use caituotuo;
PS:這個命令可以不加分號。
一、建立如下要求的表格,並完成相應的題目。
-- 建立表
CREATE TABLE user_info (
user_id INT NOT NULL AUTO_INCREMENT,
user_name CHAR ( 10 ),
password VARCHAR ( 10 ),
user_nick VARCHAR ( 10 ),
card_num BIGINT,
PRIMARY KEY ( user_id )
);
-- 插入資料
INSERT INTO user_info ( user_id, user_name, PASSWORD, user_nick, card_num )
VALUES
( 1, 'zhangsan', 'abc123', 'zhangsanfeng', 124567894651329785 ),
( 2, 'lisi', '122bbb', 'limochou', 124567894651324567 ),
( 3, 'wangwu', '123aaa', 'wangbaiwan', 214567894651324567 ),
( 4, 'liuqi', '12aaa', 'liuchuanfeng', 214563356651324567 ),
( 5, 'zhangliu', '12aaa', 'zhangwuji', 214563356658966567 );
-- user_nick長度不夠,修改user_nick的長度再重新插入資料
ALTER TABLE user_info MODIFY user_nick VARCHAR ( 20 );
-- 建立訂單表
CREATE TABLE order_info (
order_id INT UNSIGNED ZEROFILL NOT NULL,
price DECIMAL ( 10, 2 ) NOT NULL,
order_status VARCHAR ( 30 ) NOT NULL,
product_id INT NOT NULL,
created datetime DEFAULT "2019-01-01 00:00:00",
user_id INT NOT NULL,
PRIMARY KEY ( order_id )
);
-- 插入資料
INSERT INTO order_info
VALUES
( 1, 4.99, 'pay', 1001, '2019-09-25 10:25:26', 1 ),
( 2, 9.99, 'nopay', 1002, '2019-09-26 10:25:26', 1 ),
( 3, 4.99, 'pay', 1001, '2019-09-25 10:25:26', 2 ),
( 4, 9.99, 'nopay', 1002, '2019-09-24 10:25:26', 2 ),
( 5, 19.99, 'pay', 1003, '2019-09-26 10:25:26', 2 ),
( 6, 4.99, 'pay', 1001, '2019-09-25 10:25:26', 3 ),
( 7, 4.99, 'pay', 1001, '2019-09-25 10:25:26', 4 ),
( 8, 9.99, 'pay', 1002, '2019-09-25 10:25:26', 4 ),
( 9, 19.99, 'pay', 1003, '2019-09-26 10:25:26', 4 ),
( 10, 29.99, 'pay', 1002, '2019-09-26 10:25:26', 6 );
-- where子句小練習
-- 1. 滿足價格大於等於9的所有資訊
SELECT * FROM order_info WHERE price >= 9;
-- 2. 查詢滿足product_id在1002和1003之間的
SELECT * FROM order_info WHERE product_id BETWEEN 1002 AND 1003;
-- 3. 查詢user_id在1、3、5這三個數內的資訊
SELECT * FROM order_info WHERE user_id IN (1,3,5);
-- 4. 查詢訂單狀態是已支付的資訊
SELECT * FROM order_info WHERE order_status = 'pay';
-- 5. 查詢使用者名稱類似於已li開頭的資訊
SELECT * FROM user_info WHERE user_name LIKE 'li%';
-- 6. 查詢使用者名稱中第二個字母是h的資訊
SELECT * FROM user_info WHERE user_name LIKE '_h%';
-- 7. 查詢使用者名稱中第二個字母不是h的資訊
SELECT * FROM user_info WHERE user_name NOT LIKE '_h%';
-- 8. 查詢使用者名稱中最後一個字母以i結尾的資訊
SELECT * FROM user_info WHERE user_name LIKE '%i';
-- 9. 查詢價格大於8,並且訂單狀態是已支付的所有資訊
SELECT * FROM order_info WHERE price > 8 AND order_status = 'pay';
-- 10.查詢使用者表中user_nick為null的資訊
SELECT * FROM user_info WHERE user_nick IS NULL;
-- 11.查詢使用者表中user_nick為 not null的資訊
SELECT * FROM user_info WHERE user_nick IS NOT NULL;
-- 聚合函數練習
-- 1. 查詢訂單表中最大的價格,查詢訂單表中最小的價格
SELECT MAX(price),MIN(price) FROM order_info;
-- 2. 查詢訂單表中user_id=2的最小价格
SELECT MIN(price) FROM order_info WHERE user_id = 2;
-- 3. 分別列出訂單表中user_id=2的最小价格和最大價格
SELECT MIN(price),MAX(price) FROM order_info WHERE user_id = 2;
-- 4. 分別列出訂單表中user_id=2的最小价格和最大價格,並把最小价格的展示結果的列名改為"min_price"
SELECT MIN(price) AS min_price,MAX(price) FROM order_info WHERE user_id = 2;
-- 5. 求訂單表的價格的平均值,求訂單表中user_id=2的價格的平均值
SELECT AVG(price) FROM order_info;
SELECT AVG(price) FROM order_info WHERE user_id = 2;
-- 6. 分別列出訂單表中user_id=2的價格的平均值、最小值、最大值
SELECT AVG(price),MIN(price),MAX(price) FROM order_info WHERE user_id = 2;
-- 7. 求訂單表中user_id=1的價格的總和
SELECT SUM(price) FROM order_info WHERE user_id = 1;
-- 8. 求訂單表中user_id=1或者user_id=3的價格總和
SELECT SUM(price) FROM order_info WHERE user_id = 1 OR user_id = 3;
-- 分組練習
-- 1.首先篩選狀態為已支付的訂單,然後按照user_id分組,分組後每一組對支付金額進行求和,最終展示user_id和對應組求和金額
SELECT user_id,SUM(price) FROM order_info WHERE order_status = 'pay' GROUP BY user_id;
-- 2.首先篩選狀態為支付的訂單,然後按照user_id分組,分組後每一組對支付金額進行求和,再過濾求和金額大於10的,最終展示user_id和對應組的求和金額
SELECT user_id,SUM(price) FROM order_info WHERE order_status = 'pay' GROUP BY user_id HAVING SUM(price) > 10;
-- 資料表連線查詢和子查詢練習
-- 1.查詢訂單表中的價格大於10元的使用者的暱稱(小提示:使用者暱稱在使用者表中,訂單價格在訂單表中)
SELECT a.user_nick FROM user_info a INNER JOIN order_info b ON a.user_id = b.user_id WHERE b.price > 10;
SELECT user_nick FROM user_info WHERE user_id IN (SELECT user_id FROM order_info WHERE price > 10);
-- 2.查詢使用者名稱以l開頭的使用者買過的所有訂單id和對應價格(小提示:訂單id和對應價格在訂單表中,使用者名稱在使用者表中)
SELECT o.order_id,o.price FROM order_info o WHERE o.user_id IN (SELECT user_id FROM user_info u WHERE u.user_name LIKE 'l%');
二、建立如下要求的表格,並完成相應的題目。
-- 1.按照表定義建立商品表+供應商表
-- 2.按照表資料插入所有資料
-- 建立商品表
CREATE TABLE products_info (
product_id INT UNSIGNED ZEROFILL NOT NULL,
product_name VARCHAR ( 30 ) DEFAULT 'water',
classification VARCHAR ( 30 ),
weight FLOAT ( 10, 2 ),
supplier_id INT,
PRIMARY KEY ( product_id )
);
-- 向商品表插入資料
INSERT INTO products_info
VALUES
( 1001, 'water', 'Daily_Necessities', 0.55, 1 ),
( 1002, 'soap', 'Daily_Necessities', 0.15, 2 ),
( 1003, 'paper', 'Daily_Necessities', 0.12, 3 ),
( 1004, 'pingpangqiu', 'sports', 0.05, 4 ),
( 1005, 'yumaoqiu', 'sports', 0.04, 6 );
-- 建立供應商表
CREATE TABLE suppliers_info (
supplier_id INT NOT NULL AUTO_INCREMENT,
supplier_name VARCHAR ( 30 ),
Registration_number INT,
contacts VARCHAR ( 30 ),
contacts_phone_num CHAR ( 11 ),
PRIMARY KEY ( supplier_id )
);
-- 向供應商表插入資料
INSERT INTO suppliers_info
VALUES
( 1, 'nongfushanquan', 1000001, 'mayun', '18026156362' ),
( 2, 'jiajieshi', 1000002, 'liuqiangdong', '13826156363' ),
( 3, 'qingfeng', 1000003, 'mahuateng', '18926156364' ),
( 4, '361du', 1000004, 'renzhenfei', '18226156365' ),
( 5, 'anta', 1000005, 'leijun', '18626156366' );
-- 3.修改供應商id為4的供應商名稱為‘hongshuangxi’
UPDATE suppliers_info SET supplier_name = 'hongshuangxi' WHERE supplier_id = 4;
-- 4.查詢商品重量大於0.10的商品的名稱
SELECT product_name FROM products_info WHERE weight > 0.10;
-- 5.查詢商品名稱以字母p開頭的商品的所有資訊
SELECT * FROM products_info WHERE product_name like 'p%';
-- 6.查詢商品重量大於0.10,小於0.20的商品名稱
SELECT product_name FROM products_info WHERE weight > 0.10 AND weight < 0.20;
-- 7.按照商品分類統計各自的商品總個數,顯示每個分類和其對應的商品總個數
SELECT classification,COUNT(classification) FROM products_info GROUP BY classification;
-- 8.將所有商品的名稱按照商品重量由高到低顯示
SELECT product_name,weight FROM products_info ORDER BY weight DESC;
-- 9.顯示所有商品的資訊,在右邊顯示有供應商的商品對應的供應商資訊
SELECT * FROM products_info a LEFT JOIN suppliers_info b ON a.supplier_id = b.supplier_id;
-- 10.顯示重量大於等於0.15的商品的供應商的聯絡人和手機號
SELECT s.contacts,s.contacts_phone_num FROM suppliers_info s INNER JOIN products_info p ON s.supplier_id = p.supplier_id and p.weight >= 0.15;