您的位置:首页 > 数据库

SQL Cookbook(读书笔记)No.1

2012-01-12 11:34 309 查看
看了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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: