仓酷云
标题:
SQL数据范例与三值逻辑
[打印本页]
作者:
精灵巫婆
时间:
2015-1-16 14:18
标题:
SQL数据范例与三值逻辑
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT
7.数据范例
在数据库实际中,干系模子和数据范例这两部份内容是正交的(参看《程序员修炼之道》第8节关于“正交性”的会商),互不依附。换言之,干系模子其实不体贴每一个表的字段的数据范例是甚么,是整数、字符串等基础范例也好,是组合范例、类等自界说范例也好,干系模子只需求每一个字段是原子的。
在数据库实际中,数据范例又被称为域,但域是更加严厉的界说。好比一个班级的先生个数和先生均匀分大概都是int范例,但这是两个分歧的域,“先生个数*先生均匀分=先生总分”,但“先生个数+先生均匀分”是没成心义的。今朝的支流DBMS仿佛还没有对域有很好的撑持,但将来的情形大概会有所改动,并且,计划自界说范例也必要对这一成绩有充实的熟悉。详见《深度探究干系数据库》第2章。
关于数据库和SQL的使用来讲,除把握干系模子的道理,还必要对DBMS撑持的数据范例及其转换划定规矩有所熟悉。
1.基础数据范例
一个DBMS一般城市撑持以下几类基础数据范例(以SQLServer为例):
-准确数字:整数(bigint/int/smallint/tinyint/bit),定点小数(decimal),泉币(money/smallmoney)
-近似数字:浮点数(float)
-日期和工夫:datetime/smalldatetime;date,time,datetime2,datetimeoffset(后4种为SQLServer2008的新增范例)
-字符串和Unicode字符串:varchar/nvarchar,char/nchar(text/ntext已不再倡议利用,用varchar(max)/nvarchar(max)取代)
-二进制串(即字撙节):varbinary,binary(image已不再倡议利用,用varbinary(max)取代)
-其他数据范例:具有特别功效的范例(sql_variant,timestamp,uniqueidentifier,xml),不克不及用于表的特别范例(cursor,table)
2.关于数据范例必要注重的成绩
a.两类特别的数据范例
-日期和工夫范例的数据存储体例和可用值局限、相干的盘算、对照、显现(转换为指定格局的字符串)都对照庞大,还触及一组日期工夫函数。参看datetime范例剖析一帖。
-字符串范例触及到字符编码和排序划定规矩,对照操纵还包括LIKE婚配(将来还大概会撑持正则表达式婚配),十分必要注重。参看了解字符编码和SQLServer中文处置二帖。
b.假如对分歧排序划定规矩的两个字符串举行盘算或对照,将会依据排序划定规矩优先按次来决意盘算了局的排序划定规矩或对照的办法。
c.假如对分歧范例的两个值举行盘算或对照,将会依据数据范例优先级举行隐式转换。数据范例优先级基础划定规矩以下:
-年夜>小(>指优先级高于,下同):如bigint>int>smallint>tinyint>bit,varchar(20)>varchar(10),datetime>smalldatetime,等等。
-可变>流动:如float>decimal,varchar>char,nvarchar>nchar,varbinary>binary。
-各种型年夜类的优先级:datetime>float>decimal>integer>unicodestring>ansistring>binary。
-特别数据范例的优先级和转换划定规矩必要特别思索,详见联机丛书。
d.假如对分歧巨细的两个值举行盘算,将会依据精度、小数位数和长度的划定规矩来发生新的范例巨细。
e.常量的数据范例(能够经由过程SELECTcol=常量值INTOtestdt然后检察testdt表col字段的数据范例来察看)
-假如不显式指定和隐式转换,NULL会按int范例处置。
-,N,1,0x01,1.0,1E0,$1分离对应varchar,nvarchar,int,varbinary,decimal,float,money范例,而且长度是存储响应值所必要的最小长度。
f.在软件开辟范畴尽人皆知:“隐式转换是bug的源泉”。因而,有两个倡议:
-利用常量时,最好利用对应范例的常量。好比,假如table.col是varchar范例,那末WHEREtable.col=10的查询将不克不及利用索引,并且当碰到col中寄存有不克不及转换为数字的值时将堕落。
-除非响应值的隐式转换十分直不雅,不然宁肯用CAST()/CONVERT()指定明白的显式转换。
以上内容中,加下划线的粗体是联机丛书的题目。具体剖析参看《MicrosoftSQLServer2005手艺内情:T-SQL程序计划》第1章。
8.NULL与三值逻辑
三值逻辑(3VL,Three-valuedLogic)相对是SQL修炼中的一个紧急关卡,值得出格注重,闭关静修。待打破这一关卡以后,SQL中的NULL与NOTNULL将别无二致。
关于SQL是不是应当同意NULL,在数据库范畴已近乎一个信奉式的争辩。E.F.Codd以为NULL有存在的需要,但他的密友C.J.Date以为NULL完整能够作废。终极了局是,SQL尺度撑持NULL。
实际上的争辩且不论。但在理论中,必定要晓得NULL的三值逻辑会带来良多困扰的成绩。
a.不利用NULL的来由:
-NULL会引进庞大的三值逻辑。
-NULL在查询前提、外键和CHECK束缚、独一束缚、GROUPBY、ORDERBY中的举动都是纷歧致的。
b.利用NULL的来由:
-当必要暗示一个未知的、不断定的值时,用NULL更天然。好比一个如今人员工的去职工夫、顶级员工(BOSS)的下级员工,等等。
-外连接一般会引进NULL,即便一切表的字段都界说为NOTNULL。
起首,假如大概,只管让一切字段都声明为NOTNULL。除非是更合适利用NULL的场所(从营业动身)。
其次,在利用NULL时,必定要弄分明三值逻辑和数据库引擎对NULL的处置:
(SQLServer有一个选项SETANSI_DEFAULTS,默许为ON,即与SQL尺度分歧。设为OFF的效果详见联机丛书。)
1.NULL与其余值举行+-*/等盘算操纵(包含在年夜多半函数中利用NULL)后,了局是NULL(标量表达式)。NULL与其余值举行=、>、<等对照操纵后,了局是Unknown(断言)。
Unknown相干的逻辑运算:
[code=sql]
NOTUnknown-->Unknown
UnknownAND/ORUnknown-->Unknown
UnknownORTRUE-->TRUE
UnknownANDTRUE-->Unknown
UnknownORFALSE-->Unknown
UnknownANDFALSE-->FALSE
详细可查三值逻辑的真值表。
2.在where/on/having和if/casewhen中,只要True才使前提建立(即Unknown看成False来处置)。好比:
wherecolumn=value:表中column为NULL的行永久不会前往,即便value是NULL;
casevaluewhenNULLthenXXXwhen...end:XXX永久不会实行,即便value是NULL;
if<Unknown>XXXelseYYYend或casewhen<Unknown>thenXXXelseYYYend:这两种情形下,YYY会实行。
3.包括外键束缚和Check束缚的字段同意NULL(即束缚只当前提为False时堕落,Unknown是不论的)。
4.包括独一束缚(uniqueindex)的字段只同意一个NULL的行,再拔出或更新该字段为NULL的行会报字段反复的毛病。
5.GROUPBY时,一切NULL被视为一组。
6.ORDERBY时,一切NULL排在一同,但NULL排在非空值的后面(如SQLServer)仍是前面(如Oracle),SQL尺度未划定。
7.会萃函数(SUM/AVG/MAX/MIN/COUNT)疏忽NULL的行。
8.declare的变量,在未赋值之前为NULL。
9.与NULL处置相干的运算符和函数:
-ISNULL/ISNOTNULL:用这两个运算符来判别一个值是不是为NULL,而不是=或。
-ISNULL/COALESCE:取第一个非空值(注重两个函数的数据范例转换划定规矩分歧)。
-NULLIF(a,b):等价于CASEWHENa=bTHENNULLELSEaEND。因此我们看到,这些信息足够让我们对单个操作实现“逆操作”。
作者:
兰色精灵
时间:
2015-1-18 12:48
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
作者:
金色的骷髅
时间:
2015-1-25 22:16
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
作者:
不帅
时间:
2015-2-4 09:25
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
作者:
老尸
时间:
2015-2-9 21:26
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
作者:
透明
时间:
2015-2-27 22:21
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
作者:
再现理想
时间:
2015-3-9 16:20
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
作者:
再见西城
时间:
2015-3-17 01:07
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者:
简单生活
时间:
2015-3-23 11:46
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2