一些容易被忽视和遗忘的SQL 技巧(SQL SERVER)

1.外键的级联操作

大家都知道在定义了外键之后,如果对主键表进行数据删除或更新时,如果存在数据关联,则触发外键约束抛出异常并且删除操作被回滚。这个就是SQL SERVER的默认设置。

其实我们还可以设置其操作为“级联”、“设置NULL”或者“设置默认值”。“级联”也就是在发生主键表删除或更新操作时,相关外键数据也被删除或者更新为与主键一致的值。“设置NULL”即将如果外键列可接受NULL值,则更新为NULL。“设置默认值”即将外键列相关行设置为默认值。这3个选择在许多场景中可给我们带来很大的方便,可以根据需要应用。


2.Top 关键字

TOP不仅可以指定返回的行数,还可以用百分比的形式。

例如:

SELECT TOP (10) PERCENT FROM 表名  返回前10%的数据行


“WITH TIES” 关键字

这个关键字是干什么的呢?它的意思是“与xxx打成平局”,也就是说并列排名也都列出来。通常我们取Top,一定是与某种排序相关ORDER BY,那么就可能存在并列排名的情况。

举个例子:

我们想获得用户表中年龄最大的前10位:SELECT TOP 10 * FROM User ORDER BY Age DESC。但是可能排名第10位的有3个年龄一样的并列排名的人。那我们执行TOP 10就只会取到10个人,会丢掉2个人,这在实际业务中是有错误的。这时我们就可以使用WITH TIES关键字:

SELECT TOP 10  WITH TIES * FROM User ORDER BY Age DESC

此时我们取到的将是12条数据,因为最后3个人是并列排名


3.标示列字段插入字段内容

我们都知道,如果把一个字段设置为标识列,也就是通常说的自增列,我们就无法使用Insert语句为其指定要插入的值,如果我们这么做了,会报错。因为标识列在一般情况下是只读的,所以不允许插入数据。

但是我们可以通过先执行 SET IDENTITY_INSERT 表名 ON语句,然后就可以在标识列字段插入数据了。


4.COUNT与GROUP BY

我们经常需要按某列分组统计数量,例如学生选课,我们希望按课程分组统计每门课程的学生数。那么通常我们会这么写:SELECT CourseName,Count(*) FROM Course GROUP BY CourseName。

这看起来很好,但是问题是如果这门课程没有人选,则不会出现在结果集中。很明显这不是我们想要的结果,我们想要的是如果没人选的课程,则Count列为0。那怎么办呢?


我们可以这样做:

SELECT CourseName,Count(*) FROM Course GROUP BY ALL CourseName

GROUP BY后面加上ALL关键字就可以实现我们想要的了



未完待续

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值