现在的位置: 首页 > 数据库 > 正文

SQL学习指南笔记

2014年11月01日 数据库 ⁄ 共 1391字 暂无评论 ⁄ 阅读 832 次
文章目录

SQL发展历程

根据Codd对关系模型的定义,他提出一种名为DSL/Alpha的语言用于操控关系表的数据。后来,IBM根据他的想法构建模型,创建了DSL/Alpha的简化版本,即SQUARE,然后对之改进,发展成为SEQUEL语言,并最终命名为SQL。所以,我们可以按它的原名读“sikwl(西裤)”。

需要注意的是,SQL并不是任何短语的缩写(尽管很多人坚持认为它代表结构化查询语言Structured Query Language),当提到此语言时,我们可以读sequel或S.Q.L。

SQL是非过程化语句,它执行的方式是交给优化器处理。

子查询

非关联子查询:它可以单独执行而不需要引用包含语句中的任何内容。

关联子查询:它依附于包含语句并引用其一列或多列。与非关联子查询不同,关联子查询不是在包含语句执行之前一次执行完毕,而是为每一个候选行(这些行可能会包含在最终结果集里)执行一次。它先从主查询中检索出所有行,然后为每一行执行一次子查询,最后符合过滤条件的行被返回执行。

在关联子查询中使用exists,只要存在1行结果即结束后续工作,节省了CPU的计算工作,而且返回结果也简化和true和false,减少了内存占用。

一个有意思的例子(坑爹的NULL):查询每个账户的最新交易日期,再修改account表的每一行为最新交易日期。

被坑写法:

update account a

set a.last_activity_date =

(select max(t.txn_date)

from transaction t

where t.account_id = a.account_id);

如果用户最近没有交易,那么account中记录的用户历史的最后一次交易信息会被覆盖为NULL,有木有!坑了吧,搞完还不知道错了,结果领导用数据时发现不对,结果你又不知道什么时候搞错的。

修正写法:

update account a

set a.last_activity_date =

(select max(t.txn_date)

from transaction t

where t.account_id = a.account_id)

where exists (select 1

from transaction t

where t.account_id = a.account_id);

子查询在from子句中必须是非关联的,它们首先执行,然后一直保存于内存中直至主查询执行完毕。

CASE表达式

查询型case表达式,语法:

case

when C1 then E1

when C2 then E2

...

when Cn then En

[else Ed]

end

C1、C2、…、Cn等代表条件,E1、E2、…、En代表结果,Ed代表默认结果。

简单case表达式,语法:

case V0

when V1 then E1

when V2 then E2

...

when Vn then En

[else Ed]

end

V0代表一个值,V1、V2、…、Vn代表要与V0比较的值,E1、E2、…、En代表结果,Ed代表默认结果。

else是可选的(但如果所有条件均不满足且没有else则会报错),end是必须的,各条件间没有“,”,结束没有“;”。

查询型case还可用于检查存在性,如when子句写为:when exists(…) then …。

case表达式外也可以使用聚合函数,如select sum(case when … then 0 else 1 end) from …。

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?