SQLServer(子查詢,儲存過程,透視,索引)

2022-04-04 20:15:32 字數 4965 閱讀 3780

儲存過程:

檢視是對乙個查詢語句的封裝,而儲存過程:將一段t-sql指令碼進行封裝,對一段邏輯操作的封裝。

建立儲存過程:

create proc 名稱 參數列 as begin end

案例:去左右空格

creat proc trim

@str1 varchar(10)

asbegin

select ltrim(rtrim(@str1))

end在《可程式設計性》裡面有《儲存過程》裡面有trim這個名

用的時候:

exec trim '引數'

案例:編寫儲存過程,查詢表中的總數居,以及當前頁的資料

分頁的**

select * from (select * ,rownumber() over(order ba sid desc) as rowidnex

from studentinfo where isdelete=0) as t1 where rowindex between a and b

--編寫儲存過程,查詢表中的總資料,及當前頁面的資料。

exec proc getpagelist

@pageindex int,

@pagesize int ,

@rowscount int output // 就相當與c#中函式out關鍵字。可以使用多次

asbegin

set nocount on; // 執行儲存過程的時候不會提示幾行受印象了。

select @rowscount count(*) from studentinfo where isdelete=0

select * from (select * ,rownumber() over(order ba sid desc) as rowidnex

from studentinfo where isdelete=0) as t1 where rowindex between (@pageidnex-1)*@pagesize+1 and @pageindex*@pagesize

end呼叫的時候:

declare @temp int

exec getpagelist 1,2 @temp output

print @temp

就行了。

記住儲存過程的關鍵字就行了。

.net 中怎麼呼叫儲存過程呢。開始呼叫剛才的pagelist

private int pageindex;

pageindex=1;

private void loadlist()

;cmd.parameters.add; cmd.parameters.add;

conn.open();

sqldatareader reader=cmd.executereader();

//然後自己把reader裡面的值格式化就行了。

//那個要輸出的引數的值,現在已經在引數裡面了。}}

索引:分類:

聚集索引:與實際儲存位置一樣,乙個表中只能有乙個聚集索引,

非聚集索引:索引順序與儲存順序不一致。

聚集索引只能有乙個(做在主鍵上)

如何做索引::

介面上的操作:右擊表-》設計,列上右鍵 》索引,新增-》選擇列。 索引名的字首是ix_ 是給這個列做索引。

**操作: create [unique]nonclustered index ix_索引名 on 表名(列名)

資料多的時候才做索引。為where後面的列加索引。

後期結合sqlserver->工具-》 sql serverprofiler這個東西執行乙個星期後,會有 大量執行後語句,收集select語句看where後面的列,都有哪些,到時候可以加索引。

子查詢:將乙個查詢巢狀在另乙個查詢語句中

常用運算子:=只能匹配乙個值 in在這個值得範圍內 exists和in的效果一樣,但是效率in是拿外部的跟裡面的比,exists distinct去重複,很重要。

例子: 查詢參加考試同學的資訊

select * from student

select * from scoreinfo

_____------

select * from studentinfo where stuid in(select distinct stuid from scoreinfo 去從重複獲取所有參加考試同學的id)

------

分頁中常常用到子查詢

over()開窗函式一般用到兩個方面,乙個是聚合函式加到列裡面,乙個是排序的時候

select *,row_number() over(order by sid desc) as rowindex from studentinfo

where rowindex between 5 and 6 //這裡會發現rowindex不能用,因為它會先執行where後的句子,所以這裡要先把select的東西做成乙個結果集,正確寫法如下

分頁規律:

開始:(pageindex-1)*pagesize+1

結束: pageindex * pagesize

select * from

(select *,row_number() over(order by sid desc)as rowindex from studentinfo)as t1 where rowindex between 5 and 8

現有資料的整合:(資料透視)

行變列。

select sname 姓名,

max(case stitle when '語文' then scorevalue end) as 語文,

min(case stitle when '數學' then scorevalue end) as 數學,

sum(case stitle when '英語' then scorevalue end) as 英語

from 表名

這裡的聚合函式如果不加就會出現重複,null,之所以用聚合中的三個數,是因為這三個數都是不參加運算的。括號裡面:當stitle的值為『語文』的時候輸出 scorevalue的值。

輸出每個班的男生和女生:

select ctitle,

mix(case sgender when '1' then count1 end else 0) 男生,

min(case sgender when '0' then count1 end else 0) 女生

from 表名 group by ctitle

比如說知道每天的銷售量顯示出每月的銷售量的**

t-sql程式設計。

sql server特有的編碼:關鍵字和規則和其他的完全不一樣。

宣告變數:declare 變數名 型別 -----變數名以@開頭,和c#中的引數化一樣,也是要求以@開頭為的就是成為這裡的sqlserver中的變數?

設定:set/select 變數名=值

輸出:print/select 變數名

全域性變數:使用@@符號, 有兩個@@符號的變數,一般是系統內建變數 比方說常用的

insert into classinfo values("新資料") select @@inentity 返回的就是剛剛插入資料的標識 id。 @@inentity 進行插入後呼叫,返回最親的標識值。

@@error 有錯誤的話,返回的是錯誤的編號,沒有的話返回0,單步執行

print @@rowcount 返回的是上一次幾行受影響的值。

例子:declare @name nvarchar(10)

set @name='這個文字'

print @name

begin try

end try

begin catch

end catch

選擇語句:

上面我們有講到case在查詢的時候對列進行的選擇。if改變的則是你整個**執行的順序。

declare @id int

set @id=5

if @id>5

begin

--滿足條件執行的**

endelse

begin

--不滿足條件執行的**

end迴圈:

declare @id int

set @id=1

while @id<10

begin

print @id

set @id=@id+1

end輸出一到十之間的偶數

declare @num int

set @num=1;

while

begin

if @num %2=0

begin

print @num

endset @num =@num+1

end事物: 能夠保證在做乙個批量的大量的操作的時候,如果有乙個失敗了,還能回到最初的狀態。保證了操作的正確。

只有資料改變了才會引發事物,也就是增刪改。

分類:顯式事務(需要手動寫)

隱式事務(mssql預設的,不需要手動)

begin try

begin tran --設定反悔點 //這時候這個表就上鎖了。。查詢的時候是查不出來的。

sql語句

commit tran提交不返回

end tyr

begin catch

rollback tran 回到反悔點

end catch

回到返回點後資料也都回到返回點了,就相當於什麼也沒刪,什麼也沒有變過。

鎖:加鎖後只能有乙個人進行這個操作,防止多人操作出亂。

有外來鍵表的增刪改查和無外來鍵表的一樣,但是為了保證值得有效性,一般是把他引用的那個表的列做成下拉列表的格式,讓使用者去選。

現在比如說你想刪除一條資料,就要先把引用他的表中的資料給刪了。(一般先提示,比如你要刪乙個班級,就告訴你班級裡還有學生,你要先把學生刪了。還有一種是軟刪除,就是改了乙個標記為0)

(有待更新整理......)

SQL SERVER 匯入EXCEL的儲存過程

1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...

SQL SERVER 匯入EXCEL的儲存過程

1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...

SQL SERVER 匯入EXCEL的儲存過程

1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...