mssql

推荐列表 站点导航

当前位置:首页 > 数据库 > mssql >

SQL Server 总结复习 (二)

来源:网络整理  作者:网络  发布时间:2020-12-11 01:03
SQL Server 总结复习,学习sqlserver的朋友可以参考下...
FROM dbo.student AS a LEFT JOIN dbo.ScoreTB AS b ON a.Id = b.stuid AND scorename = '语文'
OUTER APPLY [dbo].[fGetScore](A.Id) B --相当于left join效果
--RANK() 用法与ROW_NUMER函数想同,只是在出现order by同级时,排名会设置成一样,而下一个会根据之前的记录数生成序号
SELECT * ,ROW_NUMBER() OVER (ORDER BY b.score desc) AS rownumer
--ntile函数可以对序号进行分组处理。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。
[score] INT NULL
GO
WITH NOWAIT 立刻将错误通知给客户端
WITH LOG,当严重级别大于等于19时,需要使用这个选项
15. 游标的复习
INSERT INTO [scoretb] VALUES (1,'数学',32)
)


11. SQLCMD的运用
--创建表值函数
as
1)用TRY/CATCH 替代 @@ERROR这种更科学,其一@@ERROR没有TRA/CATCH直观,其二遇到错误级别在11-19的错误,错误会使运行直接中断,导致@@ERROR判断错误与否无效。
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
(
----------------------------------------------------------------------------

复制代码 代码如下:

SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
--例如前面三个是一样的,那么都是1,下一个则是2,示例略
INSERT INTO dbo.Student VALUES (3, '王五')
2)使用RAISERROR 抛错
INSERT INTO dbo.Student VALUES (2, '李斯')
前者有点像left join ,right join的感觉,两者的主要区别体现在有where条件被过滤的聚合函数,会重新抓取出来放入查询的数据表中,只是聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。
SELECT ntile(2) OVER (ORDER BY B.SCORE DESC) AS GROUPID ,A.NAME, ISNULL(B.SCORE,0) SCORE, a.Id
5. top n With ties 的用法
Go不是一条T-SQL命令,他只能被编译工具Management Studio, SQLCMD识别,如果用第三方工具,不一定支持GO命令。例如ADO.NET,ADO。
14. 存储过程 总结

INSERT INTO [scoretb] VALUES (3,'语文',82)

复制代码 代码如下:

-- INNER JOIN (SELECT * FROM [dbo].[fGetScore](A.Id)) B ON A.Id = B.stuid
往往EXISTS关键字可以代替上面的关键字,并且从性能中可以看到比他们更好,但EXCEPT/INTERSECT更便于阅读和直观。还是建议从性能更优入手。
--统计各个学科的排名依次为:
6. Apply运算符
SELECT TOP (@num) * FROM Student ORDER BY Id --必须用括号括起来
)
WHERE scorename = '语文' ORDER BY a.Id
go
等价于
CREATE FUNCTION [dbo].[fGetScore](@stuid int)

4. count(*)/count(0) 与 count(字段)
SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
[stuId] [int] NULL,
SQLCMD -Usa -Psa -Q "SELECT * FROM TESTDB.dbo.mytable"
WITH SETERROR,使其重写@@ERROR值,方便外部调用
主要区别: 1表变量不写日志,没有统计信息,频繁更改不会造成存储过程重新编译,不能建索引和统计信息,但是可以建立主键,变通实现索引查找,表变量不只是在内存中操作,数据量大的情况也会写tempdb,即物理磁盘的IO操作。 2.事务回滚对表变量无效(原因没有统计信息)
--例如前面三个是一样的,那么都是1,下一个则是4,示例略
INSERT INTO [scoretb] VALUES (3,'数学',92)
----------------------------------------------------------------------------
INSERT INTO [scoretb] VALUES (1,'外语',42)
SELECT stuid, SUM(score) AS score FROM ScoreTB GROUP BY stuid

复制代码 代码如下:

go
-- INNER JOIN [dbo].[fGetScore](A.Id) B ON A.Id = B.stuid
-------------------------------------------
go
一般来说,数据量大,临时结果集需要和其他表二次关联用临时表 数据量小,单独操作临时结果集用表变量
--ROW_NUMBER() 的使用 生成列从1开始依次增加
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid

--SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
----------------------------------------------------------------------------
--所有数据
SELECT stuid,scorename,score FROM dbo.scoretb WHERE stuId = @stuid
--准备数据
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
INSERT INTO [scoretb] VALUES (1,'语文',22)

-- SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
----------------------------------------------------------------------------
CREATE TABLE [dbo].[scoretb](
CREATE TABLE [dbo].[Student](
select * from student where score=(select top 1 score from student order by score desc)
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
-------------------------------------------
WHERE scorename = '语文'
DECLARE @num INT = 101
[scorename] [varchar](50) NULL,
WAITFOR TIME <'TIME'> 定时执行; WAITFOR DELAY <'TIME'> 延迟执行
select top 1 with ties * from student order by score desc
----------------------------------------------------------------------------
举个例子
)


13. WAITFOR 的含义


9. 表变量与临时表
3. group by all 字段 / group by 字段
INSERT INTO dbo.Student VALUES (1, '张三')
[Name] [varchar](50) NULL
----------------------------------------------------------------------------
FROM dbo.student AS a INNER JOIN b ON a.id = b.stuid
INSERT INTO [scoretb] VALUES (2,'语文',52)
EXCEPT 只包含excpet关键字左边而且右边的结果集中不存在的那些行 INTERSECT 只包含两个结果集中都存在的那些行
--------------------------------------------------------------------------

复制代码 代码如下:

2. TOP 新用法
从性能上来说,前者高于后者,因为后者会逐行扫描字段中是否有NULL值,有NULL则不加以统计,减少了逻辑读的开销,从而性能达到提升
当然从效率上来说,后者优于前者,就像inner join 优于left join一样
详见
)
WITH b AS
INSERT INTO dbo.Student VALUES (4, '神人')
WHERE scorename = '语文'
(
--它有一个参数,用来指定桶数,例如
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
RETURNS @score TABLE

索引与EXISTS运算符在处理方式上很像,它们都可以在找到匹配值后立即退出查询运行,从而提高了查询性能
INSERT INTO [scoretb] VALUES (2,'数学',62)
INSERT INTO [scoretb] VALUES (3,'外语',72)
[score] INT NULL
--开始使用
10. 脚本和批处理
嵌套使用游标示例
--DENSE_RANK() 密集排名 用法与ROW_NUMER、RANK函数相同,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续
在执行过EXEC之后,可以使用类似@@ROWCOUNT这样的变量查看影响行数;不能在EXEC的参数中,针对EXEC字符串运行函数,例如cast(XX AS VARCHAR),对于EXEC的参数,只能用字符串相加,或者是整体的字符串。
--------------------------------------------------------------------------
[Id] [int] NULL,
RETURN;
CROSS APPLY [dbo].[fGetScore](A.Id) B --相当于inner join效果
INSERT INTO @score
--为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。

END
--要在分组统计后使用排名函数,则先进行分组,用cte或嵌套查询表整出结果集,再用row_number函数处理
12. EXEC 使用说明
[stuId] [int] NULL,
SELECT TOP (@num) percent * FROM Student ORDER BY Id --只接受float并且1-100之间的数,如果传入其他则会报错
--而不能这样使用
游标主要部分包括:1)声明 2)打开 3)使用或导航 4)关闭 5)释放
1. 排名函数与PARTITION BY
如果查询出来的字段中没有NULL值,那么俩种查询条件无任何区别,如果有NULL,后者统计出来的记录则是 总记录数 - NULL记录数
[scorename] [varchar](50) NULL,
SELECT RANK() OVER (PARTITION BY b.scorename ORDER BY B.SCORE DESC) AS ROWNUMBER,b.scorename,
7. INTERSECT和EXCEPT运算符
View Code
--也可以在后面再加一个order by,则表示前面生成后的全部列又被以最后的列重新排列(排名列值不变)
INSERT INTO [scoretb] VALUES (2,'外语',72)
--PARTITION BY 类似于向排名函数应用一个group by,分组后对每一个组单独排名
8. 索引提高查询效率的原理
SQLCMD -Usa -Psa -i testsql.sql 运行文件里的SQL语句
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
BEGIN

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://www.juheyunku.com/sql/mssql/2372.shtml

最新文章
sql server 关于设置null的一 sql server 关于设置null的一

时间:2020-12-28

详解SQL游标的用法 详解SQL游标的用法

时间:2020-12-27

vs code连接sql server数据库步 vs code连接sql server数据库步

时间:2020-12-27

图书管理系统的sqlserver数 图书管理系统的sqlserver数

时间:2020-12-25

详解SQL 通配符 详解SQL 通配符

时间:2020-12-25

sql四大排名函数之ROW_NUM sql四大排名函数之ROW_NUM

时间:2020-12-25

SQLServer数据库处于恢复挂 SQLServer数据库处于恢复挂

时间:2020-12-24

Win10 64位安装个人版SQL20 Win10 64位安装个人版SQL20

时间:2020-12-24

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

SQL Server 总结复习 (二)

2020-12-11 编辑:网络

FROM dbo.student AS a LEFT JOIN dbo.ScoreTB AS b ON a.Id = b.stuid AND scorename = '语文'
OUTER APPLY [dbo].[fGetScore](A.Id) B --相当于left join效果
--RANK() 用法与ROW_NUMER函数想同,只是在出现order by同级时,排名会设置成一样,而下一个会根据之前的记录数生成序号
SELECT * ,ROW_NUMBER() OVER (ORDER BY b.score desc) AS rownumer
--ntile函数可以对序号进行分组处理。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。
[score] INT NULL
GO
WITH NOWAIT 立刻将错误通知给客户端
WITH LOG,当严重级别大于等于19时,需要使用这个选项
15. 游标的复习
INSERT INTO [scoretb] VALUES (1,'数学',32)
)


11. SQLCMD的运用
--创建表值函数
as
1)用TRY/CATCH 替代 @@ERROR这种更科学,其一@@ERROR没有TRA/CATCH直观,其二遇到错误级别在11-19的错误,错误会使运行直接中断,导致@@ERROR判断错误与否无效。
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
(
----------------------------------------------------------------------------

复制代码 代码如下:

SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
--例如前面三个是一样的,那么都是1,下一个则是2,示例略
INSERT INTO dbo.Student VALUES (3, '王五')
2)使用RAISERROR 抛错
INSERT INTO dbo.Student VALUES (2, '李斯')
前者有点像left join ,right join的感觉,两者的主要区别体现在有where条件被过滤的聚合函数,会重新抓取出来放入查询的数据表中,只是聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。
SELECT ntile(2) OVER (ORDER BY B.SCORE DESC) AS GROUPID ,A.NAME, ISNULL(B.SCORE,0) SCORE, a.Id
5. top n With ties 的用法
Go不是一条T-SQL命令,他只能被编译工具Management Studio, SQLCMD识别,如果用第三方工具,不一定支持GO命令。例如ADO.NET,ADO。
14. 存储过程 总结

INSERT INTO [scoretb] VALUES (3,'语文',82)

复制代码 代码如下:

-- INNER JOIN (SELECT * FROM [dbo].[fGetScore](A.Id)) B ON A.Id = B.stuid
往往EXISTS关键字可以代替上面的关键字,并且从性能中可以看到比他们更好,但EXCEPT/INTERSECT更便于阅读和直观。还是建议从性能更优入手。
--统计各个学科的排名依次为:
6. Apply运算符
SELECT TOP (@num) * FROM Student ORDER BY Id --必须用括号括起来
)
WHERE scorename = '语文' ORDER BY a.Id
go
等价于
CREATE FUNCTION [dbo].[fGetScore](@stuid int)

4. count(*)/count(0) 与 count(字段)
SELECT * FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
[stuId] [int] NULL,
SQLCMD -Usa -Psa -Q "SELECT * FROM TESTDB.dbo.mytable"
WITH SETERROR,使其重写@@ERROR值,方便外部调用
主要区别: 1表变量不写日志,没有统计信息,频繁更改不会造成存储过程重新编译,不能建索引和统计信息,但是可以建立主键,变通实现索引查找,表变量不只是在内存中操作,数据量大的情况也会写tempdb,即物理磁盘的IO操作。 2.事务回滚对表变量无效(原因没有统计信息)
--例如前面三个是一样的,那么都是1,下一个则是4,示例略
INSERT INTO [scoretb] VALUES (3,'数学',92)
----------------------------------------------------------------------------
INSERT INTO [scoretb] VALUES (1,'外语',42)
SELECT stuid, SUM(score) AS score FROM ScoreTB GROUP BY stuid

复制代码 代码如下:

go
-- INNER JOIN [dbo].[fGetScore](A.Id) B ON A.Id = B.stuid
-------------------------------------------
go
一般来说,数据量大,临时结果集需要和其他表二次关联用临时表 数据量小,单独操作临时结果集用表变量
--ROW_NUMBER() 的使用 生成列从1开始依次增加
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid

--SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
----------------------------------------------------------------------------
--所有数据
SELECT stuid,scorename,score FROM dbo.scoretb WHERE stuId = @stuid
--准备数据
SELECT ROW_NUMBER() OVER (ORDER BY B.SCORE DESC) AS ROWNUMBER ,A.NAME, B.SCORE, a.Id
INSERT INTO [scoretb] VALUES (1,'语文',22)

-- SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
----------------------------------------------------------------------------
CREATE TABLE [dbo].[scoretb](
CREATE TABLE [dbo].[Student](
select * from student where score=(select top 1 score from student order by score desc)
FROM dbo.student AS a INNER JOIN dbo.ScoreTB AS b ON a.Id = b.stuid
-------------------------------------------
WHERE scorename = '语文'
DECLARE @num INT = 101
[scorename] [varchar](50) NULL,
WAITFOR TIME <'TIME'> 定时执行; WAITFOR DELAY <'TIME'> 延迟执行
select top 1 with ties * from student order by score desc
----------------------------------------------------------------------------
举个例子
)


13. WAITFOR 的含义


9. 表变量与临时表
3. group by all 字段 / group by 字段
INSERT INTO dbo.Student VALUES (1, '张三')
[Name] [varchar](50) NULL
----------------------------------------------------------------------------
FROM dbo.student AS a INNER JOIN b ON a.id = b.stuid
INSERT INTO [scoretb] VALUES (2,'语文',52)
EXCEPT 只包含excpet关键字左边而且右边的结果集中不存在的那些行 INTERSECT 只包含两个结果集中都存在的那些行
--------------------------------------------------------------------------

复制代码 代码如下:

2. TOP 新用法
从性能上来说,前者高于后者,因为后者会逐行扫描字段中是否有NULL值,有NULL则不加以统计,减少了逻辑读的开销,从而性能达到提升
当然从效率上来说,后者优于前者,就像inner join 优于left join一样
详见
)
WITH b AS
INSERT INTO dbo.Student VALUES (4, '神人')
WHERE scorename = '语文'
(
--它有一个参数,用来指定桶数,例如
SELECT A.id,A.name,B.scorename,B.score FROM [Student] A
RETURNS @score TABLE

索引与EXISTS运算符在处理方式上很像,它们都可以在找到匹配值后立即退出查询运行,从而提高了查询性能
INSERT INTO [scoretb] VALUES (2,'数学',62)
INSERT INTO [scoretb] VALUES (3,'外语',72)
[score] INT NULL
--开始使用
10. 脚本和批处理
嵌套使用游标示例
--DENSE_RANK() 密集排名 用法与ROW_NUMER、RANK函数相同,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续
在执行过EXEC之后,可以使用类似@@ROWCOUNT这样的变量查看影响行数;不能在EXEC的参数中,针对EXEC字符串运行函数,例如cast(XX AS VARCHAR),对于EXEC的参数,只能用字符串相加,或者是整体的字符串。
--------------------------------------------------------------------------
[Id] [int] NULL,
RETURN;
CROSS APPLY [dbo].[fGetScore](A.Id) B --相当于inner join效果
INSERT INTO @score
--为每条记录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。

END
--要在分组统计后使用排名函数,则先进行分组,用cte或嵌套查询表整出结果集,再用row_number函数处理
12. EXEC 使用说明
[stuId] [int] NULL,
SELECT TOP (@num) percent * FROM Student ORDER BY Id --只接受float并且1-100之间的数,如果传入其他则会报错
--而不能这样使用
游标主要部分包括:1)声明 2)打开 3)使用或导航 4)关闭 5)释放
1. 排名函数与PARTITION BY
如果查询出来的字段中没有NULL值,那么俩种查询条件无任何区别,如果有NULL,后者统计出来的记录则是 总记录数 - NULL记录数
[scorename] [varchar](50) NULL,
SELECT RANK() OVER (PARTITION BY b.scorename ORDER BY B.SCORE DESC) AS ROWNUMBER,b.scorename,
7. INTERSECT和EXCEPT运算符
View Code
--也可以在后面再加一个order by,则表示前面生成后的全部列又被以最后的列重新排列(排名列值不变)
INSERT INTO [scoretb] VALUES (2,'外语',72)
--PARTITION BY 类似于向排名函数应用一个group by,分组后对每一个组单独排名
8. 索引提高查询效率的原理
SQLCMD -Usa -Psa -i testsql.sql 运行文件里的SQL语句
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
BEGIN

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://www.juheyunku.com/sql/mssql/2372.shtml

相关文章

风云图片

推荐阅读

返回mssql频道首页