主頁(yè) > 知識(shí)庫(kù) > SQL Server 總結(jié)復(fù)習(xí) (二)

SQL Server 總結(jié)復(fù)習(xí) (二)

熱門(mén)標(biāo)簽:智能語(yǔ)音外呼系統(tǒng)哪個(gè)牌子好 400電話申請(qǐng)需要開(kāi)戶費(fèi)嗎 重慶防封電銷(xiāo)機(jī)器人供應(yīng)商 溫州語(yǔ)音外呼系統(tǒng)代理 威海智能語(yǔ)音外呼系統(tǒng) 南京電銷(xiāo)外呼系統(tǒng)運(yùn)營(yíng)商 西安青牛防封電銷(xiāo)卡 山西語(yǔ)音外呼系統(tǒng)價(jià)格 北京辦理400電話多少
1. 排名函數(shù)與PARTITION BY
復(fù)制代碼 代碼如下:

--所有數(shù)據(jù)
SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = '語(yǔ)文'
-------------------------------------------
--ROW_NUMBER() 的使用 生成列從1開(kāi)始依次增加
-------------------------------------------
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = '語(yǔ)文'
--也可以在后面再加一個(gè)order by,則表示前面生成后的全部列又被以最后的列重新排列(排名列值不變)
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = '語(yǔ)文' ORDER BY a.Id
--要在分組統(tǒng)計(jì)后使用排名函數(shù),則先進(jìn)行分組,用cte或嵌套查詢表整出結(jié)果集,再用row_number函數(shù)處理
WITH b AS
(
SELECT stuid, SUM(score) AS score FROM ScoreTB GROUP BY stuid
)
SELECT * ,ROW_NUMBER() OVER (ORDER BY b.score desc) AS rownumer
FROM dbo.student AS a INNER JOIN b ON a.id = b.stuid
----------------------------------------------------------------------------
--RANK() 用法與ROW_NUMER函數(shù)想同,只是在出現(xiàn)order by同級(jí)時(shí),排名會(huì)設(shè)置成一樣,而下一個(gè)會(huì)根據(jù)之前的記錄數(shù)生成序號(hào)
--例如前面三個(gè)是一樣的,那么都是1,下一個(gè)則是4,示例略
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--DENSE_RANK() 密集排名 用法與ROW_NUMER、RANK函數(shù)相同,只是在生成序號(hào)時(shí)是連續(xù)的,而rank函數(shù)生成的序號(hào)有可能不連續(xù)
--例如前面三個(gè)是一樣的,那么都是1,下一個(gè)則是2,示例略
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--ntile函數(shù)可以對(duì)序號(hào)進(jìn)行分組處理。這就相當(dāng)于將查詢出來(lái)的記錄集放到指定長(zhǎng)度的數(shù)組中,每一個(gè)數(shù)組元素存放一定數(shù)量的記錄。
--為每條記錄生成的序號(hào)就是這條記錄所有的數(shù)組元素的索引(從1開(kāi)始)。也可以將每一個(gè)分配記錄的數(shù)組元素稱為“桶”。
--它有一個(gè)參數(shù),用來(lái)指定桶數(shù),例如
----------------------------------------------------------------------------
SELECT ntile(2) OVER (ORDER BY B.SCORE DESC) AS GROUPID ,A.NAME, ISNULL(B.SCORE,0) SCORE, a.Id
FROM dbo.student AS a LEFT JOIN dbo.ScoreTB AS b ON a.Id = b.stuid AND scorename = '語(yǔ)文'
--------------------------------------------------------------------------
--PARTITION BY 類似于向排名函數(shù)應(yīng)用一個(gè)group by,分組后對(duì)每一個(gè)組單獨(dú)排名
--------------------------------------------------------------------------
--統(tǒng)計(jì)各個(gè)學(xué)科的排名依次為:
SELECT RANK() OVER (PARTITION BY b.scorename ORDER BY B.SCORE DESC) AS ROWNUMBER,b.scorename,
b.score, A.NAME, a.Id FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid ORDER BY SCORENAME

2. TOP 新用法
復(fù)制代碼 代碼如下:

DECLARE @num INT = 101
SELECT TOP (@num) * FROM Student ORDER BY Id --必須用括號(hào)括起來(lái)
SELECT TOP (@num) percent * FROM Student ORDER BY Id --只接受float并且1-100之間的數(shù),如果傳入其他則會(huì)報(bào)錯(cuò)

3. group by all 字段 / group by 字段
前者有點(diǎn)像left join ,right join的感覺(jué),兩者的主要區(qū)別體現(xiàn)在有where條件被過(guò)濾的聚合函數(shù),會(huì)重新抓取出來(lái)放入查詢的數(shù)據(jù)表中,只是聚合函數(shù)會(huì)根據(jù)返回值的類型用默認(rèn)值0或者NULL來(lái)代替聚合函數(shù)的返回值。
當(dāng)然從效率上來(lái)說(shuō),后者優(yōu)于前者,就像inner join 優(yōu)于left join一樣
4. count(*)/count(0) 與 count(字段)
如果查詢出來(lái)的字段中沒(méi)有NULL值,那么倆種查詢條件無(wú)任何區(qū)別,如果有NULL,后者統(tǒng)計(jì)出來(lái)的記錄則是 總記錄數(shù) - NULL記錄數(shù)
從性能上來(lái)說(shuō),前者高于后者,因?yàn)楹笳邥?huì)逐行掃描字段中是否有NULL值,有NULL則不加以統(tǒng)計(jì),減少了邏輯讀的開(kāi)銷(xiāo),從而性能達(dá)到提升
5. top n With ties 的用法
詳見(jiàn) http://www.cnblogs.com/skynet/archive/2010/03/29/1700055.html
舉個(gè)例子
select top 1 with ties * from student order by score desc
等價(jià)于
select * from student where score=(select top 1 score from student order by score desc)
6. Apply運(yùn)算符
復(fù)制代碼 代碼如下:

View Code
--準(zhǔn)備數(shù)據(jù)
CREATE TABLE [dbo].[Student](
[Id] [int] NULL,
[Name] [varchar](50) NULL
)
go
INSERT INTO dbo.Student VALUES (1, '張三')
INSERT INTO dbo.Student VALUES (2, '李斯')
INSERT INTO dbo.Student VALUES (3, '王五')
INSERT INTO dbo.Student VALUES (4, '神人')
go
CREATE TABLE [dbo].[scoretb](
[stuId] [int] NULL,
[scorename] [varchar](50) NULL,
[score] INT NULL
)
go
INSERT INTO [scoretb] VALUES (1,'語(yǔ)文',22)
INSERT INTO [scoretb] VALUES (1,'數(shù)學(xué)',32)
INSERT INTO [scoretb] VALUES (1,'外語(yǔ)',42)
INSERT INTO [scoretb] VALUES (2,'語(yǔ)文',52)
INSERT INTO [scoretb] VALUES (2,'數(shù)學(xué)',62)
INSERT INTO [scoretb] VALUES (2,'外語(yǔ)',72)
INSERT INTO [scoretb] VALUES (3,'語(yǔ)文',82)
INSERT INTO [scoretb] VALUES (3,'數(shù)學(xué)',92)
INSERT INTO [scoretb] VALUES (3,'外語(yǔ)',72)
--創(chuàng)建表值函數(shù)
CREATE FUNCTION [dbo].[fGetScore](@stuid int)
RETURNS @score TABLE
(
[stuId] [int] NULL,
[scorename] [varchar](50) NULL,
[score] INT NULL
)
as
BEGIN
INSERT INTO @score
SELECT stuid,scorename,score FROM dbo.scoretb WHERE stuId = @stuid
RETURN;
END
GO
--開(kāi)始使用
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
CROSS APPLY [dbo].[fGetScore](A.Id) B --相當(dāng)于inner join效果
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
OUTER APPLY [dbo].[fGetScore](A.Id) B --相當(dāng)于left join效果
--而不能這樣使用
--SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
-- INNER JOIN [dbo].[fGetScore](A.Id) B ON A.Id = B.stuid
-- SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
-- INNER JOIN (SELECT * FROM [dbo].[fGetScore](A.Id)) B ON A.Id = B.stuid

7. INTERSECT和EXCEPT運(yùn)算符
EXCEPT 只包含excpet關(guān)鍵字左邊而且右邊的結(jié)果集中不存在的那些行 INTERSECT 只包含兩個(gè)結(jié)果集中都存在的那些行
往往EXISTS關(guān)鍵字可以代替上面的關(guān)鍵字,并且從性能中可以看到比他們更好,但EXCEPT/INTERSECT更便于閱讀和直觀。還是建議從性能更優(yōu)入手。
8. 索引提高查詢效率的原理
索引與EXISTS運(yùn)算符在處理方式上很像,它們都可以在找到匹配值后立即退出查詢運(yùn)行,從而提高了查詢性能
9. 表變量與臨時(shí)表
主要區(qū)別: 1表變量不寫(xiě)日志,沒(méi)有統(tǒng)計(jì)信息,頻繁更改不會(huì)造成存儲(chǔ)過(guò)程重新編譯,不能建索引和統(tǒng)計(jì)信息,但是可以建立主鍵,變通實(shí)現(xiàn)索引查找,表變量不只是在內(nèi)存中操作,數(shù)據(jù)量大的情況也會(huì)寫(xiě)tempdb,即物理磁盤(pán)的IO操作。 2.事務(wù)回滾對(duì)表變量無(wú)效(原因沒(méi)有統(tǒng)計(jì)信息)
一般來(lái)說(shuō),數(shù)據(jù)量大,臨時(shí)結(jié)果集需要和其他表二次關(guān)聯(lián)用臨時(shí)表 數(shù)據(jù)量小,單獨(dú)操作臨時(shí)結(jié)果集用表變量
10. 腳本和批處理
Go不是一條T-SQL命令,他只能被編譯工具M(jìn)anagement Studio, SQLCMD識(shí)別,如果用第三方工具,不一定支持GO命令。例如ADO.NET,ADO。
11. SQLCMD的運(yùn)用
SQLCMD -Usa -Psa -Q "SELECT * FROM TESTDB.dbo.mytable"
SQLCMD -Usa -Psa -i testsql.sql 運(yùn)行文件里的SQL語(yǔ)句
12. EXEC 使用說(shuō)明
在執(zhí)行過(guò)EXEC之后,可以使用類似@@ROWCOUNT這樣的變量查看影響行數(shù);不能在EXEC的參數(shù)中,針對(duì)EXEC字符串運(yùn)行函數(shù),例如cast(XX AS VARCHAR),對(duì)于EXEC的參數(shù),只能用字符串相加,或者是整體的字符串。
13. WAITFOR 的含義
WAITFOR TIME 'TIME'> 定時(shí)執(zhí)行; WAITFOR DELAY 'TIME'> 延遲執(zhí)行
14. 存儲(chǔ)過(guò)程 總結(jié)
1)用TRY/CATCH 替代 @@ERROR這種更科學(xué),其一@@ERROR沒(méi)有TRA/CATCH直觀,其二遇到錯(cuò)誤級(jí)別在11-19的錯(cuò)誤,錯(cuò)誤會(huì)使運(yùn)行直接中斷,導(dǎo)致@@ERROR判斷錯(cuò)誤與否無(wú)效。
2)使用RAISERROR 拋錯(cuò)
WITH LOG,當(dāng)嚴(yán)重級(jí)別大于等于19時(shí),需要使用這個(gè)選項(xiàng)
WITH SETERROR,使其重寫(xiě)@@ERROR值,方便外部調(diào)用
WITH NOWAIT 立刻將錯(cuò)誤通知給客戶端
15. 游標(biāo)的復(fù)習(xí)
游標(biāo)主要部分包括:1)聲明 2)打開(kāi) 3)使用或?qū)Ш?4)關(guān)閉 5)釋放
嵌套使用游標(biāo)示例
復(fù)制代碼 代碼如下:

