1. 程式人生 > 實用技巧 >SQL學習筆記

SQL學習筆記

一、查詢

1、連線查詢

2、分頁查詢

  
利用row_number() over(order by id)函式計算出行數,選定相應行數返回即可,不過該關鍵字只有在SQL server 2005版本以上才有。

SELECT TOP #{pageSize} * FROM (SELECT ROW_NUMBER() OVER(ORDER BY bus.id) AS RowNumber, bus.XX,pro.XX FROM tableNameA bus join tableNameB pro on pro.id = bus.id)AS A WHERE RowNumber
> (${pageSize}*(${startPage}-1))
利用offset /fetch next(2012版本及以上才有)offset A rows ,將前A條記錄捨去,fetch next B rows only ,向後在讀取B條資料

-- 分頁查詢(通用型)
select * from student order by sno
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;
-- 分頁查詢第2頁,每頁有10條記錄
select * from student order by sno offset 10 rows fetch next 10 rows only ;

二、增加

三、修改

(1)update select語法 ,當修改的值往資料庫存的時候需要查別的表才能確定修改的值,例如,往回傳的性別是女,但是存的時候存的是1,這個1是需要查別的表才能確定的


UPDATE a SET a.XXX='cc',a.XX='cc', a.XXX = b.XXX FROM tableNAme a ,tableNAme b where b.XXX = 'bbb' and a.XXX=1

四、刪除

(1)刪除約束條件(預設值約束,主鍵約束,等等)

ALTER TABLE dbo.表名 DROP CONSTRAINT 約束名

alter table #MEMBER_TEMP ALTER column DOB datetime null 刪除非空約束

(2)刪除表資料

五、建表/修改表結構

六、其他積累

(1)遊標

declare @polno char(15),@CODE char(10) -----宣告變數
declare pol_cur cursor                     -----宣告遊標 併為遊標賦值
    for select polno,CODE from XXXX
    where INIEFFDT > '2019-10-01 00:00:00.000'
open pol_cur                        -----開啟遊標
fetch next from pol_cur into @polno,@CODE --提取第一行資料
print N'XXX號     XXXX編號'  -----打印表頭
while @@FETCH_STATUS = 0     --------迴圈操作遊標裡的資料,這裡是全域性變數不用宣告
begin 
    print cast(@polno as char(12)) + @CODE
    fetch next from pol_cur into @polno,@CODE  --------拿取下一條資料,就相當於for迴圈的i++
end
close pol_cur    ---------關閉遊標
deallocate pol_cur   ---------釋放遊標

(2)修改列名 XXX表的 列名 改成 列名1

exec sp_rename 'XXX.列名','列名1'

(3)主鍵自增開關

set IDENTITY_INSERT 表名 on
set IDENTITY_INSERT 表名 off

(4)SP

sp_tables 'XXX%'      --模糊查詢表名

sp_helptext SP名       --顯示儲存過程的原始碼

sp_help SP名            --顯示儲存過程的引數及資料型別

sp_depends SP名       --顯示和儲存過程相關的資料庫物件資訊

sp_stored_procedures  --返回資料庫中的儲存過程列表

(5)格式化時間

select  stuff(stuff(convert(varchar(10),getdate(),112),5,0,N''),8,0,N'')+N''
select  stuff(stuff(convert(varchar(10),dateadd(day,14,getdate()),112),5,0,N''),8,0,N'')+N'' --當前時間加上14天

select a.name, m.definition from sysobjects a, sys.sql_modules m
where a.id = m.object_id and a.xtype = 'P' and lower(m.definition) like '表名'

SELECT * FROM SYS.objects JOIN SYS.columns ON SYS.objects.object_id=SYS.columns.object_id WHERE SYS.columns.name='列名'

(6)生成sql

如果是直接取值就是這樣寫'"&A2&"',如果是字串拼接就這樣寫'/file/"&C2&"'
="select * from 表名 where CODE = '"&A2&"' and NO ='"&B2&"'"

(7)需求:兩個表,一個多資料(包括少資料)#temp1,一個少資料#temp2,現在需要在多的裡面去掉少的那部分(去重,是一條資料全部重複,全欄位的重複才不要)

select * from #temp1  t1 where  not exists (
    select 1 from #temp2 t2 where 
    t1.欄位1 = t2.欄位1
    t1.欄位2 = t2.欄位2
    t1.欄位3 = t2.欄位3
)