日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库——sql-server

發布時間:2024/3/13 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库——sql-server 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • T-SQL語句的分類
      • 數據庫文件和文件組
      • 刪除和創建數據庫
      • 刪除和創建表
      • 修改表
      • 創建約束
      • 插入數據
      • 修改和刪除數據
      • 表查詢
      • 分組查詢
      • 連接查詢
      • 函數
      • 索引
      • 視圖
      • 存儲過程
      • 觸發器
      • 游標

T-SQL語句的分類

1,數據操作語句(DML):主要包括對象數據庫數據的查詢,插入,刪除,修改(select,insert,update,delete) 2,數據定義語句(DDL):對數據庫以及數據庫中的各種對象進行創建,刪除,修改(create,alter,drop) 3,數據控制語句(DCL):數據控制語句用于安全管理,確定哪些用戶能查看或修改數據庫中的數據(grant,revoke,deny)

數據庫文件和文件組

SQL Server 將數據庫文件分為三類:主數據文件,輔數據文件,日志文件。 1. 主數據文件(主文件)是數據庫的關鍵文件,是所有數據文件的起點,包含指向其他數據庫文件的指針,每個數據庫都必須有且僅有一個主文件,默認擴展名為.mdf。 2. 輔數據文件(輔文件)輔助主文件存儲數據,包含不在主文件內的其他數據,一個數據庫可以有0~n個輔文件,擴展名為.ndf。 3. 日志文件記錄存放恢復數據庫時所需要的所有日志信息,一個數據庫可有1~n個日志文件,擴展名為.ldf。 總結:一個數據庫必須至少包含一個主數據文件和一個日志文件。SQL Server 為了更好的管理數據文件,提供了文件組概念,分為兩種:主文件組(PRIMARY)和用戶定義文件組。 1. 主文件組(PRIMARY)存放主數據文件和任何沒有明確指定文件組的其他文件。 2. 用戶定義文件組是在創建或修改數據庫時用FILEGROUP關鍵字定義的文件組,存放輔數據文件。 文件組特性: (1)一個文件只能屬于一個文件組。 (2)只有數據文件才能歸屬于某個文件組,日志文件不屬于任何文件組。 (3)每個數據庫中都有一個默認的文件組在運行,可以指定默認文件組,沒有指定的話,則默認為主文件組。 (4)若沒有用戶定義文件組,則所有的數據文件都存放在主文件組中。

刪除和創建數據庫

use master go create database testNewbase--創建數據庫在 on primary (name='testNewbase',filename='D:\SQLsever\testNewbase.mdf',size=5MB,filegrowth=1MB ) log on (name='testNewbase_log',filename='D:\SQLsever\testNewbase.ldf',size=1MB,filegrowth=10% ) godrop database testNewbase--刪除數據庫 go

刪除和創建表

--創建產品表 create table productInfos (Id int identity(1001,1) primary key not null, --標識種子(起始位置),增量proNo varchar(50) not null,proName nvarchar(50) not null,TypeId int not null,price decimal(18,2) default 0.00 null,proCount int default 0 null --加個默認值0 ) godrop table productInfos go--創建產品類型表 create table ProductType (TypeId int identity(1,1) primary key not null,TypeName nvarchar(20) not null ) go

修改表

--添加一列 alter table ProductInfos add ProRemark nvarchar(max) null --刪除一列 alter table ProductInfos drop column ProRemark --修改一列 alter table ProductInfos alter column Prono nvarchar(50) null--將數據類型和是否為空都改變了 --修改列名 exec sp_rename'ProductInfos.procount','count','column'--謹用

創建約束

