SQL的積累

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
相關文章
相關標籤/搜索