仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1123|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:SQL Story摘录(七)――――触摸NULL值...

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:27:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。
后面的文章中,我们开端见地了NULL这个难以想象的小器材。明天,我尽量具体的先容一下它。按照常规,这是一次只管浅易但其实不松散的会商,乃至大概内容也不那末严厉。我的目标在于匡助读者更轻松地事情,而且有乐趣对数据库进一步的进修。从另外一方面讲,我信任本人论点中的毛病,一定会有其别人也在犯,以是请发明不当的伴侣必定要公然指出。如许,才有助于我和我的读者伴侣们前进。衷心感激每个提出品评和斧正的伴侣,出格是公然提出品评和斧正的伴侣们。出格感激sunshine19,特地发来E-mail,指出了《SQLStory》的各种不敷,并提出了可贵定见。我希冀他持续体贴这个专题,并希冀他为我们带来优异的作品。

无可躲避的不存在

例:双人房间。

假定某个黉舍,它的只身职工公寓中,每一个房间有两个床位。如许做有良多优点,好比平安,都是半年夜不小的年老人,不论男孩女孩,有个伴一同住总让人宁神些,相互也有个呼应;假如有谁结了婚,因为每一个房间最多住两团体,还能够对照简单地找出一间,先给他们安个家,渐渐等着分房。这些事固然不要我们程序员多费心(除非我们就住在内里)。如今要体贴的是,有人做了一个公寓办理数据库。个中的房间办理表如许子计划:

CREATETABLEROOMS(

ROOMIDCHAR(5),

MASTERIDCHAR(10),

SECONDIDCHAR(10),

CONSTRAINTPK_ROOMPRIMARYKEY(ROOMID),

CONSTRAINTFK_MASTERFOREIGNKEY(MASTERID)REFERENCESLIVERS(ID),

CONSTRAINTFK_SECONDFOREIGNKEY(SECONDID)REFERENCESLIVERS(ID)

)

复杂先容一下,办理员为了便利办理(好比收个水电费甚么的),请求每个住人的房间有一个房东;两团体更具体的信息保留在了LIVERS表中,以是我们看到有两个外键束缚。固然,这个计划并不是自作掩饰,不外它也自有它的来由,在这里我们先不会商了。

这里要存眷的是,佃农少于两团体的房间,我们该在空出来的中央填甚么?有一个办法,就是填进一个空字符串,可如许一来,就即是我们默许了存在一个ID号为空字符串的住户存在。由于空字符串也是字符串嘛。两个外键束缚也申明了这一点。现实上,在相似如许的计划中,我就见过一些例子,其作者为了不无可援用的情形,平空造出一个不存在的信息,做为数据库布局的一部分。详细到这个例子,大概会有人真的用一个空字符串或写一个“NONE”甚么的,写在LIVERS表中,暗示没有人寓居。一般这会引发良多成绩,好比我们大概要加一个束缚,使得一团体不克不及呈现在ROOMS表中两次。可如今这个假造出来暗示没有人的佃农怎样办?可有良多地位都没有人啊,好比只需有一个空屋,就会在这一笔记录上有两个“NONE”!在更古怪(但在某些使用中尽非不成能)的情形下,有一个佃农,他的ID就是“NONE”,怎样??并且假如极度情形下,佃农全搬进来了,怎样办?想要“DELETFROMLIVERS”都不可,“NONE”可删不失落啊。当你事情在如许一个数据库中,得不时提示本人不要冒犯了这个不存在的家伙。要记着,他没有性别,以是男女职工的房间他都要住;他人一团体只能睡一张床,他却能够要一切余暇的;他人都搬进来后,他白叟家一团体占了一切的房间,我们的功令规章对他全没成心义。这类特别值给我们带来的最年夜成绩,就是把信息和数据库布局搅在了一同。也就是说,干系和干系的形式等量齐观了。假如一个数据库中有上几个这类表,谁城市疯的。

这就是NULL的意义,当你把一个数据界说为NULL时,就即是告知体系,这个数据不存在,或未知。不要管它了,它的内容没成心义(固然,这自己也是一种意义)。在房间中有一个NULL,只暗示没有人,而不会被以为是一个叫“没有人”的人住在内里。更不会有一个占领了一切房间的恶客存在。要清空LIVERS,那就清吧,只需你设置了级联束缚,就不会有任何古怪的事呈现。独一的成果只是一个无人寓居的公寓罢了,这不恰是我们所要的吗?

NULL是实在存在的,只管从某种意义上讲,我们没法注释它的存在。它是干系天下的黑洞。大概会让一些人不恬逸,但躲避它只会给我们带来更多的贫苦。

看不见摸不到

在《SQL-3参考年夜全》中,作者如许注释NULL的寄义:未知或不决义。对NULL来讲,有良多风趣的特征。

NULL是一个数据值,并且它属于一个域(?)。是的,比方一个字符串字段,个中的空值只能是一个字符串。只管它的内容没有界说,大概未知,但它是字符串,这一点无可置疑。

NULL不长短法数据,这一点SQL-3尺度也说的很分明。我们没有举措保留零分之一,但能够保留空值。固然它是空值,是不决义,是未知,可它也切实其实是一个正当的信息。

运算黑洞:关于NULL,一样平常的运算城市前往NULL。好比加减乘除,这几乎就是一个黑洞一样。永久不会有甚么数据即是NULL。固然,1不即是NULL,2也一样。但是,NULL也不即是NULL。说一个NULL即是NULL是毛病的。以是我们只能对照它“是”或“不是”。为了不凌乱,SQL-3尺度有一些商定。好比表达式x=NULL,了局应该是UNKOWN。而表达式“xisNULL”,就得看情形,假如x是NULL或False,就前往Ture(?);x长短NULL,前往False。有点奇异是否是,它基于NULL不即是NULL。这个划定规矩切实其实为SQL尺度所撑持,碰到如许的数据库体系,可不要感应惊奇。

三值逻辑:《鹿鼎记》中的韦小宝,整人的法门之一就是“我问你话,是就摇头,不是就点头,不准你作声!”切实其实,一般我们的逻辑概念,老是基于这类二值逻辑系统,对就是对,错就是错。可在干系实际中,没有这么复杂。有一种没有相对长短的情形存在:NULL。这就是干系实际的三值逻辑。

另有一些罕见的与NULL相干的情形。好比,统计函数(也有的文档称之为会萃函数、集函数)一般会疏忽NULL。不外,假定有如许一个表T:

C

-----

1

2

NULL

NULL

我们分离实行两个查询:SELECTCOUNT(*)FROMT和SELECTCOUNT(C)FROMT,猜猜会有甚么分歧?后来,我觉得两个了局应该一样。了局,前一个是4,后一个是2。前一个即是4,明显基于NULL也是数据这个现实;尔后一个了局为2,是因为统计C列时,COUNT疏忽了NULL。

SQL-3尺度中,搜刮前提(WHERE和HAVING)只承受TRUE,而束缚却只回绝FALSE,两者对NULL的承受立场相反。以是我们后面见到的ROOMS表才能够把空值写进职员字段。而在排序时,却又没甚么纪律。SQL尺度只作出了一个增补界说,以是每一个DBMS的处置ORDERBY的办法其实不不异,固然NULL不是高于一切值就是低于一切值。

在《SQL-3参考年夜全》中先容了更具体的关于NULL的内容。别的,书中还先容了两位数据库专家C.J.Date和E.f.Codd关于NULL的分歧论点(E.F.Codd乃至但愿有四值逻辑)有乐趣的伴侣能够找来一读。在理论中,我们还会碰到一些风趣的事,出格是连接查询中,NULL让我们的人生变得“丰厚多彩”。

因为各种缘故原由,近几天我大概会加快写作速率,但这其实不代表我会保持。在休整和充电以后,我会回到我所善于的实战范畴。再次感激每位体贴《SQLStory》的读者。
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT
若相依 该用户已被删除
沙发
发表于 2015-1-18 18:09:45 | 只看该作者
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
分手快乐 该用户已被删除
板凳
发表于 2015-1-22 20:22:00 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
蒙在股里 该用户已被删除
地板
发表于 2015-1-31 11:31:32 | 只看该作者
呵呵,这就是偶想说的
小女巫 该用户已被删除
5#
发表于 2015-2-6 19:16:43 | 只看该作者
习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。
再见西城 该用户已被删除
6#
发表于 2015-2-18 09:06:18 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-6 04:05:17 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-12 20:37:45 | 只看该作者
我个人认为就是孜孜不懈的学习
飘灵儿 该用户已被删除
9#
发表于 2015-3-20 02:35:58 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2025-3-13 03:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表