WIN7:

Internet 信息服务(IIS)管理器
---------------------------
除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。
在“运行”里输入services.msc回车 找到Windows Process Activation Service服务, World Wide Web Publishing Service服务
Q:显示部门10中的员工名字、职位和工资,并按照工资升序排列。

A:使用order by 子句:
select ename,job,sal
from emp
where deptno = 10
order by sal asc
PS:我们可以用列的编号代表排序所基于的列名,从1开始(这个数值必须不能大于SELECT选择列表中项数)
select ename,job,sal
from emp
where deptno = 10
order by 3 asc
一般情况下都可以执照SELECT列表中没有的列来排序,但是必须显式地给出排序的列名。
注:sal列在select选择列表中没有出现,且不能用数字替代(你也不知道该字段的顺序,二元表结构是无序的)。
返回的结果集数据排列和上面一致,只是没有sal字段的数据。
select ename,job
from emp
where deptno = 10
order by sal asc
如果在查询中使用GROUP BY或DISTINCT则不能按照SELECT列表中没有的列来排序。
在ORDER BY子句中可以使用SELECT选项中的别名:
select ename,job,sal as salary
from emp
where deptno = 10
order by salary asc
Q:按子串的某一部分对查询结果排序。例如,要从EMP表中返回员工名字和职位,并且按照职位字段的最后两个字符排序,结果集应如下所示:

A:在ORDER BY子句中使用和SUBSTRING函数:
select ename,job
from emp
order by substring(job,len(job)-2,2)
PS: 使用DBMS的子串函数,可以很容易地按字符串的一部分来排序。要按照字符串的最后两个字符来排序,首先要找到字符串的末尾,并减2。起始位置就是字符串中的倒数第2个字符。然后,获取从起始位置开始的所有字符。SQL在SUBSTRING中需要第3个参数来指定要获取的字符数。在本例中,只要这个数目大于或等于2就可以了。
Q:在EMP中根据COMM排序结果,这个字段有空值(需要指定是否将空值排在最后)
--查询1
select ename,sal,comm
from emp
order by 3
--查询2
select ename,sal,comm
from emp
order by 3 desc
结果集1: 结果集2:

PS: 使用CASE表达式来标记一个值是否为NULL。该标记有两个值分别表示NULL或非NULL,在ORDER BY子句增加该标记列,便可以很容易控制空值是否排在最前还是最后,而不会为空值而干扰。
--S1.COMM列非空数据升序,空值排在最后
select ename,sal,comm
from (
select ename,sal,comm,
case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null desc,comm
--S2.COMM列非空数据降序,空值排在最后
select ename,sal,comm
from (
select ename,sal,comm,
case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null desc,comm desc
--S3.COMM列非空数据升序,空值排在最前
select ename,sal,comm
from (
select ename,sal,comm,
case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null ,comm
--S4.COMM列非空数据降序,空值排在最前
select ename,sal,comm
from (
select ename,sal,comm,
case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null ,comm desc
结果集:
S1 S2 S3 S4

Q:根据某些条件逻辑排序。Ex,若JOB是“SALESMAN”,要根据COMM来排序。否则根据SAL排序,返回如下结果集:

A:在ORDER BY子句中使用CASE语句
select ename,sal,job,comm
from emp
order by case when job = 'SALESMAN' then comm else sal end
PS:下面的写法让人容易理解
select ename,sal,job,comm,
case when job = 'SALESMAN' then comm else sal end as ordered
from emp
order by 5

Q:要将多个表的数据组织一起,就像一个结果叠加在另一个上面,这些表不必有相同的关键字,但是,他们对应列的数据类型应相同。
Ex,要显示EMP表部门10中员工的名字和部门编号,以及DEPT表中每个员工的名字和部门编号,结果集如下图:

A:使用集合操作UNION ALL把多个表的行组合在一起
select ename as ename_and_dname,deptno
from emp
where deptno = 10
union all
select '----------',null
from t1
union all
select dname,deptno
from dept
PS:所有SELECT列表中的项目数和对应的数据类型必须匹配,错误的查询语句:
--查询一
select deptno
from emp
union all
select deptno,dname
from dept
--查询二
select deptno
from emp
union all
select ename
from dept
注:UNION ALL 包含重复的项目。可以使用 UNION 筛选掉重复的项目。
select deptno
from emp
union
select deptno
from dept
EMP.DEPTNO 和 DEPT.DEPTNO 的 UNION 只返回4 行:

如果使用UNION而不是UNION ALL,很可能会为了去除重复项而进行排操作。处理大结果集时要记住,使用 UNION 子句大致等价下面的查询,对 UNION ALL 子句的查询结果使用DISTINCT:
select distinct deptno
from (
select deptno
from emp
union all
select deptno
from dept
) x
查询不要使用DISTINCT,除非有必要;对于UNION而言也是如此。一般使用UNION ALL,而不使用 UNION。
Q:查找两张表的共同行,但又多列可以用来联接的这两个表。Ex,下面的视图:
create view V
as
select ename,job,sal
from emp
where job = 'CLERK'
select * from V

现要返回表EMP中与视图得到的行相匹配的所以职员的ENPNO、ENAME、JOB、SAL和DEPTNO,得到如下结果集:

A: 列进行联接或使用集合操作INTERSECT,返回两个表的交集。
--使用多个联接条件,将表和视图联接
select e.empno,e.ename,e.job,e.sal,e.deptno
from emp e, V
where e.ename = v.ename
and e.job = v.job
and e.sal = v.sal
--使用join子句来执行
select e.empno,e.ename,e.job,e.sal,e.deptno
from emp e join V
on ( e.ename = v.ename
and e.job = v.job
and e.sal = v.sal )
--使用集合操作INTERSECT以及IN谓词
select ename,ename,job,sal,deptno
from emp
where (ename,job,sal) in (
select ename,job,sal from emp
intersect
select ename,job,sal from V
)
PS:集合操作INTERSECT将返回两个行来源中的共同行。在使用INTERSECT时,要求两个标的项数数目相同,对应的数据类型也相同。默认情况下不会返回重复行。
3.4 从一个表中查找另一个表没有的值
Q:要从一个表中查找另一个表中不存在的值。Ex:从表DEPT中查找在表EMP中不存在的数据的所有部门。示例数据中DEPTNO的值为40的记录在EMP中不存在,所以结果集应该如下
deptno
-----------
40
S:SQL Sever不支持差集函数
select deptno
from dept
where deptno not in ( select deptno from emp )
(To Be Continue)
看了SQL CookBook ,收获颇多,本文作为读书笔记,只介绍MS Sql,偶尔有自己的想法夹在在里面 ,希望拍砖,共勉之!
测试环境:SQL Server 2005
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子句看到别名之前,就已经生成了查询结果。
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
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
Q:查询中返回N行。
A: 使用TOP 关键字,想、来限制返回的行数:
select top n * from [tablename]
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
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
我收到了不少新手的来信,他们都希望能成长为一名真正的程序员。我绝对不是第一个谈论这个话题的人,所以,我不知道应该做哪方面的补充。不管怎样,下面的是一些一直记在我心头的、有必要读一下的建议: