从【各大软件公司笔试压轴题】学习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 (select distinct stdsubject from #student) as a
利用之拼接生成SQL语句。当然现实中,如果#student表很大,这种做法并不妥,应该都有一个专门的科目类别表的。
3、 在临时库中提炼出字段名。临时表是真实存在的表,保存在[tempdb]中,可以利用object_id('tempdb.dbo.表名')
相关文档:
一直没有找到一种好的方法来引用有返回值的存储过程的方法,使我在添加数据中走了不少的弯路,最近,在查阅了大量的资料之后,终于在微软的一个实例中找到了一种良好的方法。
首先编写好一有返回值的存储过程
create procedure proc_name
@para1 nchar(20), --输入参数
@ ......
Use 数据库
DECLARE @ProcName varchar(50)
Create Table #tmpName(Content varchar(2000))
Create Table #tmp(ProcName varchar(2000),Content1 varchar(8000))
--定义一个游标
DECLARE SearchProc CURSOR FOR
--查询数据库中存储过程的名称,尽量去除系统PROC,可以根据crdate时间字段来寻找非系统PROC
select n ......
你的SQL Server 2000必须打上SP3的补,然后安装Microsoft的JDBC驱动,将以下三个jar包复制到WebContent\WEB-INF\lib
msbase.jar
mssqlserver.jar
msutil.jar
下面是测试代码,没有报错数据库就能正常连接
public class DbcTest {
/**
* @param args
*/
public static void main(String[] args) {
Str ......
在SQL中可以使用Like进行模糊查询,例如 f_stuname like 'a%' 查询f_stuname列以a开头的记录。
当我们在应用中使用
f_stuname
like '%a%' 时,如果
f_stuname有索引的话,这个索引也是不执行的
在SQL优化中这个写法就是一个不好的SQL了。
那么如何来替换这个呢,这一个就用到了Oracle的instr函数了
我们可以这样 ......
SQL Server7.0数据库:数据仓库、数据复制、分布式数据库应用程序、Intelnet和Intranet应用和管理工具;
安装检测:1、net start mssqlsever;
2、osql /usa /p ;
......