基于sqlserver的常用查询、视图、触发器、存储过程用法

本文详细介绍了SqlServer中的数据操作,包括插入、修改和删除语句,以及各种查询技巧,如消除重复行、where子句、order by、聚集函数、group by和having。此外,还探讨了视图的概念、创建与应用,以及触发器的使用,包括after和instead of的区别,以及触发器的优点和应用场景。
摘要由CSDN通过智能技术生成

首先在这申明,sqlserver是不区分大小写的。

SqlServer插入语句
insert into <表名>  [<属性1><属性2><属性3>] values(<常量1><常量1><常量1>)
SqlServer修改数据语句
update <表名> set <列名>=<表达式>,<列名>=<表达式> [where <条件>]
SqlServer删除数据语句
delete from <表名> [where<条件>]
查询中消除重复的行
select distinct Sno from sc;
where子句后面常跟的查询条件
  1. 比较—(=、<、>、>=、<=、!=、!>、!<(不小于)、)
  2. 确定范围—-(between and、not between and)
  3. 确定集合—–(in、not in)
  4. 字符匹配——(like、not like)
  5. 空值——(is null,is not null)
  6. 多重条件—–(and、or、not)
下面是上述的例子
select Sname from student where sdept='cs';
select Sname from student where sage between 20 and 30;(如果用not between and 就是不在这个范围的)
//使用谓词来查找属性是否属于指定集合元祖
select sname  from student where sdept in('cs','ma','is');
select sname from student where sname like '刘%'; 
select sname from student where sname like '_勇'; 

//  %用来代表任意长度的字符串
//  _下划线代表是任意字符
select sno from sc where grade is  not null;
select sname from  student where sdept='cs' and sage<20;
order by子句

用户可以用order by子句对查询结果按照一个或多个属性列进行排序,默认是升序。

select sno ,grade from sc where cno='3' order by grade desc;//升序是asc
聚集函数
  1. count(*) ——-统计元祖的个数
  2. count(distinct 列名)——统计某个列值的个数
  3. sum(distinct 列名)——–统计列的总和
  4. avg(distinct 列名)——-计算列的平均值
  5. max(distinct 列名)——-计算列的最大值
  6. min(distinct 列名)——-计算列的最小值
select AVG(grade) from sc ;

注意:

where 子句是不能用聚集函数作为条件表达式,聚集函数只能用于select 子句和group by 的having子句中。

group by子句

顾名思义,这个子句将查询结果按照某一列或者多列值分组,值相等的为一组。对查询结果分组是为了细化聚集函数作用对象,分组后,聚集函数将作用于每一组,每一组都有一个函数值。

select cno,COUNT(sno) from SC group by Cno;
//查询课程号下对应的选课人数。
// *凡是在group by后面出现的字段,必须要在select后面出现,或者该字段以聚合函数出现在select后面*  详细的理由如下:

//这句话的意思,就是将相同学号的grade列的属性值求平均值
select sno ,avg(grade) from sc group by sno;

正确的结果:

![这里写图片描述](https://img-blog.csdn.net/20171104185913643?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmVudXMzMjE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

如果这时你不写sno,没问题,你自己知道是个啥就ok。

但是如果你这时写了个下面这个

select grade ,avg(grade) from sc group by sno;
//就会产生错误选择列表中的列 ‘sc.Grade’ 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
//很明显呀,你是按照学号排,你把分组之后的结果和grade放在一起,你觉得符合人之常情吗,明白了没,这么通俗易懂!!!!!!



分组重要的是一一匹配,如果这个不理解可以阅读下面文章
http://blog.163.com/xiaopengyan_109/blog/static/149832173201081983042803/

having

having一般是跟在group by子句后面,是对分组之后的信息筛选。

where作用对象是基本表或者是视图,而having作用于组,从中选择满足条件的组。

select sno from sc group by having count(cno)>2;
//查询选修课程两名以上的学号。
两表等值连接查询

连接查询,连接主要通过他们的公共属性。

select sname ,cno from SC,student where SC.Sno = Student.Sno;
//*注意在连接查询的时候,一定要注意如果出现的属性两个表都有一定要加表名区分*
两表自身连接

是在一个表中进行自身的连接。主要通过给表起两个不同名字,让相关心的字段等值连接。

例子:在一个表中要查每门课的先修课的先修课。

select first.cno,second.cno from Course first,Course second where first.Cno = second.Cpno;
//*在自身连接中如果查询条件中和select后面出现的字段一致,前面以示区分的表别名要不一致,否则有问题。*
tip

在这里我说一下,sql查询是采用的嵌套循环连接算法思想,就是在一个表中,我查询到一条数据,然后从另一个表,一一去寻找等值关系的数据,在返回。

外连接

就是在两个表进行连接查询,如果查询的结果有一方面是为空的,那么该结果是不保存的。

例子:比如查询考生的选课情况,及成绩,如果该同学没有选课,那么就查不到该学生,所以要是想显示该学生,必须按照学生表为主,显示。

select Student.Sno,sname,grade,cno from student,SC where Student.Sno  =SC.Sno;//它会直接忽略没有选课成绩的学生信息

select Student.Sno,sname,grade,cno from student 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值