--五種約束:主鍵約束,外鍵約束,unique約束,check約束,default約束在建表的過程中創建約束: --主鍵約束primary key --外鍵約束foreign key references 另一個表(列名) create table productInfos (Id int identity(1001,1) primary key not null, proNo varchar(50) not null,proName nvarchar(50) not null,TypeId int not null foreign key references ProductType(typeid),--在這里進行外鍵約束,與另一個表進行關聯price decimal(18,2) default 0.00 null,proCount int default 0 null --加個默認值0 ) go --唯一約束unique --default約束default()有必要的話加單引號 --check約束check(Price<1000)在建表后創建約束(別忘了需要選則列來進行創建約束) 主鍵約束id:alter table productInfos add constraint PK_ProductInfos primary key(Id) 外鍵約束typeid:alter table productinfos add constraint fk_productinfos foreign key(typeid) references producttype(typeid) unique約束:alter table productinfos add constraint uk_productinfos unique(prono) default約束:alter table productinfos add constraint dk_productinfos_procount default(0) for procount check約束:alter table productinfos add constraint ck_productinfos check(price<10000)

插入數據

這些插入的前提都是有標識列,所以可以直接加。如果有標識列,那么就可以忽略標識列,直接寫插入的其他列的內容,如果沒有標識列,那么就需要全寫。 1,單數據插入 insert into producttype (typename) values('工具類') insert producttype (typename) values('鞋子類') insert producttype (typename) select('襪子類') 2,多數據插入 insert producttype(typename) values('工具類1'),('工具類2'),('工具類3') 這個前提是沒有標識列,而是三列(id,mname,age) insert test1(id,mname,age) select 1,'admin1',15 union select 2,'admin2',16 union select 3,'admin3',17 union select 4,'admin4',18 --ps:union和union all相比是有去重的功能的(有重復的就自動刪除了), 而union all允許插入相同的數據,所以效率較高 3,克隆表數據(前提,test1表中有name列,producttype表中有typename列) 第一種(目標表和源表都存在都存在數據庫中):insert into test1(mname) select typename from producttype 第二種(目標表不存在的情況下):select typename into test2 from producttype

修改和刪除數據

數據修改: update test1 set mname = 'sss',age = 20 where id = 5--如果不加where那么所有的列都會進行改變,注意主鍵是不能修改的,where后面的條件可以使用and或者or進行連接。數據刪除: (1)只是刪除數據,表還在delete from table 如果不加條件where,那么就會刪除整張表中所有數據。如果有標識列,即使所有數據刪除,再插入時標識列的值保持之前的值并增加。標識列的缺點delete from test1 where id = 10如果想刪除數據的同時使標識列回復初始值truncate table test1(2)數據和表一起刪除

表查詢

查詢一個表中的所有數據:select * from table 查詢一個表中的部分列的數據:select id,age from table

分組查詢

select 客戶號 ,count(1) 數量 from 訂單表 --每個客戶號對應的數量 group by 客戶號比較完整的結構: select 部門編號,count(1) 用戶數 from UserInfos where Age>26--分組前的篩選 group by 部門編號 having 部門編號>1 --分組后的篩選 order by 部門編號 desc

連接查詢

定義:根據兩個或多個表之間的關系,從這些表中查詢數據 分類:內連接,外連接,全連接,交叉連接 內連接:(顯示) select m.訂單號,單價,訂購日期 from 訂單明細表 m inner join 訂單表 n on m.訂單號=n.訂單號 --通過訂單號將兩個表進行關聯(兩個表中的相同部分) where 單價>500 內連接:(隱式) select m.訂單號,單價,訂購日期 from 訂單明細表 m ,訂單表 n where m.訂單號=n.訂單號 and 單價>500外連接: 左外連接:左表顯示所有行,右表的行數與坐標保持一致,否則補null select * from 訂單表 m --這個是左表 left join 訂單明細表 n --這個是右表 on m.訂單號 = n.訂單號右外連接: select * from 訂單表 m --這個是左表 r join 訂單明細表 n --這個是右表 on m.訂單號 = n.訂單號全連接:顯示兩個表的所有行,匹配不上的是nullselect * from 訂單表 n full join 訂單明細表 m on n.訂單號 = m.訂單號交叉連接:如果不帶where子句,返回的行數是兩個表行數的乘積。如果帶where子句,等價與inner join返回的數據。 select * from 訂單表 n cross join 訂單明細表 m where n.訂單號 = m.訂單號

