SQL Server 总结复习 (二)
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
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
