SQL Cookbook(读书笔记)No.1

   看了SQL CookBook ,收获颇多,本文作为读书笔记,只介绍MS Sql,偶尔有自己的想法夹在在里面 ,希望拍砖,共勉之!

  测试环境:SQL Server 2005

文中用的数据库脚本

一、检索记录

1.6  在WHERE子句中引用取别名的列

Q:前面已经使用别名,我们想在WHERE子句中引用别名,语句如下所示:

select sal as salary , comm as commission
from emp
where salary < 5000

执行语句,结果"查询时显示该列无效……"。

A:将查询作为内联视图就可以引用其中的取别名的列:

select *
from (
select sal as salary , comm as commission
from emp
) x
where salary < 5000

PS:WHERE子句是在SELECT 之前进行处理的,这样在处理“问题”查询的WHERE子句前,SALARY和COMMISSION并不存在,要到WHERE子句处理完成之后,别名才生效。FROM子句是在WHERE之前处理的。这样最外层的WHERE子句看到别名之前,就已经生成了查询结果。

 

1.7 连接列值

Q:将多值作为一列返回。查询表EMP,返回如下结果集:

 

数据来自EMP表中的ENAME和JOB列:

select ename,job
from emp
where deptno=10

A:使用"+"运算符进行连接操作。

select ename+' WORKS AS A '+job as msg
from emp
where deptno=10
1.8 在SELECT语句中使用条件逻辑

Q:在SELECT语句中,对数值执行IF-ELSE操作。Ex.如果员工工资<=2000$,返回消息"UNDERPAID";>=4000$,返回消息"OVERPAID";两者之间,返回消息"OK",结果集如下:

A:使用CASE 表达式

select  ename,sal,
case when sal <= 2000 then 'UNDERPAID'
when sal >= 4000 then 'OVERPAID'
else 'OK'
end as status
from emp

1.9 限制返回的行数

Q:查询中返回N行。

A: 使用TOP 关键字,想、来限制返回的行数:

select top n  *   from [tablename]

 

1.10 表中随机返回n条记录

Q:从表中随机返回n条记录

A:使用内置函数NEWID、TOP和ORDER BY,返回随机结果集:

select top 5 ename,job
from emp
order by newid()

PS:ORDER BY子句接受函数返回值,并使用它改变结果集的次序。先执行ORDER BY子句,在查询返回的行数。参照Orcle的解决方案,原理就清楚多了:

select * 
from (
select ename,job
from emp
order by dbms_random.value()
)
where rownum=5
 
1.12 将空值转换为实际值

Q:将空值转换为实际值

A:使用COALESCE函数

select coalesce(comm,0)
from emp

ps:

函数 COALESCE ( expression [ ,...n ] )

参数:expression  任何类型的表达式。 n 表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。

作用:返回表达式中第一个非空表达式.

--返回结果为3
SELECT COALESCE(NULL,NULL,3,4,5)

我们可以用case来实现,但明显不如函数灵活.

select case 
when comm is null then 0
else comm
end
from emp



 



转载于:https://www.cnblogs.com/DandBayer/archive/2012/01/12/2320255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值