看了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