現如今絕大多數的應用都跟數據緊密相關,比如weixin,QQ,都需要存放大量的數據信息:聯繫人信息、發送的信息、朋友圈信息等等。這些信息絕大多數是存放在關係型數據庫中。因此,軟件測試工程師對數據庫的瞭解,是基本的要求。具體說來,測試工程師應該具備哪些知識呢?我們從測試的各個環節來講吧。
首先,你需要了解軟件的需求。軟件的需求,涉及到數據的部分,比如字段的定義,類型,長度,特別是一致性(比如,一個用戶名,在輸入的時候用到,在打印輸出的地方也會用到,在其他聯繫人的聯繫信息中也會用到)。因此,在瞭解軟件需求的時候,我們需要一個“數據字典”,作爲今後測試的基礎。
其次,設計測試用例,我們需要知道,如何獲得基礎的測試環境的預埋數據。比如,你想要測試存款功能,那麼怎麼獲得一個賬號呢?——從數據庫中查找。你需要了解:1)如何訪問數據庫,數據庫的配置信息;2)數據庫訪問的客戶端;3)sql語句;4)數據庫定義(就是你從那張表中查找數據);5)如何把查詢出來的數據“取”到本地。對照數據字典,和需求,你還需要知道這些字段有那些限制,比如數據庫的限制是否和需求一致;也可以查看是否軟件的界面等符合數據字典的要求(一致性)。
此外,在設計檢查點的時候——特別是數據庫檢查點,必須要了解你的檢查點數據如何從數據庫中查找出來?有時候不是一個table能夠包含的,就需要多個表、甚至過濾、處理數據來比對。
然後,測試用例經過了評審,需要執行了。你需要知道如何準備測試環境,最重要的部分是準備測試的基準數據環境。可能用戶會給你一個現有的數據庫,那麼需要你做數據清洗(可能),以保證客戶信息不被泄露;現有的數據,可能存在的問題是很多邊界條件沒有數據,因此還需要“造”很多數據,這就需要你熟練使用create語句來創建數據,包括使用ER圖工具來查看數據庫結構。創建基礎的數據環境完成之後,我們就需要備份這個數據庫(database),你需要熟悉數據庫的備份命令——備份是爲了恢復,因爲我們往往不會只測試一個輪次,起碼需要回歸。因此,還需要恢復數據庫的命令語句。
假設你要做自動化測試,那你要做的是把手工測試中的準備數據、數據庫檢查點,編寫成sql的語句,俗稱embed,潛入到腳本語言中。
從以上來看,我們需要熟練的掌握數據庫的知識,包括:數據字典、ER圖,查詢語句,創建數據的語句,以及如何在腳本中使用這些語句來訪問數據庫。
接下來我們來看看應該掌握哪些sql知識
一、DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)
二、DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)
三、DCL—數據控制語言(GRANT,REVOKE)
說明:本文檔的使用對象是對SQL有一些瞭解的軟件測試人員,我只是把我知道的知識結合網上的資料進行二次總結,附有SQL範例腳本。
一、DDL數據定義語言
首先,簡要介紹基礎語句,作爲測試人員一般測試時,已經由數據庫設計師建好了數據庫,數據庫設計師可能也不用語句的方式來建表,但我們應該能看懂各語句的使用格式,語句的含義,有興趣再作深入瞭解。
- 創建數據庫
CREATE DATABASE [database-name]
- 刪除數據庫
DROP DATABASE dbname1,dbname2…
- 備份數據庫
--- 創建 備份數據的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack
4、創建表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
例如: CREATE TABLE S
(SNO CHAR(10) NOT NULL ,
SN VARCHAR(20),
AGE INT,
SEX CHAR(2) DEFAULT '男' ,
DEPT VARCHAR(20));
根據已有的表創建新表:
A:create table tab_new like tab_old (使用舊錶創建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、刪除表
drop table tabname
6、增加字段
Alter table tabname
ADD <列名><數據類型>[NULL|NOT NULL]
7、修改字段
ALTER TABLE<表名>
ALTER COLUMN <列名><數據類型>[NULL|NOT NULL]
8、刪除字段
ALTER TABLE<表名>
DROP COLUMN <列名><數據類型>[NULL|NOT NULL]
9、添加主鍵
Alter table tabname add primary key(col)
10、刪除主鍵
Alter table tabname drop primary key(col)
11、創建索引
create [unique] index idxname on tabname(col….)
12、刪除索引
drop index idxname
注:索引是不可更改的,想更改必須刪除重新建。
13、創建視圖
create view viewname as [select statement ]
14、刪除視圖
drop view viewname
二、DML—數據操縱語言
1、數據查詢
數據查詢是數據庫中最常見的操作。在本文檔裏將作重點介紹。SQL語言提供SELECT語句,通過查詢操作可得到所需的信息。
SELECT語句的一般格式爲:
SELECT〈列名〉[{,〈列名〉}]
FROM〈表名或視圖名〉[{,〈表名或視圖名〉}]
[WHERE〈檢索條件〉]
[GROUP BY <列名1>[HAVING <條件表達式>]]
[ORDER BY <列名2>[ASC|DESC]];
SELECT語句的執行過程是:
根據WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結果表。
如果有GROUP子句,則將查詢結果按照<列名1>相同的值進行分組。
如果GROUP子句後有HAVING短語,則只輸出滿足HAVING條件的元組。
如果有ORDER子句,查詢結果還要按照<列名2>的值進行排序。
1.1、查詢指定列
SELECT <列名> FROM <表名或視圖名>
1.2、查詢全部列
SELECT * FROM <表名或視圖名>
或SELECT <全部列名> FROM <表名或視圖名>
1.3、取消相同取值的行
在查詢結果中有可能出現取值完全相同的行了。
SELECT DISTINCT <列名> FROM <表名或視圖名>
1.4、比較大小
比較運算符有 =,>,>=,<=,<,<>,!>,!<
NOT+上述比較運算符
SELECT <列名> FROM <表名或視圖名> WHERE <列名> [比較運算符] <比較的值>
1.5、多重條件查詢
當WHERE子句需要指定一個以上的查詢條件時,則需要使用邏輯運算符AND、OR和NOT將其連結成複合的邏輯表達式。
其優先級由高到低爲:NOT、AND、OR,用戶可以使用括號改變優先級。
SELECT <列名> FROM <表名或視圖名> WHERE <條件1> AND <條件1> OR <條件1>…
1.6、確認範圍查詢
用於確定範圍運算符有:BETWEEN…AND…和NOT BETWEEN…AND…
SELECT <列名> FROM <表名或視圖名> WHERE <列名> [NOT] BETWEEN 值1 AND 值2
這與下等價
SELECT <列名> FROM <表名或視圖名> WHERE <列名>>=值1 AND <列名><=值2
SELECT <列名> FROM <表名或視圖名> WHERE <列名><值1 OR <列名>>值2
1.7、確認集合
確定集合符號:IN,NOT IN
SELECT <列名> FROM <表名或視圖名> WHERE <列名>[NOT] IN (常量1,常量2,…,常量n)
1.8字符匹配查詢
字符匹配查詢符號:LIKE,NOT LIKE
SQL Server 2000支持如下四種通配符:
_(下劃線):匹配任意一個字符;
%(百分號): 匹配O個或多個字符;
[ ]:匹配[ ]中的任意一個字符。如[acdg]表示匹配a或c或d或g,如果[ ]中的字符是有序的,則可以使用連字符一來簡化[ ]中的內容,例如[abcde]可簡寫爲:[a-e];
[^]:不匹配[ ]中的任意一個字符。如[^acdg]表示不匹配a、c、d、g,如果[^]中的字符是有序的,也可以使用簡化形式例如[^abcde]可簡寫爲:[^a-e]。
SELECT <列名> FROM <表名或視圖名> WHERE <列名> [NOT] LIKE <匹配字符串>
1.9空值查詢
空值不同於零和空格,它不佔任何存儲空間。
判斷某個值是否爲NULL值,不能使用普通的比較運算符(一、!一等),而只能使用專門的判斷NULL值的子句來完成。
SELECT <列名> FROM <表名或視圖名> WHERE <列名> IS [NOT] NULL
1.10常用庫函數及統計彙總查詢
常用的庫函數
AVG: 按列計算平均值
SUM:按列計算值的總和
MAX:求一列中的最大值
MIN:求一列中的最小值
COUNT:按列值計算個數
總數:select count(field1) as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
注1:SQL規定,當使用計算函數時,列名不能與計算函數一起使用(除非他們出現在其他集合中)。
例如查詢年齡最大的學生的姓名和年齡,如下寫法是錯誤的:
SELECT 姓名,MAX(年齡)FROM Student
注2:計算函數不能出現在WHERE子句中。 .
例如查詢年齡最大的學生的姓名如下寫法是錯誤的:
SELECT 姓名 FROM Student WHERE 年齡=MAX(年齡)
正確的命令應爲:
SELECT 姓名,年齡 FROM Student
Where 年齡=(select max(年齡) from student)
1.11分組查詢
SELECT <列名> FROM <表名或視圖名>
GROUP BY<分組依據列>[,…n]
[HAVING<組提取條件>]
注1:分組依據列不能是text、ntext、image和bit類型的列。
注2:有分組時,查詢列表中的列只能取自分組依據列(計算函數中的列除外)
1.12對查詢結果進行排序
SELECT <列名> FROM <表名或視圖名>
ORDER BY<列名>[ASC l DESC][,…n]
1.13數據表連接查詢
A、 INNER JOIN:
這是最普通的聯接類型。只要在這兩個表的公共字段之中有相符值,內部聯接將組合兩個表中的記錄。
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];
B、left outer join:
左外連接(左連接):結果集包括連接表的匹配行,也包括左連接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
C:right outer join:
右外連接(右連接):結果集包括連接表的匹配連接行,也包括右連接表的所有行。
D:full outer join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
1.14使用TOP限制結果集
使用TOP謂詞時注意最好與ORDER BY子句一起使用,因爲這樣的前幾名纔有意義。但當使用WITH TIES時,要求必須使用ORDER BY子句。
TOP謂詞寫在SELECT單詞的後邊,查詢列表的前邊。
使用TOP謂詞的格式爲:
TOP n[percent]with ties]
其中:n爲非負整數。
TOP n:表示取查詢結果的前n行;
TOP n percent:表示取查詢結果的前n% 行;
With ties:表示包括並列的結果。
1.15將查詢結果存入表中
INTO子句的語法格式爲:
INTO 新表名
INTO子句跟在SELECT子句之後、FROM子句之前。SELECT <列名> INTO 新表名 FROM。
新表名是要存放查詢結果的表名,SELECT INTO語句包含兩個操作:首先按查詢列表創建新表,然後執行查詢語句,並將結果保存到新表中。
用INTO子句創建的新表可以是永久表,也可以是臨時表。臨時表又分爲兩種:局部臨時表和全局臨時表。局部臨時表要在表名前加#,它只能用在當前的連接中;全局臨時表要在表名前加##,它的生存期爲創建全局臨時表的連接的生存期
1.16合併查詢
使用UNION的格式爲:
SELECT 語句1
UNION
SELECT 語句2
UNION [ALL]
SELECT 語句n
使用UNION的兩個基本規則是:
A、所有查詢語句中的列個數和列的順序必須相同。
B、所有查語句中的對應列的數據類型必須兼容。
1.17子查詢
A、使用子查詢進行比較測試
使用子查詢進行比較測試時,通過比較運算符(=、!=、<、>、<=、>=),將一個表達式的值與子查詢返回的單值進行比較。如果比較運算的結果爲True,則比較測試也返回True。
使用子查詢進行的比較測試要求子查詢語句必須是返回單值的查詢語句。
例1:查詢修了"c02"課程的且成績高於此課程的平均成績的學生的學號和成績。
SELECT 學號,成績 FROM SC
WHERE 課程號=‘c02’
and 成績>( SELECT AVG(成績) from SC
WHERE 課程號=‘c02’)
B、使用子查詢基於集合的測試
使用子查詢進行基於集合的測試時,通過運算符IN和NOT IN,將一個表達式的值與子查詢返回的結果集進行比較。這同前邊在WHERE子句中使用的IN作用完全相同。使用IN運算符時,如果該表達式的值與集合中的某個值相等,則此測試爲True;如果該表達式與集合中的所有值均不相等,則返回False。
注意:使用子查詢進行基於集合的測試時,由該子查詢返回的結果集是僅包含單個列的一個列表,該列必須與測試表達式的數據類型相同。當子查詢返回結果之後,外層查詢將使用這些結果。
C、 使用子查詢進行存在性測試
使用子查詢進行存在性測試時,往往使用EXISTS謂詞。帶EXISTS謂詞的子查詢不返回查詢的數據,只產生邏輯真值和邏輯假值。
例6:查詢選修了‘‘c01”號課程的學生姓名。
SELECT 姓名 FROM Student
WHERE EXISTS
(SELECT * FROM SC
WHERE 學號=Student.學號
AND 課程號=‘c01’)
注1:帶EXISTS謂詞的查詢是先執行外層查詢,然後再執行內層查詢。由外層查詢 的值決定內層查詢的結果;內層查詢的執行次數由外層查詢的結果數決定。
上述查詢語句的處理過程爲:
(1)找外層表Student表的第一行,根據其學號的值處理內層查詢;
(2)用外層的值與內層的結果比較,由此決定外層條件的真、假值;如果爲真,則此記錄爲符合條件的結果;
(3)順序處理外層表Student表中的第2、3、…行。
注2:由於EXISTS的子查詢只能返回真或假值,因此在這裏給出列名無意義。所以在有EXISTS的子查詢中,其目標列表達式通常都用“*”。
2.數據更新
SQL語言的數據更新語句DML主要包括插入數據、修改數據和刪除數據三種語句。
2.1插入一行新記錄
INSERT INTO <表名>[(<列名1>[,<列名2>…])] VALUES(<值>)
2.2插入一行的部分數據值
只寫上部分列名,沒有寫上的列名值自動爲空,如果列是NOT NULL則必需賦值。
2.3插入多行記錄
INSERT INTO <表名> [(<列名1>[,<列名2>…])] 子查詢
2.4修改數據
UPDATE <表名>
SET <列名>=<表達式> [,<列名>=<表達式>]…
[WHERE <條件>]
2.5刪除記錄
DELETE
FROM<表名>
[WHERE <條件>]
三、DCL—數據控制語言
1、權限與角色
在SQL SERVER中,權限可分爲系統權限和對象權限。
系統權限由數據庫管理員授予其他用戶,是指數據庫用戶能夠對數據庫系統進行某種特定的操作的權力。創建一個基本表(CREATE TABLE)
對象權限由創建基本表、視圖等數據庫對象的用戶授予其他用戶,是指數據庫用戶在指定的數據庫對象上進行某種特定的操作的權力。如查詢(SELECT)、插入(INSERT)、修改(UPDATE)和刪除(DELETE)等操作。
角色是多種權限的集合,可以把角色授予用戶或其他角色。當要爲某一用戶同時授予或收回多項權限時,則可以把這些權限定義爲一個角色,對此角色進行操作。這樣就避免了許多重複性的工作,簡化了管理數據庫用戶權限的工作。
2、系統權限與角色的授予
SQL語言使用GRANT語句爲用戶授予系統權限,其語法格式爲:
GRANT <系統權限>|<角色> [,<系統權限>|<角色>]…
TO <用戶名>|<角色>|PUBLIC[,<用戶名>|<角色>]…
[WITH ADMIN OPTION]
其語義爲:將指定的系統權限授予指定的用戶或角色。
其中:PULBIC代表數據庫中的全部用戶。WITH ADMIN OPTION爲可選項,指定後則允許被授權的用戶將指定的系統特權或角色再授予其他用戶或角色。
例1: 爲用戶張三授予CREATE TABLE的系統權限。
GRANT CREATE TABLE
TO 張三
3、系統權限與角色的收回
數據庫管理員可以使用REVOKE語句收回系統權限,其語法格式爲:
REVOKE <系統權限>|<角色> [,<系統權限>|<角色>]…
FROM <用戶名>|<角色>|PUBLIC[,<用戶名>|<角色>]…
例2: 收回用戶張三所擁有的CREATE TABLE的系統權限。
REVOKE CREATE TABLE
FROM 張三
4、對象權限與角色的授予
SQL語言使用GRANT語句爲用戶授予對象權限,其語法格式爲:
GRANT ALL|<對象權限>[(列名[,列名]…)][,<對象權限>]…ON <對象名>
TO <用戶名>|<角色>|PUBLIC[,<用戶名>|<角色>]…
[WITH GRANT OPTION]
其語義爲:將指定的操作對象的對象權限授予指定的用戶或角色。
其中:
ALL代表所有的對象權限。
列名用於指定要授權的數據庫對象的一列或多列。如果不指定列名,被授權的用戶將在數據庫對象的所有列上均擁有指定的特權。
實際上,只有當授予INSERT、UPDATE權限時才需指定列名。
ON子句用於指定要授予對象權限的數據庫對象名,可以是基本表名、視圖名等。
WITH ADMIN OPTION爲可選項,指定後則允許被授權的用戶將權限再授予其他用戶或角色。
例3: 將對Sc表和student表的所有對象權限授予USER1和USER2。
GRANT ALL
ON Sc,student
TO USER1,USER2
例4: 將對Course表的查詢權限授予所有用戶。
GRANT SELECT
ON Course
TO PUBLIC
例5: 將查詢student表和修改學生年齡的權限授予USER3,並允許將此權限授予其他用戶。
GRANT SELECT,UPDATE(PROF)
ON studentT
TO USER3
WITH ADMIN OPTION
USER3具有此對象權限,並可使用GRANT命令給其他用戶授權,如下例,USER3將此權限授予USER4:
GRANT SELECT,UPDATE(年齡)
ON student
TO USER4
5、對象權限與角色的回收
所有授予出去的權力在必要時都可以由數據庫管理員和授權者收回,收回對象權限仍然使用REVOKE語句,其語法格式爲:
REVOKE <對象權限>|<角色> [,<對象權限>|<角色>]…
FROM <用戶名>|<角色>|PUBLIC[,<用戶名>|<角色>]…
例6: 收回用戶USER1對Course表的查詢權限。
REVOKE SELECT
ON C
FROM USER1
最後,大家來看一些不錯的sql語句
1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a
2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件
例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..
4、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
5、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
6、說明:日程安排提前五分鐘提醒
select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
7、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段
8、說明:前10條記錄
select top 10 * FROM table1 where 範圍
9、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
10、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
11、說明:隨機取出10條數據
select top 10 * from tablename order by newid()
12、說明:隨機選擇記錄
select newid()
13、說明:刪除重複記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
14、說明:列出數據庫裏所有的表名
select name from sysobjects where type='U'
15、說明:列出表裏的所有的
select name from syscolumns where id=object_id('TableName')
16、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3
17、說明:初始化表table1
TRUNCATE TABLE table1
18、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
19、查詢時字符串連接(用+號)
select YHDM+'['+YHMC+']' YH from yonghu
還有PL/SQL:函數,存儲過程,事務等暫時未整理,後期完善,不才望多指教,不要吝嗇評論,請多交流批評