从【各大软件公司笔试压轴题】学习SQL语句
从博客园中看到一篇文章,介绍大软件公司面试时常常会出的两道SQL题(见附录)。
我觉得受益很多,在此之前,我一直觉得,SQL2008似乎提供了这方面的支持,但更低的版本,包括2005,非游标做不出来(水平够菜)。总结心得如下:
1、 强大的group by
1
select stdname,
2
isnull(sum(
case
stdsubject when
'
化学
'
then Result end),
0
) [化学],
3
isnull(sum(
case
stdsubject when
'
数学
'
then Result end),
0
) [数学],
4
isnull(sum(
case
stdsubject when
'
物理
'
then Result end),
0
) [物理],
5
isnull(sum(
case
stdsubject when
'
语文
'
then Result end),
0
) [语文]
6
from #student
7
group by stdname
在这里,group by与sum +
case结合,可以将表1中的记录(行)变成表2的字段(列)。Sum里面如果没有case,那么出来的值,只能是全部科目的总和,用了case以后,就
是某科的成绩;然后这里用了好几个sum,每个科目一个sum,于是表1中本来某人某科占一条记录的“行”就变成了表2里某人一条记录,每科做一个字段
了。
这种心思巧妙和对语法的熟练运用让人击节赞叹。
2、 利用select from (select from)的模式生成SQL语句
1
declare @sql varchar(
4000
)
2
set
@sql
=
'
select stdname
'
3
select @sql
=
@sql
+
'
,isnull(sum(case stdsubject when
'''
+
stdsubject
+
'''
then Result end),0) [
'
+
stdsubject
+
'
]
'
4
from (select distinct stdsubject from #student)
as
a
5
select @sql
=
@sql
+
'
from #student group by stdname
'
6
print @sql
7
exec(@sql)
为了自动写上所有的科目,这里先将科目信息提炼出来:
4
from
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
很多人特别喜欢用视图,但有的人从来不用视图.这都是两种不良的习惯. 要明确视图可以完成的工作以及使用场合.
1.阻止选择保密列
2.降低用户读取数据库内数据的复杂性
3.在数据库中添加索引以加速 ......
mysql : 将一个表的数据插入到newT 中
(newT 表须存在,且结构与select 语句对应的结构同 ,最好不用* 而是具体字段)
insert into newT select * from t1 where ...
也可以create table newT select f1,f2 from t1; (select into 的替代方法,my ......
@@IDENTITY:返回最后插入的标识值的系统函数。
SCOPE_IDENTITY:返回插入到同一作用域中的标识列内的最后一个标识值。一个范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。
IDENT_CURRENT:返回为指定的表或视图生成的最后一个标识值 ......
SQL Server 2005 hash联接算法
如果两个联接输入都很大,而且这两个输入的大小差不多,则预先排序的合并联接提供的性能与哈希联接相近。但是,如果这两个输入的大小相差很大,则哈希联接操作通常快得多。
哈希联接可以有效处理未排序的大型非索引输入。它们对复杂查询的中间结果很有用,因为:
&nbs ......