最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL Server 總結復習 (二)

 更新時間:2012年08月09日 22:16:44   作者:  
SQL Server 總結復習,學習sqlserver的朋友可以參考下
1. 排名函數(shù)與PARTITION BY
復制代碼 代碼如下:

--所有數(shù)據(jù)
SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
WHERE scorename = '語文'
-------------------------------------------
--ROW_NUMBER() 的使用 生成列從1開始依次增加
-------------------------------------------
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 = '語文'
--也可以在后面再加一個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 = '語文' ORDER BY a.Id
--要在分組統(tǒng)計后使用排名函數(shù),則先進行分組,用cte或嵌套查詢表整出結果集,再用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ù)生成序號
--例如前面三個是一樣的,那么都是1,下一個則是4,示例略
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--DENSE_RANK() 密集排名 用法與ROW_NUMER、RANK函數(shù)相同,只是在生成序號時是連續(xù)的,而rank函數(shù)生成的序號有可能不連續(xù)
--例如前面三個是一樣的,那么都是1,下一個則是2,示例略
----------------------------------------------------------------------------
----------------------------------------------------------------------------
--ntile函數(shù)可以對序號進行分組處理。這就相當于將查詢出來的記錄集放到指定長度的數(shù)組中,每一個數(shù)組元素存放一定數(shù)量的記錄。
--為每條記錄生成的序號就是這條記錄所有的數(shù)組元素的索引(從1開始)。也可以將每一個分配記錄的數(shù)組元素稱為“桶”。
--它有一個參數(shù),用來指定桶數(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 = '語文'
--------------------------------------------------------------------------
--PARTITION BY 類似于向排名函數(shù)應用一個group by,分組后對每一個組單獨排名
--------------------------------------------------------------------------
--統(tǒng)計各個學科的排名依次為:
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 新用法
復制代碼 代碼如下:

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

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

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

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

相關文章

  • SQL Server日期計算

    SQL Server日期計算

    SQL Server日期計算...
    2007-03-03
  • SQL Server實時同步更新遠程數(shù)據(jù)庫遇到的問題小結

    SQL Server實時同步更新遠程數(shù)據(jù)庫遇到的問題小結

    這篇文章主要介紹了SQL Server實時同步更新遠程數(shù)據(jù)庫遇到的問題小結,需要的朋友可以參考下
    2017-04-04
  • 教你恢復SQLSERVER的master系統(tǒng)庫的方法

    教你恢復SQLSERVER的master系統(tǒng)庫的方法

    這篇文章主要介紹了恢復SQLSERVER的master系統(tǒng)庫,本文介紹可能需要恢復master數(shù)據(jù)庫的情況以及如何正確完成這些步驟,需要的朋友可以參考下
    2022-09-09
  • vs10安裝之后一些列問題

    vs10安裝之后一些列問題

    sql05不能用了,數(shù)據(jù)庫又沒個08怎么辦呢 這時候不用卸載vs10 和sql08、05,只需要安裝一個sql08就行了
    2011-12-12
  • 提升SQL Server速度 整理索引碎片

    提升SQL Server速度 整理索引碎片

    數(shù)據(jù)庫表A有十萬條記錄,查詢速度本來還可以,但導入一千條數(shù)據(jù)后,問題出現(xiàn)了。當選擇的數(shù)據(jù)在原十萬條記錄之間時,速度還是挺快的;但當選擇的數(shù)據(jù)在這一千條數(shù)據(jù)之間時,速度變得奇慢
    2009-07-07
  • SQL?DNSlog注入實戰(zhàn)

    SQL?DNSlog注入實戰(zhàn)

    DnsLog注入可以理解成是一種技巧,而不是一種攻擊方式,是一種讓無回顯的攻擊,變得有回顯的方式,包括但不限于SQL盲注,這篇文章主要介紹了SQL?DNSlog注入詳解,需要的朋友可以參考下
    2023-05-05
  • SQL 聯(lián)合查詢與XML解析實例詳解

    SQL 聯(lián)合查詢與XML解析實例詳解

    這篇文章主要介紹了SQL 聯(lián)合查詢與XML解析實例詳解的相關資料,并附實例代碼,需要的朋友可以參考下
    2016-11-11
  • 關于SQL Server數(shù)據(jù)庫中的用戶權限和角色管理功能實現(xiàn)

    關于SQL Server數(shù)據(jù)庫中的用戶權限和角色管理功能實現(xiàn)

    在本文中,我們介紹了在SQL Server中創(chuàng)建用戶、分配權限和管理角色的基礎知識,請記住定期審查和更新用戶權限,以符合您組織的安全政策和數(shù)據(jù)訪問要求,這篇文章主要介紹了關于SQL Server數(shù)據(jù)庫中的用戶權限和角色管理,需要的朋友可以參考下
    2024-03-03
  • SqlServer強制斷開數(shù)據(jù)庫已有連接的方法

    SqlServer強制斷開數(shù)據(jù)庫已有連接的方法

    在執(zhí)行建庫腳本時,往往會先將原有的數(shù)據(jù)庫drop掉,由于SqlServer檢測到有數(shù)據(jù)連接時禁止執(zhí)行drop database操作,所以建庫腳本經常執(zhí)行失敗,為此我們需要一種能強制斷開數(shù)據(jù)庫已有連接的方法,需要的朋友可以參考下
    2012-12-12
  • SQL Server中刪除重復數(shù)據(jù)的幾個方法

    SQL Server中刪除重復數(shù)據(jù)的幾個方法

    數(shù)據(jù)庫的使用過程中由于程序方面的問題有時候會碰到重復數(shù)據(jù),重復數(shù)據(jù)導致了數(shù)據(jù)庫部分設置不能正確設置
    2013-05-05

最新評論

靖宇县| 旺苍县| 容城县| 大田县| 绥滨县| 阿克陶县| 改则县| 商水县| 杭锦后旗| 什邡市| 宣武区| 贵定县| 平利县| 隆化县| 永春县| 临沭县| 通州市| 民权县| 兴业县| 谷城县| 安远县| 新安县| 香格里拉县| 怀仁县| 仙桃市| 博野县| 绥阳县| 专栏| 翁源县| 枝江市| 贡嘎县| 团风县| 台东市| 伊吾县| 甘孜县| 周至县| 历史| 东海县| 黄冈市| 沙雅县| 尚志市|