函數

avg()select avg(sal) 平均工資,avg(comm) 平均獎金 from emp;--生成兩列:平均工資和平均獎金 sun():select sum(sal) 總工資,sum(comm) 總獎金 from emp; --生成兩列:總工資和總獎金 max():select max(sal) 最高工資,max(comm) 最高獎金 from emp;--生成兩列:最高工資和最高獎金 min():select min(sal) 最低工資,min(comm) 最低獎金 from emp;--生成兩列:最低工資和最低獎金 count(): select count(distinct deptno) 部門總數,count(deptno) "部門總數?",count(empno) 員工總數 from emp;--distinct去重數據類型的轉換: select 'ab'+convert(varchar,2)--將2轉化成字符串進行拼接 select cast(2 as varchar)字符串操作函數: 返回字符串中指定的字串開始的位置:select charindex('bc','abcde')select patindex('%bc%','abcde') 將字符串變大寫:select upper('abE') 將字符串變小寫:select lower('abE') 取長度:select len('ABC') 去掉左邊的空格:select ltrim(' adb ') 去掉右邊的空格:select rtrim(' adb ') 取子串:從左邊開始取select left('abcde',3),結果是abc。從右邊開始取select right('abcde',3),結果是cde。從規定位置開始取select substring('abcde',2,3)從第二個開始,取三個 重復:select replicate('abc',4),將規定字符串重復4次 顛倒:select reverse('abc') 替換指定的字符串:select replace('abcde','cd','aa')將cd子字符串替換成aa 替換指定位置,指定長度的字符串:select stuff('abcde',2,3,'tt'),結果是atte自定義函數: 分類:標量函數,內嵌表值函數,多聲明表值函數 標量函數:對單一值的操作,返回的是單一值。 內嵌表值函數:參數化的視圖,返回的是一個表。沒有begin end包裹。 多聲明表值函數:返回的也是一個表,有begin end包裹的函數體。返回的表數據是由函數體的語句插入的,多次查詢,甚至可以多次篩選與合并,彌補了內嵌表值函數的不足。構造標量函數: create function [dbo].getdingdanhao(@客戶號2 char(6))--這里可以直接為@客戶號2指定默認值:(@客戶號2 char(6) = 'A00112') returns char(6) as begindeclare @訂單號2 char(6)select @訂單號2 = 訂單號 from 訂單表 where 客戶號 = @客戶號2return @訂單號2 end go --調用函數 select dbo.getdingdanhao('A00112') as 新的列名--可以為結果取個新的列名 如果已經指定了默認值,那么就可以直接調用: select dbo.getdingdanhao(default) as 新的列名構造內嵌表值函數: create function [dbo].getinfo(@訂單號2 char(6)) returns table as return(select 訂單號,客戶號,訂購日期 from 訂單表where 訂單號 = @訂單號2 ) go --調用: select * from dbo.getinfo('OR-22A')構造多聲明表值函數(多語句表值函數) create function [dbo].search(@訂單號2 char(6)) returns @要求訂單 table(客戶號 char(6) not null primary key,訂單號 char(6) not null ,訂購日期 date null ) as begininsert into @要求訂單(客戶號,訂單號,訂購日期)select 客戶號,訂單號,訂購日期 from 訂單表where 訂單號 like '%'+@訂單號2+'%'return end go --調用函數: select * from dbo.search('OR-22A')

索引

作用:數據的查詢,處理速度,可以快速的查找到數據,不必要掃描整個表,減少系統的響應時間 缺點:并不是越多越好,占用存儲空間。 聚集索引:Clustered 邏輯順序和物理順序是一致的(效率較高),一個表中只有一個或一個也沒有,例如:主鍵 非聚集索引:NonClustered 邏輯順序和物理順序不是一致的,一個表中可以右多個,例如:唯一索引 如果需要多個列上建立組合索引,這些列建立組合索引。使用腳本創建索引 創建聚集索引 create clustered index pk_infos --如果不指定,默認是非聚集索引 on 訂單表(客戶號) with (drop_existing=on--on表示如果存在的話,就刪除重新創造,off表示不管存不存在,直接重新創造 ) 創建唯一非聚集索引 create unique nonclustered index uq_infos on 訂單表(訂單號) 創建復合索引 create nonclustered index index_infos --如果不指定,默認是非聚集索引 on 訂單表(客戶號,訂單號) with (drop_existing=off--on表示如果存在的話,就刪除重新創造,off表示不管存不存在,直接重新創造 )

