显示下一条  |  关闭

归去来

飘泊者

 
 
 
 
 
 

《好久没有写日志鸟》

2011-4-14 9:54:36 阅读9 评论0 142011/04 Apr14

减肥日志一(一)

晚上少吃点噻。快点见效果哦。

作者  | 2011-4-14 9:54:36 | 阅读(9) |评论(0) | 阅读全文>>

 

  

亲爱的笨鸟(哼哼)读者们:

当您看到这个日志的时候,我刚刚作出了一个非常艰难的决定,我决定换上新的风格——"为什么道别离 "。这样也许会影响您的阅读习惯,我诚恳向您致歉。笨鸟(哼哼)有幸能陪伴着您成长;未来的日子,我期待与您继续同行!

今天我也做了一个非常艰难的决定-换风格为什么道别离 - 笨鸟(哼哼) - 归去来为什么道别离   


寻找博客风格,下一个"非常艰难"的决定!点击查看>>

作者  | 2010-12-1 15:41:28 | 阅读(15) |评论(0) | 阅读全文>>

ASP.NET MVC Url (路径)中参数过长引发的问题

2010-11-5 15:11:24 阅读116 评论0 52010/11 Nov5

今天使用ASP.NET MVC的时候需要给一个Action传递较长的参数类似:http://xx.xx.xx.xx/xxxxController/xxxAction/xxxx001$xxxx002$xxxx003$....,

IIS报错:The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

解决方法:

  1. 尽量避免传递长Url的情况;
  2. 在web.config中设置最大url length和querystring length:<httpRuntime maxQueryStringLength="2097151" maxUrlLength="2097151"/>;
  3. 把原来通过路由参数传递的字符串改用QueryString的方式传递,即将{controller}/{action}/id的方式改为{controller}/{action}?id=的方式。

作者  | 2010-11-5 15:11:24 | 阅读(116) |评论(0) | 阅读全文>>

分组数据以及on/where/having的顺序问题

2010-11-4 12:29:44 阅读43 评论0 42010/11 Nov4

参考:

1:on、where、having的区别

2:《SQL查询初学者指南》第二版,机械工业出版社

 

分组:

当 我们添加了一个group by子句,就向数据库指定了from和where子句所形成的逻辑表中的哪些列要用作对行进行分组。在我们所指定的列上具有相同值的行,将会被划分为一组 (如果group by 指定的是多列,则只有当某两行的这几个列的值都相等时才被分到同一组)。然后可以在分组的基础上计算聚合函数的值。在select之后出现的但没有被应用 于聚合函数的列,必须出现在group by之后。

不能把聚合函数嵌套在另一个聚合函数中

如SUM(AVG(price))是非法的

 

不能使用子查询作为一个聚合函数的值表达式

AVG(select price from products )是非法的

On where having的顺序问题

在 多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算 完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

所以having是最慢的。但也不是说having没用,当必须得到计算结果之后才能进行过滤时,就要用having了。

比如可以:HAVING SUM(price) > 300 而不能:where SUM(price) > 300,因为where的时候还没有进行sum的计算。

但你可以利用子select语句在where的过滤条件中运用聚合函数

例:

select engagementNumber

From engagements

Where ContractPrice >= (

Select avg(ContractPrice) from engagement

)

在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢。

总之:on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后.

作者  | 2010-11-4 12:29:44 | 阅读(43) |评论(0) | 阅读全文>>

表之间的连接 join

2010-11-4 12:12:04 阅读47 评论0 42010/11 Nov4

内链接就是对表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的条目。

左连接就是在内连接的基础上,将A中有但C中没有的元组也加上。由于C的列数比A的列数多,所以这新增的元组左边照搬a,右边为null。

右链接就是在内连接的基础上,将B中有但C中没有的元组也加上。由于C的列数比B的列数多,所以这新增的元组右边照搬B,左边为null。

所谓的full join ,就是在join的结果d后边先加上left join 要加的项,再加上right join 要加的项

