SQL的積累學習(不經常使用的常常會忘記,因此之後用到的就會記在下面):sql
--新增字段
alter table t_Student add Test varchar(200)
--刪除字段
alter table t_Student drop COLUMN Test
--修改字段類型
alter TABLE t_Student alter column Test VARCHAR(100)
--修改字段名稱
exec sp_rename 't_student_2019._Test','!_Test' --exec sp_rename '表名.列名','新列名'
--修改表名
exec sp_rename 't_Student','t_student_2019'
--刪除主鍵約束
alter table t_student_2019 drop constraint [PK__t_Studen__3214EC07267ABA7A]
--新增主鍵約束
alter TABLE t_student_2019 add CONSTRAINT [PK_T_Student_Id_Name] primary key(Id,Name)
--刪除外鍵約束
alter table t_student_2019 drop constraint [FK__t_Student__TId__286302EC]
--新增外鍵約束
alter table t_student_2019 add constraint [FK_T_Student_2019_TId] foreign key (TId) references t_test(Id)
--新增惟一約束
alter table t_student_2019 add constraint [UN_T_student] unique([Id],[Name])
--給字段加註釋
exec sp_addextendedproperty 'MS_Description','huageTest','SCHEMA','dbo','table','t_student_2019','column','Name'
--系統表
select * from sys.objects where type='U' --全部用戶表
select * from sys.syscolumns where id=613577224 --全部字段
select * from sys.extended_properties where major_id= OBJECT_ID('t_student_2019') --字段描述
--字段加描述
select a.name,b.value from syscolumns a left join sys.extended_properties b on a.colid=b.minor_id where a.id=OBJECT_ID('t_student_2019')
--字段加字段類型長度描述
select a.name,type=c.name,a.length,b.value from syscolumns a left join sys.extended_properties b on a.colid=b.minor_id
left join sys.systypes c on a.xtype=c.xtype
where a.id=OBJECT_ID('t_student_2019') and c.status=0 order by a.colid數據庫
--建立數據庫 create DataBase 數據庫名稱express
--清空數據庫 exec sp_MSForeachTable 'truncate table ?'c#
--建立表 create table 表名(column1 type1,column2 type2)session
--複製表 select * into 新表名 from 舊錶名併發
--刪除表 drop table 表名ide
--刪除表記錄 delete from 表名函數
--重置表(清空記錄而且不影響自增列)truncate table 表名性能
--計算兩個日期時間 DATEDIFF(datepart, startdate, enddate)學習
--日期加時間 dateadd(datatype,num,date) 如 DATEADD(yyyy,3,rxrq)
--GUID select newid();--36位帶四位‘-’符號;SQL Server 2005以上提供一種能夠設置默認值約束的另外一種方式 newsequentialid() 如 create table test(GUID uniqueidentifier default(newsequentialid()) primary key not null , Name nvarchar(10))
newid()還以設置隨機取表中的數據 如 select top 100 * from tableName order by newid() (實現方式給全部數據新增一列guid,而後排序再取數據,性能不高)例如隨機取10%的數據
select top 10 percent * from Table order by NEWID()
--order by a desc ,b (asc),c desc 先進行a的倒序,以後再進行b的升序,最後在執行c的降序
--Partition by能夠理解爲 對多行數據分組後排序取每一個產品的第一行數據 相比於分組以後去最大最小的id來篩選記錄,partition by 更簡便
select * ,t=row_number() over(partition by '分組名稱' order by '升降序字段' asc/desc) from #tmp
--for xml path('') --用於將表裏的多條記錄轉換成xml格式輸出
select * from #tnp for xml path('Huge')--> <Huge><列名1>值1</列名1><列名2>值2</列名2></Huge> <Huge><列名1>值1</列名1><列名2>值2</列名2></Huge> <Huge><列名1>值1</列名1><列名2>值2</列名2></Huge>這個樣的XML,多行就會有多個。
最實用的例子仍是 select 列+'、' from table for xml path('') =》值一、值二、值三、 最後能夠去除最後一個字符便可
--數據庫鎖 悲觀鎖(就是悲觀的認爲是本身形成的併發) 樂觀鎖(樂觀的爲表建立一個版本號或者時間戳,這樣每一次的新增/更新,致使版本號和時間戳都會變更,做爲條件帶到操做語句中)
悲觀鎖的一種用法
begin tran --開啓一個事務 select top 10 * from #tmp WITH (UPDLOCK, ROWLOCK) where id=123--給這個表加一個行級鎖 waitfor delay '00:00:30' --等待30秒(至關於C#中的線程sleep方法) COMMIT tran--提交事務 --這時候新建一個Sql窗口,去修改這邊記錄數 update #tmp set sj=getdate() where id=123
效果就是這樣,必須等待事務提交,才能夠進行數據的修改
--系統表 sys.dm_tran_locks (查看數據庫資源鎖)
begin tran select top 100 * from #TMP with(UPDLOCK,RowLock) where A=2019 select * from sys.dm_tran_locks where resource_type = 'OBJECT' --waitfor delay '00:00:20' COMMIT tran
上述既可看到你當前查詢的鎖,能夠經過 kill [request_session_id] 查詢出來的這個id進行kill 這個鎖
--SQL中取出decimal類型中對於的0
在sql server 建個函數ClearZero,使用這個函數去掉小數點後面多餘的零。
CREATE function [dbo].[ClearZero](@inValue varchar(50)) returns varchar(50) as begin declare @returnValue varchar(20) if(@inValue='') set @returnValue='' --空的時候爲空 else if (charindex('.',@inValue) ='0') set @returnValue=@inValue --針對不含小數點的 else if ( substring(reverse(@inValue),patindex('%[^0]%',reverse(@inValue)),1)='.') set @returnValue =left(@inValue,len(@inValue)-patindex('%[^0]%',reverse(@inValue))) --針對小數點後全是0的 else set @returnValue =left(@inValue,len(@inValue)- patindex('%[^0]%.%',reverse(@inValue))+1) --其餘任何情形 return @returnValue end
在c#中呢? decimal d = 0.0500m; d.ToString("0.##")就出來了 也能夠這樣 string.Format("{0:0.##}",d000)
--SQL Server 2008 r2 經常使用函數整理
select ltrim(rtrim(' h u a g e ')) --去首尾空格 C#對應 Trim()函數 select REPLACE(' h u a g e ',' ','') --去全部的空格 C#對應Replace(" ", "")函數 select charindex(',',' as ,') --查找字符串目標字符(串)出現的第一個index(經常與截取字符串連用) C#對應 IndexOf(" ")函數 select SUBSTRING(', huages ,',1,3) --截取字符串(截取的位置開始到結束..數據庫中的位數是從1開始的,不是0) C#對應Substring(1) --這邊是從0開始 select right(left('huage',3),1) --取字符串左邊3位再取右邊一位 C#無對應函數 可使用截取字符串 select reverse('huage') --字符串反轉 C#無對應函數,可使用 string.Join("",hua.ToCharArray().Reverse()); select len('huage') --字符串長度 C#對應Length()函數 select patindex('%[0]%','100'); select patindex('%[^0]%','0100') --'%[0]%'表示匹配第一個0的位置,'%[^0]%'匹配不是0的第一個位置 C#無對應函數 STUFF ( character_expression , start , length ,character_expression ) --字符串中,開始的,長度,刪除後,新增另外一個字符串 C#無對應函數
--SQL server2008以上版本:存儲過程將表當作變量
--建立自定義的表類型 Create type XTableType as table(Id int,Name nvarchar(10))--自定類型(表) --建立存儲過程 Create Procedure [dbo].[pro_getname](@tmp XTableType readonly,@name varchar(10)) as BEGIN SELECT * FROM @tmp where Name=@name ; END --調用存儲過程 declare @tt as XTableType insert into @tt(Id,Name) select 1,'zhangsan' union select 2,'lisi' union select 3,'wangwu' exec pro_getname @tmp=@tt,@name=N'zhangsan'
--SQL Server函數返回 表數據
Create Function fnGetSplitTable (@SourceSql NVARCHAR(MAX)) RETURNS @temp TABLE ( F1 VARCHAR(100) ) AS BEGIN DECLARE @ch AS VARCHAR(100) WHILE ( CHARINDEX(',',@SourceSql)>0 ) BEGIN SET @ch = substring(@SourceSql,1,CHARINDEX(',',@SourceSql)-1) -- SUBSTRING(@name,1,CHARINDEX(',',@name)-1) INSERT @temp VALUES ( @ch ) SET @SourceSql = substring(@SourceSql,CHARINDEX(',',@SourceSql)+1,100) END INSERT @temp VALUES ( @SourceSql ) RETURN END
--執行動態SQL語句
create table #tt( id int, name nvarchar(10) ) insert into #tt select '1','zhangsan' union select '2','lisi' declare @name nvarchar(10)='zhangsan' declare @sql nvarchar(max)='' set @sql='select * from #tt where name='''+@name+''' ' exec(@sql) --至關於執行拼接好的SQL語句,容易SQL注入 set @sql='select * from #tt where name=@name ' exec sp_executesql @sql,N'@name nvarchar(10)',@name=@name --參數化查詢
--SQL Sever 觸發器
--常常忘記觸發判斷是更新仍是新增,因此記錄一下 --基礎語法 CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE] AS T-SQL語句 GO --with encryption 表示加密觸發器定義的sql文本 --delete,insert,update指定觸發器的類型 --實例 Create TRIGGER [dbo].[tr_name] ON [dbo].[tablename] AFTER insert,update AS BEGIN IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)--//新增 if Exists (select 1 from inserted) and Exists(select 1 from deleted)--//修改 if not Exists (select 1 from inserted) and Exists(select 1 from deleted)--//刪除 select id from inserted END