仓酷云

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

[学习教程] MYSQL网页编程之MySQL中处置空值时要当心两个圈套

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

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

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

x
MySQL已经为支持所有最流行的Web2.0语言做好了准备,诸如Ruby、Ajax等,当然还有PHP。有的业界分析师说过,“每一个Web2.0公司实质上就是一个数据库公司。  MySQL数据库是一个基于布局化数据的开源数据库。SQL语句是MySQL数据库中中心言语。不外在MySQL数据库中实行SQL语句,必要当心两个圈套。
  圈套一:空值纷歧定为空
  空值是一个对照特别的字段。在MySQL数据库中,在分歧的情况下,空值常常代表分歧的寄义。这是MySQL数据库的一种特征。如在一般的字段中(字符型的数据),空值就是暗示空值。可是假如将一个空值的数据拔出到TimesTamp范例的字段中,空值就纷歧定为空。此时为呈现甚么情形呢(以下图)?
  

  我先创立了一个表。在这个表中有两个字段:User_id(其数据范例是int)、Date(其数据范例是TimesTamp)。如今往这个表中拔出一笔记录,个中往Date字段中拔出的是一个NULL空值。但是当我们查询时,其了局显现的倒是拔出纪录确当前工夫。这是怎样一回事呢?实在这就是在MySQL数据库中实行SQL语句时常常会碰到的一个圈套:空值纷歧定为空。在操纵时,明显拔出的是一个空值的数据,可是最初查询失掉的却不是一个空值。
  在MySQL数据库中,NULL关于一些特别范例的列来讲,其代表了一种特别的寄义,而不单单是一个空值。关于这些特别范例的列,列位读者次要是要记着两个。一个就是笔者下面举的TimesTamp数据范例。假如往这个数据范例的列中拔出Null值,则其代表的就是体系确当前工夫。别的一个是具有auto_increment属性的列。假如往这属性的列中拔出Null值的话,则体系会拔出一个正整数序列。而假如在其他数据范例中,如字符型数据的列中拔出Null的数据,则其拔出的就是一个空值。
  圈套二:空值纷歧定即是空字符
  在MySQL中,空值(Null)与空字符(’’)不异吗?谜底是不是定的。请人人先来看下图的演示。
  

  在统一个数据库表中,同时拔出一个Null值的数据和一个’’空字符的数据,然后使用Select语句举行查询。最初显现的了局如上图所示。明显其显现的了局是不不异的。从这个了局中就能够看出,空值不即是空字符。这就是在MySQL中实行SQL语句碰到的第二个圈套。在实践事情中,空值数据与空字符常常暗示分歧的寄义。数据库办理员能够依据实践的必要来举行选择。如关于德律风号码等字段,能够默许设置为空值(暗示基本不晓得对方的德律风号码)大概设置为空字符(暗示厥后作废了这个号码)等等。因为他们在数据库中会有分歧的体现情势,以是数据库办理员必要区分看待。笔者加倍喜好利用空值,而不是空字符。这次要是由于针对空值这个数据范例有几个对照特别的运算字符。假如某个字段是空字符,数据库中是使用字段称号来取代。相反,假如拔出的是空值,则间接显现的是NULL。这跟其他数据库的显现体例也是分歧的。
  一是ISNULL和ISNOTNULL关头字。假如要判别某个字段是不是含用空值的数据,必要利用特别的关头字。个中前者暗示这个字段为空,后者暗示这个字段为非空。在Select语句的查询前提中这两个关头字十分的有效。如必要查询一切德律风号码为空的用户(必要他们增补德律风号码信息),就能够在查询前提中到场isnotnull关头字。
  

  二是Count等统计函数,在空值上也有特别的使用。如如今必要统计用户信息表中有德律风号码的用户数目,此时就能够利用count函数、同时将德律风号码作为参数来利用。由于在统计过程当中,这个函数会主动疏忽空值的数据。此时统计出来的就是有德律风号码的用户信息。假如接纳的是空字符的数据,则这个函数会将其统计出来。以下图所示,统计方才创建的两笔记录时,体系统计的了局是1,而不是2。可见体系主动将Null值的数据疏忽失落了。
<Pstyle="TEXT-INDENT:2em">
到2009年,甲骨文的数据库Oracle已经诞生了30周年,而MySQL却连它的一半时间都没有。微软的SQLServer仅仅比MySQL大两年,但是SQLServer的发布是建立在Sybase的基础上。
金色的骷髅 该用户已被删除
沙发
发表于 2015-1-19 05:52:49 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
分手快乐 该用户已被删除
板凳
发表于 2015-1-25 10:57:42 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
透明 该用户已被删除
地板
发表于 2015-2-2 21:52:23 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
山那边是海 该用户已被删除
5#
发表于 2015-2-8 07:48:19 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
海妖 该用户已被删除
6#
发表于 2015-2-25 01:58:48 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
兰色精灵 该用户已被删除
7#
发表于 2015-3-7 15:43:18 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
因胸联盟 该用户已被删除
8#
发表于 2015-3-15 09:04:20 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-21 23:22:40 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-20 16:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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