視圖

視圖:是虛擬表,由一個表或多個表通過查詢而定義的,將查詢定義保存起來,實際不包含數據。 與表的區別:表存儲數據的地方,視圖存儲的是查詢語句。 作用:簡化查詢,增加了數據的保密性 缺點:只是簡化查詢,并不提高查詢速度,增加了維護成本。 分類:標準視圖:存儲查詢定義,沒有存儲數據索引視圖:(被具體化了的視圖,創建了索引,可以提高查詢性能)不適合經常更新基本數據表(數據是實際存在的,刪除視圖中的數據,基礎表中的數據也被刪除)分區視圖:一臺或多臺服務器水平連接一組成員表的分區數據 創建標準視圖: create view vdingke as select k.客戶號,訂單號 from 客戶表 k inner join 訂單表 d on k.客戶號 = d.客戶號 go 使用視圖:select * from vdingke 后面還可以加where條件和order by 客戶號 desc創建索引視圖: create view vdingke_index with schemabinding--查詢訂單表中的這兩個列的信息 as select 客戶號,訂單號 from dbo.訂單表--dbo統一的所有者 go 使用視圖:select * from vdingke_index 索引視圖創建唯一聚集索引: create unique clustered index uq_vdingke_index on vdingke_index(訂單號) --這里是視圖中的列 go創建分區視圖--這個查詢合并表數據,必須要保證兩個表中的列是相同的。 create view vtestinfos as select * from test1 union all select * from test2 go 使用:select * from vtestinfos

存儲過程

為了完成特定功能的一個或一組sql語句集合,經編譯后存儲在服務器端的數據庫中,可以利用存儲過程加速sql語句執行。調用名稱,傳入參數,執行來完成特定功能。 分類:系統存儲過程:master數據庫中,在其他數據庫中可以直接調用。并且使用時不必加上數據庫名,這些系統存儲過程已經在新的數據庫中自動創建。自定義存儲過程:用戶自己創建,完成特定的功能,可以傳入參數,也可以有返回值 優點:提高應用程序的通用性和可移植性。多次調用,不必重新編寫,維護人員可以隨時更改。更有效的管理數據庫的權限。提高執行sql的速度(一次編譯,多次執行。)減輕服務器的負擔。 缺點:專門維護他,占用數據庫空間。 創建存儲過程: 無參數的存儲過程: create proc searchuserinfos as begin select * from 訂單表/查視圖也可以(vdingke_index) select 客戶號 from 訂單表 end 如果要修改存儲過程,就直接將create改成alter就可以了。 alter proc searchuserinfos as begin select * from vdingke_index select 客戶號 from 訂單表 end 執行存儲過程: exec searchuserinfos 刪除存儲過程:drop proc searchuserinfos創建帶參數的存儲過程--新增一個信息,是訂單表中的(客戶號,訂單號,訂購日期) create proc adddingdan @客戶號 char(6), @訂購日期 date as begindeclare @訂單號 char(6)--如果要自己定義訂單號變量set @訂單號 = 'abcdef'insert into 訂單表(客戶號,訂單號,訂購日期)values(@客戶號,@訂單號,@訂購日期)select * from 訂單表 end go 執行存儲過程: exec adddingdan 'A11111','2002-8-24'如果不自定義變量: alter proc adddingdan @客戶號 char(6), @訂單號 char(6), @訂購日期 date as begininsert into 訂單表(客戶號,訂單號,訂購日期)values(@客戶號,@訂單號,@訂購日期)select * from 訂單表 end goexec adddingdan 'A11111','C22222','2002-8-24'也可以在其中加入別的修改內容,比如刪除某些行 alter proc adddingdan @客戶號 char(6), @訂單號 char(6), @訂購日期 date as begininsert into 訂單表(客戶號,訂單號,訂購日期)values(@客戶號,@訂單號,@訂購日期)delete from 訂單表 where 客戶號 = 'A11111'select * from 訂單表 end goexec adddingdan 'A11112','C22222','2002-8-24'