所 谓的交叉连接(select * from tableName1 cross join tableName2)和select * from tableName1, tableName2是一样的,都是得到笛卡尔积。可以用select * from table1,table2 where....模拟join操作。

所谓的自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。

直接写join就是内连接,相当于inner join, inner可省

写left join或者right join就是外连接,outer可省

 

例子

有两表A和B

A

clip_image001

B

clip_image002

下面是一些select操作

select * from A cross join A

clip_image003

select * from A join B on A.name = B.name

就是对笛卡尔积,也即上边的cross join的结果进行进一步筛选,选出满足A.name=B.name的行。

只有两行符合条件

clip_image004

在上衣select语句的基础上增加了一行

select * from A left join B on A.name = B.name

clip_image005

同上

select * from A right join B on A.name = B.name

clip_image006

select * from A full join B on A.name = B.name

clip_image007

进阶

重要理论依据:

在可以指定一个表名的任何地方,都可以指定一个括号括起来的join子句。

在两个表的一个完整join语句出现的任何一个地方,我们都可以只用一个表名来代替它。

 

所谓“两个表的一个完整join语句”也即“join子句”,就是指如“A join B on A.a= B.b”这样一个完整的句子

比如:欲连接ABCDE五个表

可以这样:

Select * from A inner join(((

B inner join C on B.b = C.c)

inner join D on B.b = D.d)

inner join E on D.d = E.e)

on A.a = E.e

也可以这样:

select * from (((

A inner join B on A.a = B.b)

inner join C on C.c = A.a)

inner join D on D.d = C.c)

inner join E

on E.e = D.d

也可以这样:

select * from

A inner join B on A.a = B.b

inner join C on C.c = A.a

inner join D on D.d = C.c

inner join E on E.e = D.d

我们可以先把A和B连接起来,然后将结果与C连接,当然,如果C只和B相关而不和A相关的话,我们也可以先把B和C连接起来,结果再与A连接,只要保持关系是正确的,你可以以任意方式来定义嵌套的join。

然而大多数数据库系统会分析整个from子句,然后尝试确定组合连接表的最有效方式,也就是说数据库不不一定会从最里边的括号开始执行查询。这很可能打乱你的逻辑设计,得到意外的结果。

另外,一些数据库系统中的优化器对于join定义的顺序很敏感。如果你发现使用很多join的查询在一个较大的数据库上执行花很长时间,通过改变sql语句中的join顺序很可能能够使它运行的更快。

注意:有时候,你只需要A和C表中的一部分数据,但A和C只有通过B才能发生关系,那么你依然要先将A和B连接,然后再连接C

一个比较全面的例子:

select RCFiltered.ClassName, R.RecipeTitle

from

(select RecipeClassId,

RecipeClassDescription as ClassName

From Recipe_Classes as RC

where RC.ClassName = 'Salads' or RC.ClassName = 'Soup' or Rc.ClassName = 'Main Course')

as RCFiltered

left outer join Recipes as R

on RCFiltered.RecipeClassId = R.RecipeClassId

这个例子的内涵:

1. 在大多数sql的实现中,我们可以把from子句中的任何表名替换成一条完整的select语句.当然,必须分配一个相关名称。本例中为子select语句分配的名称为RCFiltered,在第7行。

2. 当我们决定以select代替表名的时候,要确保select的结果不仅包含想要出现在最终结果中的列,而且包含需要执行join的列。这就是为什么我们 在嵌入的select语句中既看到了RecipeClassId又看到了RecipeClassDescription.

3. 我们给RecipeClassDescription一个别名ClassName,所以在第一行使用了RDFiltered的别名。第一行的select只看到了表RCFiltered,看不到表Recipe_Classes

作者  | 2010-11-4 12:12:04 | 阅读(47) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
日志评论
评论列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
 

北京市 海淀区 金牛座

 发消息  写留言

 
徒步前进。。。。。
 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

自定义模块

 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
圈子列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注