在軟件測試中,數據庫是必備知識,假期閑里偷忙,整理了一點學習筆記,共同探討。
閱讀目錄
基本知識
數據庫到底是有什么作用?看下圖應該就明白了。
就是應用程序發送請求操作時,到服務器數據庫中查詢數據,然后再返回給應用程序。
數據庫起到的作用是存儲數據、檢索數據、生成新的數據,相對應的要求是:統一、安全、性能。
數據庫可以存儲大量數據,方便檢索和訪問,能保持數據信息的一致、完整,共享和安全,通過組合分析,產生新的有用信息。
數據庫發展史
萬物生長,如今使用的數據庫也不是一蹴而就,也是慢慢發展而來。可分為四個階段:
①萌芽階段—文件系統,只是使用磁盤文件來存儲數據
②初級階段—第一代數據庫Access,是網狀模型和層次模型數據庫
③中級階段—第二代數據庫SQL server、Mysql,是關系型數據庫和結構化查詢語言
④高級階段—新一代數據庫Oracle,是“關系-對象”型數據庫
當下最流行的數據庫是Oracle、SQL server、DB2
Oracle是“關系-對象”型數據庫,它的特點是產品免費、服務收費
SQL server是關系型數據庫,多版本,易用性好
DB2支持多操作系統、多種類型的硬件和設備
數據庫名詞
DBA-----數據庫管理人員
DB-------數據庫
DBMS--數據庫管理系統
系統數據庫:master、model、tempdb、msdb,不能隨意更改
數據文件為.mdf或.ndf
日志文件為.ldf
數據的默認路徑為:C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data
SQL組成
DML(數據操作語言)
——查詢、插入、刪除和修改數據庫中的數據;
——SELECT、INSERT、 UPDATE 、DELETE等;
DCL(數據控制語言)
——用來控制存取許可、存取權限等;
——GRANT、REVOKE 等;
DDL(數據定義語言)
——用來建立數據庫、數據庫對象和定義其列
——CREATE TABLE 、DROP TABLE 等
TCL (事務控制語句)
變量說明、流程控制、功能函數
——定義變量、判斷、分支、循環結構等
——日期函數、數學函數、字符函數、系統函數等
數據庫基本操作
登錄數據庫
在安裝成功后,在開始菜單中會看到如下所示文件夾:
點擊SQL server management studio,即可出現如下登錄界面:
數據庫遠程連接設置
第一步,打開外圍配置器設置
第二步,進行相應設置
第三步,進行連接操作
數據庫的分離操作
分離是指默認情況下數據庫在聯機狀態下我們不能對數據庫文件進行任何復制刪除等操作,如果將數據庫分離的話就可以對數據文件進行復制、剪切、刪除等操作了。一般想直接備份數據文件,就先分離數據庫,之后把數據文件復制到別的地方,再把數據文件附加回去就可以了。
操作如下所示:
先將數據庫進行分離操作:
完成上述操作,數據庫便分離成功,然后就可以做相應的復制等操作了。
分離也可以使用代碼實現,如下
sp_detach_db demo
再將分離的數據庫附加到工作面板:
附加也可以使用代碼實現,如下:
sp_attach_db demo
數據庫的脫機、聯機操作
脫機與聯機是相對操作,先要有脫機才能執行聯機操作,與分離不同的是,脫機后的數據庫只是不能被訪問了,但還在工作面板中,但分離后的數據庫,是不存在工作面板中的。當要再想使用該數據庫,脫機狀態的數據庫只需要聯機即可,分離的數據庫需要附加才可以。
脫機操作如下:
脫機也可使用代碼實現,代碼如下:
alter database demo set offline
聯機操作如下:
聯機也可使用代碼實現,代碼如下:
alter database demo set online
數據庫收縮操作
收縮是把數據庫以及日志的內存收縮
操作如下
收縮數據庫操作:
收縮日志文件操作:
收縮文件也可使用如下命令:
DBCC ShrinkFile('數據庫名', targetsize); /* 收縮數據庫文件 */ DBCC ShrinkFile('數據庫名_log', targetsize); /* 收縮日志文件 */
需要注意的是:
Targetsize:單位為兆,必須為整數,DBCC SHRINKFILE 嘗試將文件收縮到指定大小。
DBCC SHRINKFILE 不會將文件收縮到小於“實際使用的空間”大小,例如“分配空間”為10M,“實際使用空間”為6M,當制定targetsize為1時,則將該文件收縮到6M,不會將文件收縮到1M。
收縮數據庫可使用如下命令:
DBCC SHRINKDATABASE(數據庫名,百分比)
此處的百分比:即“收縮后文件中的最大可用空間”,取值范圍“大於等於0, 小於100%”,實際使用中設為0即可。
數據庫的備份、還原操作
備份操作是為了保證數據的完整性以及避免異常操作而導致數據無法挽回的操作,個人覺得是非常非常有必要的。
數據庫的備份分為如下幾種:
完全備份: 備份全部選中的文件夾,並不依賴文件的存檔屬性來確定備份那些文件。(在備份過程中,任何現有的標記都被清除,每個文件都被標記為已備份,換言之,清除存檔屬性)。完全備份也叫完整備份。
差異備份: 差異備份是針對完全備份:備份上一次的完全備份后發生變化的所有文件。(差異備份過程中,只備份有標記的那些選中的文件和文件夾。它不清除標記,即:備份后不標記為已備份文件,換言之,不清除存檔屬性)。
事務日志備份: 在特定事務日志備份之前執行的完整數據庫備份和上次差異備份(如果有)。在完整數據庫備份之后執行的所有事務日志備份或在特定事務日志備份之前執行的差異備份(如果您還原了差異備份)。如果你設置了恢復模式為【簡單】,你將無法使用【事務日志】備份。SQL Server 2000 和 SQL Server 2005: 創建事務日志備份,您必須使用完整恢復或大容量日志記錄恢復模型。
備份操作如下,此處選擇的是完整備份:
還原數據庫操作
權限設置
權限設置就是設置登錄名和用戶名操作。
登錄名與用戶名的區別:
1.登錄名是指可以使用新建的登錄名和密碼登錄數據庫這個程序軟件,但不能打開或展開用戶自己創建的數據庫;
2.用戶名是在登錄名基礎上,為用戶自己創建的數據庫新加的可查看用戶,但要進行增查改刪操作仍然需要為該用戶添加使用權限。用戶名可以與登錄名相同,也可以不同。一個數據庫可以擁有多個用戶,一個用戶也可以訪問多個數據庫。
先以sa為登錄名登錄做如下操作:
創建登錄名:
使用剛創建的登錄名登錄,去使用由sa用戶創建的數據庫,發現不可用:
創建用戶,分配權限
添加好后就可以對sa創建的數據庫進行操作了
基本語法
說了這么多,再來看數據庫語法怎么操作,數據庫四大操作,就是增刪改查。在做這些操作的時候,首先得要有個數據庫,有張表,這樣才可以操作。把問題簡單化,想成平時的檔案室。數據庫就是檔案室,可以存放很多檔案,表就是檔案袋中的文件。
創建數據庫
建數據庫和建表操作可手動創建,也可以使用代碼創建,先看手動創建:
手動創建數據庫操作如下:
完成上述兩步就已經創建好一個數據庫了。
在使用代碼操作的時候,需要先做如下所示操作,並連接:
使用代碼創建數據庫,實現如下:
create database demo
use demo
還有一種創建數據庫語法,就是指定數據庫文件參數和日志文件參數,語法如下:
create database 數據庫名 on [primary] ( <數據文件參數> [,…n] [<文件組參數>] ) [log on] ( <日志文件參數> [,…n] )
舉例如下:
CREATE DATABASE stuDB ON PRIMARY --默認就屬於PRIMARY主文件組,可省略 ( NAME='stuDB_data', --主數據文件的邏輯名 FILENAME='D:\project\stuDB_data.mdf', --主數據文件的物理名 SIZE=5mb, --主數據文件初始大小 MAXSIZE=100mb, --主數據文件增長的最大值 FILEGROWTH=15% --主數據文件的增長率 ) LOG ON ( NAME='stuDB_log', FILENAME='D:\project\stuDB_log.ldf', SIZE=2mb, FILEGROWTH=1MB ) GO
若一次性要創建多個數據庫或多個日志文件,在小括號外加個,號即可
創建表
手動創建表,操作如下:
保存輸入表名即可
使用代碼創建表如下:
代碼為:
create table demo ( nname nchar(10), age tinyint, sex int )
數據庫和表已經創建好了
首先來看增
1、插入一條數據:
方法一:安照列名依次給出數據值,不能交換順序,數據類型不能出錯
insert into demo
values
('zhang',25,1)
方法二:
insert into demo
(nname,age,sex)
values
('san',18,0)
方法三:交換順序,數值按照列名給就行
insert into demo
(nname,sex,age)
values
('san',1,22)
方法四:沒給數值的列顯示null
insert into demo
(nname)
values
('li')
2、插入多條數據:
使用select,union是指連接的意思
insert into demo(nname,age,sex)若不寫列名,則默認插入所有列數據 select 'wang',28,0 union select 'wu',30,1
3、插入一列
alter table demo add sex int
4、復制demo表中數據到demo1表中:
insert into demo1(nname,nage,asex)
select nname,age,sex
from demo
注意事項
1:每次插入一行數據,不可能只插入半行或者幾列數據,因此,插入的數據是否有效將按照整行的完整性的要求來檢驗;
2:每個數據值的數據類型、精度和小數位數必須與相應的列匹配;
3:不能為標識列指定值,因為它的數字是自動增長的;
4:如果在設計表的時候就指定了某列不允許為空,則必須插入數據;
5:插入的數據項,要求符合檢查約束的要求
6:具有缺省值的列,可以使用default(缺省)關鍵字來代替插入的數值
其次來看刪
刪除某一行:
delete from demo
where nname='li'
刪除某一列:
alter table demo
drop column sex
刪除整張表:
delete from demo --不加where條件就是刪除整個表
清空整張表:
truncate table demo
注意:刪除整張表操作和清空整張表操作對比
刪除是刪除了所有,包括表結構
清空只是清空了表中數據,但表結構還在,清空速度快些
刪除數據庫
drop database new
還可以先查詢是否有該數據庫,再做刪除操作,代碼如下:
if exists(select * from sys.databases where name='new') drop database new
做了一個if判斷,sys.databases是指整個系統數據庫,刪除數據庫的前提條件是,要刪除的這個數據庫沒有被使用
然后來看改
update demo set age='28' where nname='zhang'
set是設置要改的數據
改多列數據:
update demo set nname='zhao', age='13', sex='0' where nname='li'
最后就是查詢
查詢表中所有數據,*代表所有列:
select *
from demo
查詢表中某一行所有數據:
select *
from demo
where nname='li'
查詢表中某一行某一列的數據:
select age
from demo
where nname='li'
查詢出來的結果列用as取別名:
select age as '年齡'
from demo
where nname='li'
查詢出來的結果列用=取別名:
select wname = nname
from demo
注意:wname是新列名,nname是表中已存在的列名
添加約束
約束目的:保證數據的完整性和有效性
約束分為如下幾種:
1.主鍵約束:唯一非空(特點) primary key PK_
一個表里面只能存在一個主鍵
允許存在把兩列作為一個主鍵
2.默認約束:默認值 default key DK_
當不填數據時默認采用設定好的值
3.唯一約束:數據不重復,允許一行數據為空 Unique Key 唯一允許一個為空
4.檢查約束:用來檢查填入的數據是否滿足要求 Check Key
5.非空約束:不能為空 not null
6.外鍵約束:外鍵指的是,表A中的id為主鍵,但在表B中id不是主鍵,表A的id就是表B的id外鍵。
外鍵語法:
alter table 表名 add constraint FK_字段名--"FK"為外鍵的縮寫 foreign key (字段名) references 關聯的表名(關聯的字段名) --注意'關聯的表名'和'關聯的字段名'
添加約束有三種方式,分別是建表中(在列名中添加和不在列名中添加),建表后
方法一:建表中在列名中添約束,語法為:列名 數據類型 約束條件,代碼如下:
create table dome5 ( sid smallint primary key, sname nchar(10) not null default 'zhangsan', saddre nvarchar(20), sage tinyint unique key, semail char(20) check (semail like '%@%.%'), createtime datetime default getdate() )
方法二:建表中不在列名中添加約束,語法為:constraint 約束名 約束語法,代碼如下:
create table stdent2 ( sid int, sname nchar(15) not null default 'zhangsan', saddress nvarchar(30), sage tinyint, semail char(20), stime datetime default getdate(), constraint PK_sid primary key(sid), constraint CK_sage check (sage>10), constraint CK_semail check (semail like '%@%.%') )
需要注意的是:默認約束只能在 列名 數據類型 后面添加,意思就是默認約束要使用在方法一添加
方法三:建完表后再添加約束,代碼如下:
alter table stu
add constraint ck_ssex check (ssex=0 or ssex=1)
alter是修改表結構
數據類型
數據類型如下表所示:
分類 |
備注和說明 |
數據類型 |
說明 |
二進制數據類型 |
存儲非字符和文本的數據 |
Image |
可用來存儲圖像 |
文本數據類型 |
字符數據包括任意字母、符號或數字字符的組合 |
Char |
固定長度的非 Unicode 字符數據,效率高 |
Varchar |
可變長度非 Unicode 數據,節省空間 |
||
Nchar |
固定長度的 Unicode 數據 |
||
Nvarchar |
可變長度 Unicode 數據 |
||
Text |
存儲長文本信息 |
||
Ntext |
存儲可變長度的長文本 |
||
日期和時間 |
日期和時間在單引號內輸入 |
Datetime |
日期和時間 |
數字數據 |
該數據僅包含數字,包括正數、負數以及分數 |
Bigint、int、smallint、tinyint |
整數 |
float、real |
數字 |
||
貨幣數據類型 |
用於十進制貨幣值 |
Money |
|
數值類型 |
例:stuid numeric(18,0),代表18位數字,小數位數為0,屬於浮點類型 |
numeric (18,0) |
|
標識列 |
identity(起始值,遞增量) |
identity(1,1) |
自動遞增 |
Bit數據類型 |
表示是/否的數據 |
Bit |
存儲布爾數據類型 |