觸發器

是一種特殊類型的存儲過程,不同的是存儲過程是通過調用名稱執行,而是通過一個事件來觸發的。 對表進行操作,插入,更新,刪除,自動執行觸發器。 分類:DDL觸發器(createalterdrop)DML觸發器(insertupdatedelete)其中,DML觸發器又分為兩種:after觸發器,在執行這個操作之后再執行觸發器操作。(insertupdatedelete)instead of觸發器,不執行操作,而執行觸發器操作。(insertupdatedelete

這兩個臨時表不要進行修改

after觸發器:對表操作以后觸發after insert觸發器:在插入操作以后觸發。 create trigger trigger_ke_insert on 客戶表 for insert asdeclare @客戶號2 varchar(20),@客戶名2 varchar(20)select @客戶號2 = 客戶號 ,@客戶名2 = 客戶名 from inserted--存放要插入的數據的表print convert(varchar ,@客戶號2)+','+@客戶名2+'添加成功!'; go--觸發:trigger_ke_insert insert into 客戶表(客戶號,客戶名,地址,電話) values('bb123','xiaoming','020802','110119') 最后的結果就是bb123 ,xiaoming 添加成功! 修改觸發器,用alterafter update觸發器:在修改以后觸發。如果想要的結果是即打印修改前的,又打印修改后的數據。 create trigger trigger_ke_update on 客戶表 for update asdeclare @客戶號2 varchar(20),@客戶名2 varchar(20)select @客戶號2 = 客戶號 ,@客戶名2 = 客戶名 from deleted--存放更新前的表print '修改前:'+convert(varchar ,@客戶號2)+','+@客戶名2;--這里如果數據類型不是varchar而是int再用convert,這里沒必要用。select @客戶號2 = 客戶號 ,@客戶名2 = 客戶名 from inserted--存放更新后的表print '修改后:'+convert(varchar ,@客戶號2)+','+@客戶名2;--這里如果數據類型不是varchar而是int再用convert,這里沒必要用。--select * into dd from deleted--將修改前的數據進行備份到dd表中。 go --觸發:update 客戶表 set 客戶號='bb123',客戶名='xiaogang' where 電話 = '110119' 結果就是:修改前:bb123 ,xiaoming 修改后:bb123 ,xiaogang 注意,如果要打印的是三個數據,但是修改的是兩個數據,那一個沒有修改的數據也是需要將他用變量命名的(在declareselectprint中,只是觸發的時候不用管他。)after delete觸發器:在刪除以后的觸發器,可以在deleted表中看見刪除的數據,可以對其備份,打印等。 create trigger trigger_ke_delete on 客戶表 for delete asdeclare @客戶號2 varchar(20),@客戶名2 varchar(20)select @客戶號2 = 客戶號 ,@客戶名2 = 客戶名 from deleted--存放更新前的表print '要刪除:'+convert(varchar ,@客戶號2)+','+@客戶名2;--這里如果數據類型不是varchar而是int再用convert,這里沒必要用。--可以對其進行備份--如果目標表不存在select * into dd from deleted print '備份成功' go--觸發:delete from 客戶表 where 客戶號 = 'bb123'--instead of insert觸發器 不執行insert,執行的是觸發器中的操作,但是在執行之前,臨時表還是會改變的 create trigger trigger_insteadof_insert on 客戶表 instead of insert asdeclare @客戶號2 varchar(20),@客戶名2 varchar(20)select @客戶號2 = 客戶號 ,@客戶名2 = 客戶名 from inserted--存放插入的表print '要添加:'+convert(varchar ,@客戶號2)+','+@客戶名2;--這里如果數據類型不是varchar而是int再用convert,這里沒必要用。go--進行觸發: insert into 客戶表(客戶號,客戶名,地址,電話)values('bb123','xiaoming','020802','110119')結果就是:要添加:bb123 ,xiaoming ,其中標識列是不會改變的,因為實際上并沒有向表中增加新的數據,insert操作沒有執行,但是inserted表中是有要插入的數據的,觸發器中的操作就是打印一下inserted表中的數據。

游標

對數據查詢的結果集的一種訪問機制,用戶對結果集進行逐條訪問(單條數據) 對象:結果集 游標:定義在結果集上的一個指針(可以控制這指針來遍歷這個結果集) 缺點:數據讀取出來放到TempDB里,放到內存中 --內存空間有限,不可以太大,內存空間不足。分類:靜態,動態,只進靜態:結果集,對數據庫如何操作,結果集都不會改變。如果想要結果集和數據庫改變保持一致,必須要關閉這個游標,重新打開。在檢測的時候是檢測不到數據的變化,消耗的資源相對比較少。動態相反。--一般選擇靜態游標 動態:與靜態相對的,前后滾動,結果集會獲取所有的改變,提取時,對數據庫的操作都可以通過游標可見。 只進:不支持前后滾動,只支持從頭走到尾,對數據庫進行的更改是可見的,但是不可以滾動。如果在修改前就讀取到了,那么在修改后,前面讀到的數據也不會進行修改。(在提取后所作的更改是不可見的。)--效率比靜態還高游標的生命周期: 聲明-打開-讀取數據-關閉游標-釋放游標--創建只進游標: declare dingdan_cursor cursor local --local表示局部,global表示全局游標 for select 客戶號,客戶名 from 客戶表--這里可以加where條件--打開游標open dingdan_cursor declare @vardingdan cursor,@客戶號2 varchar(20),@客戶名2 varchar(20) --定義單行數據游標和要用到的變量set @vardingdan = dingdan_cursorfetch next from @vardingdan into @客戶號2 , @客戶名2--向后提取數據(prior 向上,first 第一個,last 最后一個,absolute n絕對位置,relative n從當前開始第一個,這里只能是next,因為是只進)while @@FETCH_STATUS = 0--判斷是否執行成功begin print @客戶號2+','+@客戶名2fetch next from @vardingdan into @客戶號2 , @客戶名2end--關閉游標:close dingdan_cursor--釋放游標deallocate dingdan_cursor結果:A00112,四環科技發展公司 B20001,薩特高科技集團 B21001,愛心生物工程公司 C10001,三益貿易公司 C10005,比特電子工程公司 C20111,一得信息技術公司 在beginend中可以對表進行修改if @客戶號2 = 'B20001'update 客戶表 set 客戶名 = '新公司' where 客戶號= 'C10001' --靜態游標:表的改變是不可見的,結果集是不變的。 創建靜態游標:declare dingdan_cursor_static cursor static local --local表示局部,global表示全局游標 for select 客戶號,客戶名 from 客戶表--這里可以加where條件open dingdan_cursor_staticdeclare @vardingdan cursor,@客戶號2 varchar(20),@客戶名2 varchar(20) --定義單行數據游標和要用到的變量set @vardingdan = dingdan_cursor_staticfetch next from @vardingdan into @客戶號2 , @客戶名2--向后提取數據(prior 向上,first 第一個,last 最后一個,absolute n絕對位置,relative n從當前開始第一個,這里只能是next,因為是只進)while @@FETCH_STATUS = 0--判斷是否執行成功begin print @客戶號2+','+@客戶名2if @客戶號2 = 'B20001'update 客戶表 set 客戶名 = '新公司' where 客戶號= 'C10001' fetch next from @vardingdan into @客戶號2 , @客戶名2end--關閉游標:close dingdan_cursor_static--釋放游標deallocate dingdan_cursor_static動態游標:對數據庫的改變是可見的。 將static改成dynamic

總結

以上是生活随笔為你收集整理的数据库——sql-server的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。