DECLARE BillMsgCursor CURSOR FOR
SELECT TypeNo,TabDetailName FROM dbo.BillType
OPEN BillMsgCursor
DECLARE @TypeNo CHAR(5)
DECLARE @DetailName VARCHAR(50)
FETCH NEXT FROM BillMsgCursor INTO @TypeNo,@DetailName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @DataFieldName VARCHAR(50)
DECLARE ColumnName CURSOR FOR
SELECT name FROM syscolumns WHERE id = OBJECT_ID(@DetailName)
OPEN ColumnName
FETCH NEXT FROM ColumnName INTO @DataFieldName
PRINT '單據(jù)編號(hào):' + @TypeNo
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'ListDetailDataFiled.Add('''+@DataFieldName+''');'
FETCH NEXT FROM ColumnName INTO @DataFieldName
END
CLOSE ColumnName
DEALLOCATE ColumnName
FETCH NEXT FROM BillMsgCursor INTO @TypeNo,@DetailName
END
CLOSE BillMsgCursor
DEALLOCATE BillMsgCursor

@@fetch_status值的意義:0 FETCH 語(yǔ)句成功;-1 FETCH 語(yǔ)句失敗或此行不在結(jié)果集中;-2 被提取的行不存在
FETCH [NEXT/PRIOR/FIRST/LAST] FROM ... INTO 針對(duì)游標(biāo)為SCROLL類型的
16. 游標(biāo)的分類
1)靜態(tài)游標(biāo)(static):相當(dāng)于臨時(shí)表,會(huì)保存在tempdb里的私有表中,猶如快照表復(fù)制一份
a.一旦創(chuàng)建了游標(biāo),它就與實(shí)際記錄相分離并不再維持任何鎖
b.游標(biāo)就是獨(dú)立的,不再以任何方式與原始數(shù)據(jù)相關(guān)聯(lián)
2)鍵集驅(qū)動(dòng)的游標(biāo)(keyset):需要在一定程度上感知對(duì)數(shù)據(jù)的修改,但不必了解最新發(fā)生的所有插入
a.表必須具有唯一索引
b.只有鍵集在tempdb中,而非整個(gè)數(shù)據(jù)集,對(duì)整個(gè)服務(wù)器性能產(chǎn)生有利的影響
c.能感知到對(duì)己是鍵集一部分的行所做的修改(改刪),不能感知新增
3)動(dòng)態(tài)游標(biāo)(DYNAMIC)
a.完全動(dòng)態(tài),非常敏感,對(duì)底層數(shù)據(jù)做的所有事情都會(huì)影響,性能當(dāng)然也是最差的
b.它們會(huì)帶來(lái)額外的并發(fā)性問(wèn)題
c.每發(fā)出一次FETCH,都要重建游標(biāo)
d.可允許運(yùn)行沒(méi)有唯一索引的表中,但弊端會(huì)造成SQLSERVER無(wú)法追蹤它在游標(biāo)的位置造成死循環(huán),應(yīng)避免這樣使用
4)快進(jìn)游標(biāo)(FAST_FORWARD)
在許多情況下,F(xiàn)AST_FORWARD游標(biāo)會(huì)隱式轉(zhuǎn)換為其他游標(biāo)類型

標(biāo)簽:新余 中衛(wèi) 濟(jì)寧 金昌 黃山 宜春 河源 貸款群呼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server 總結(jié)復(fù)習(xí) (二)》,本文關(guān)鍵詞  SQL,Server,總結(jié),復(fù)習(xí),二,SQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server 總結(jié)復(fù)習(xí) (二)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL Server 總結(jié)復(fù)習(xí) (二)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章