热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer学习笔记1

1.分页查询--分页查询--查询前两个selecttop2*from#c;--查询前50%selecttop50percent*from#c;--分页,从第三个

1.分页查询

--分页查询
--查询前两个
select top 2* from #c;
--查询前50%
select top 50 percent * from #c;
--分页,从第三个开始,每页显示2个
/*
ROW_NUMBER() OVER (ORDER BY name1)rownumber
根据name1字段排序生成自定义的rownumber列
rownumber>2 也就是从rownumber=3开始显示
TOP 2* 只显示前两个*/
select top 2* from (select row_number() over(order by name1)rownumber,* from #c)temp 
where rownumber >2;

 over,开窗函数,over关键字表示把聚合函数当成聚合开窗函数而不是聚合函数,例:

select *,count(C#) over() from SC;

SQL 标准允许将所有聚合函数用做聚合开窗函数。

允许返回group by 或者聚合函数内不包含的其他列

over()内可以填写 partition by 类似于group by 分组查询,order by 排序查询

常用的还有 rank() over()排序函数:

select *,rank()over(order by score desc)排名 from SC;

两个99并列第一,而第二名不见了,保留了名次空缺

dense_rank() over()密集排序函数:

select *,dense_rank()over(order by score desc)排名 from SC;

查询各科成绩前三的记录

select * from (select *,rank() over(partition by C# order by score desc)A from SC)B 
where B.A<=3;

partition by C# 按C#分组,order by score desc,按分数降序排序

2.单引号处理

'Chef Anton''s Cajun Seasoning'

结果 Chef Anton's Cajun Seasoning

3.between and 可以用于字符串

select * from Products where ProductName between 'Carnarvon Tigers' 
and 'Mozzarella' order by ProductName;

4.变量 if while case

if else:

--定义一个变量
declare @Country varhcar(20);
--赋值
set @Country = 'Germany';
--查询Country为Germany的信息
select * from Customers where Country = @Country;
--查询CustomerID = 1的Country的值 赋值给@Country
select @Country = Country from Customers where CustomerID =1;
--if else 判断
declare @flag int;
set @flag = 10;
if @flag>5
begin --开始相当于大括号
    print '你好'
end --结束,如果不写,则只能写一条语句,和JAVA等高级语言类似
else
    print 'hello'

while循环

--while 循环
--建表
create table Score (
    Code int primary key,
    Degree int not null,
    Sex varchar(3)
);
--插入数据略。。。
declare @degree decimal(18,2)  --定义一个变量接受最高分
/*
      18:表示定点精度,小数点左边和右边可以存储的十进制数字的最大个数,最大精度为38
      2:表示小数位数,小数点右边可以存储的十进制数字的最大个数。
小数位必须是0~18之间(18是上面规定的定点精度)。默认的小数位是0。
*/ select @degree = MAX(Degree) from Score; --存下最高分 declare @code int; --定义一个变量接收学号 select @code = Code from Score where Degree = @degree; --存下最高分的学号 declare @sex varchar(3); select @sex = Sex from Score where Code = @code; --存入最高分学号对应的学生性别 if @sex = '' print '这是一个男同学' else print '这是一个女同学' while @degree > 90 --while循环 begin print '优秀!' break --打断循环 end

while if 嵌套

declare @degree int;
set @degree = 90;
while @degree <95
begin
    print '考得很好!'
    set @degree = @degree + 1
    if @degree = 93 --当@degree = 93时,跳出循环
        break
end

case when

--建表
create table Student (
   Sid int primary key,
   Age int not null 
);
--数据插入略。。。
select Age,
    case Age
        when 19 then '青年'
        when 18 then '小伙'
        else '少年'
    end
from Student;

 case when也可用于判断条件,例如 case when score >=60 then 1 else 0

select C#,(convert(decimal(5,2),sum(case when score >=60 then 1 else 0 end)*1.00/count(*))*100)及格率 from SC group by C#;

sum(case when score >=60 then 1 else 0 end),score >=60计1否则计0,计算总和,也就是算出了各科分数>=60的人数,*1.00转为浮点数,然后/count(*),除以总人数,得出比率,*100得出百分比

5.触发器

触发器有:

1.after 执行语句之后触发

2.insert 插入数据时触发

3.update 更新数据时触发

4.delete 删除数据时触发

5.instead of 执行语句之前触发:as 后的语句会替代原来执行的语句,原语句并不会被真正执行,例如:

alter trigger trigger_学生_Delete 
on 学生
instead of Delete
as 
begin 
select 学号, 姓名 from deleted
end 
delete from 学生 where 学号 = 4

上例中定义了“trigger学生_Delete”触发器,该触发器从“delete”表中打印出所要删除的学生.在执行“delete”操作后,会发现“学号 = 4”的学生并未被删除, 原因在于“trigger学生Delete”替代了所要执行的“delete from 学生 where 学号 = 4”语句,而在“trigger学生_Delete”中并未真正删除学生。

注意:inserted deleted 两张虚拟表分别存入插入、修改 更新前、被删除的数据

表结构与触发器应用的表结构相同

触发器完成工作后,这两张表会被删除

(1)insert触发器

--建表
create table Classes (
   ClassID int primary key,
   ClassName varchar(20) not null,
   Counts int not null  
);
--判断触发器是否存在,有则删除
if(object_id('tgr_classes_insert','TR')is not null)
drop trigger tgr_classes_insert
go
--创建触发器,每当一条数据被插入时,会另外再插入一条数据
create trigger trg_classes_insert
on Classes --触发器应用于Classes表
for inert --插入数据时触发
as
--定义变量
declare @Cid int,@Cname varchar(20),@Count int;
--在inserted表中查询已插入的信息,并给变量赋值
select @Cid = ClassID+1,@Cname = ClassName,@Counts = Counts +3 from inserted;
insert into Classes --插入数据
values (
           @Cid,
           --将Cid转为varchar,同时截取‘班’(截取下标基于1,截取长度),+号执行字符串拼接
           convert(varchar,@Cid)+substring(@Cname,2,1),
           @Counts
          )    
print '添加数据成功'
go
--该触发器的的作用就是Classes表插入数据时,会再向表中插入一条数据,
实用情况下,可以再向一张表插入数据时,同时给另一张表也插入一条数据
insert into Classes values(1,'1班',20);--触发器被触发

(2)delete触发器

--删除数据时备份
if(object_id('tgr_classes_delete','TR')is not null)
drop trigger tgr_classes_delete
go
create trigger tgr_classes_delete
on Classes
for delete
as 
print '备份数据中...'
if(object_id('ClassesBackUp','U')is not null)
--如果有备份表,直接插入数据
--将deleted表中的数据复制
insert into ClassesBackUp select * from Deleted;
--如果没有备份表,创建表再插入数据
else
select * into ClassesBackUp from Deleted;
print '备份数据成功!'
go
delete Classes where ClassID = 2;--delete触发器执行
select * from Classes;
select * from ClassesBackUp;

查询某个表的触发器有哪些:

select * from sysobjects where xtype = 'TR' and parent_obj = object_obj('tablename');

查询当前数据库内有哪些触发器:

select * from sysobjects where xtype = 'TR'

PS 复制表数据、结构常用语句

1.复制旧表的数据到新表(假设两个表结构一样)

INSERT INTO 新表 SELECT * FROM 旧表
2.复制表结构及数据,自动创建表
select * into 新表 from 旧表
select * into 新表 from 旧表 where 1=2;只生成表结构
 

 


推荐阅读
  • Mysql调优的顺序及面试问题总结
    文章目录一、调优相关1.第一步:本地explain线上查询遇到的第一个坑:遇到的第二个坑:2.第二步:覆盖索引3.第三步&# ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
author-avatar
eyk0256912
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有