SQL开发中容易忽视的一些小地方(一)
写此系列文章缘由: 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面:
第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也就不存在应用程序.
第二:数据库,现在是信息化世界,大多数信息都可以通过数据库存储来交换信息.常与应用程序互相交流信息.
但在SQL开发应用时,我们往往只观注些常用的方法(insert delete select update),对些小细节方面(系统存储过程,函数的应用,优化分析)研究的并不多或者是知其一不知其二,所以本人想把在学习工作当中遇到的问题总结些,希望还没有重视这些方面的朋友会有帮助,少走些弯路.
主旨:本文首先根据自己的经验整理了一下SQL中的null的用法及要注意的方面.
名词解释(英文辞典): null:无效的, 无价值的, 等于零的.
(SQL定义):SQL中, NULL 与空格, 零, 都不相同. 是指为未定义或是不可用的.
构成因素:造成某一列成为 NULL 的因素可能是:
(1),值不存在;
(2), 值未知;
(3), 列对表不可用.
它与普通的值最大的异同是:
相同点:
1:统统属于值范畴.数字1是一个值,字符串'aaa'同样是一个值,同理 null也是一个值.
2:都是合法的值,普通的数字,字符可以存在于表中字段,null也可以,而且是有意义的.
不同点:
先创建测试表:
USE [myTestDB]
GO
/****** 对象: Table [dbo].[testNull] 脚本日期: 10/11/2008 13:45:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testNull](
[ID] [int] IDENTITY(1,1) NOT NULL,
[a] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
[b] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_testNull] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
插入相关测试值:
insert into testNull
values('1','')
insert into testNull
values('2',null)
1:普通的值一般都可能进行运算符操作,例如:ID列为int,所以可以这样:ID=ID+1等,但如果一列的值为null,null+1=null,就是说null与任何运算符运算后都为null,这就是大家说的黑洞,会吃掉所有的东西.
update testNull
set b=b+1
where b is null
结论:查询后发现b的值没有变化,仍然为null.
2:普通的值可以进行"="操作,例如条件中一般都会这样出现:sUserName='张三',如果sUserName的值为null,要想找出所有名字为null的记录时,不能这样用:sUserName=null,因为null不是一个具体的值,任何值与它比较时都会返回false.此时可借用is null 或者是is not null.
示例查询:
1:select * from testNull where a=null --返回空结果集
2:select * from testNull where b is null --返回结果集 2 2 NULL
结论:说明null是不能用"="来比较,可用is null来替换
3:在用统计函数count时会不同,例如count(ID):统计记录数.当统计的记录中的包含有null值时,它会忽略null值.
示例查询:
1:select count(*),count(b) from testNull 它的返回值为2 1
2: select count(*),count(isnull(b,'')) from testNull 它的返回值为2 2
结论:对于列包含null 时,统计行数是可用count(*),或者是先把null值转换成对应的值再统计,例如count(isnull(b,''));
4:对于in 的影响不同.
示例查询: 查询testNull表中b的值包含在null中的记录.
select * from testNull
where b in(null) --没有任何记录
结论:in在查询时会忽略null的记录,查询的时候可用is not null来查询.
5:排序时顺序有不同:当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。
1:select * from testNull
1 1 ''
2 2 NULL
2:select * from testNull order by b
2 2 NULL
1 1 ''
3:select * from testNull order by b desc
1 1 ''
2 2 NULL
6:当使用GROUP BY时,所有的NULL值被认为是相等的。这时先多插入几条数据,方便查看结果.
insert into testNull
values('3',null)
values('4','4')
select * from testNull
select count(b) from testNull
group by b
返回结果:
0 1 1
结论:可见在group by 的时候,null视为等同.
7:永远不会有什么数据等于NULL。1不等于NULL,2也一样。但NULL也不等于NULL。所以我们只能比较它“是”或“不是”。
总结:SQL中提供了如此众多的存储过程,函数供我们调用,而我们又真正的理解几个呢?只有真正了解它们,才会对开发中出现的种种问题迅速找出问题所在并解决它.
注:
本文引用网络上相关资料.
SQL开发中容易忽视的一些小地方(一)的更多相关文章
- SQL开发中容易忽视的一些小地方(五)
原文:SQL开发中容易忽视的一些小地方(五) 背景: 索引分类:众所周知,索引分为聚集索引和非聚集索引. 索引优点:加速数据查询. 问题:然而我们真的清楚索引的应用吗?你写的查询语句是否能充分应用上索 ...
- SQL开发中容易忽视的一些小地方(二)
原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...
- SQL开发中容易忽视的一些小地方(六)
原文:SQL开发中容易忽视的一些小地方(六) 本文主旨:条件列上的索引对数据库delete操作的影响. 事由:今天在博客园北京俱乐部MSN群中和网友讨论了关于索引对delete的影响问题,事后感觉非常 ...
- SQL开发中容易忽视的一些小地方( 三)
原文:SQL开发中容易忽视的一些小地方( 三) 目的:这篇文章我想说说我在工作中关于in和union all 的用法. 索引定义 : 微软的SQL SERVER提供了两种索引:聚集索引(cluster ...
- SQL开发中容易忽视的一些小地方(四)
原文:SQL开发中容易忽视的一些小地方(四) 本篇我想针对网上一些对于非聚集索引使用场合的某些说法进行一些更正. 下面引用下MSDN对于非聚集索引结构的描述. 非聚集索引结构: 1:非聚集索引与聚集索 ...
- PL/SQL开发中动态SQL的使用方法
一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使 ...
- SQL Server 中关于 @@error 的一个小误区
在SQL Server中,我常常会看到有些前辈这样写: ) ROLLBACK TRANSACTION T else COMMIT TRANSACTION T 一开始,我看见别人这么写,我就想当然的以为 ...
- ASP.NET MVC 开发中遇到的两个小问题
最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了两个小问题,通过查找相关渠道解决了,在这里把这两个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助 ...
- 微信小程序开发中遇到的几个小问题
本地图片不显示,开发工具运行是没问题的,但真机调试却显示不了 item.img = '/goods/img/图片.png' <image src="{{item.img}}" ...
随机推荐
- HDU1071 The area 【积分】
The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 学习NodeJS第一天:node.js介绍
Node.JS 前辈 C 程序猿 Ryan Dahl(http://four.livejournal.com/)工程,根据 Google 著名的开源 JavaScript 发动机 V8 对于二次开发 ...
- linux 除了某个文件或某个目录以外所有删除
rm `ls | grep -v "aa"` //删除除带aa字符串的全部文件 ls | grep -v keep | xargs rm //除keep字符串的以外全删除 r ...
- Oracle安装过程物理内存检查及临时temp空间不足解决办法
物理内存 – 此先决条件将测试系统物理内存总量是否至少为 922MB (944128.0KB). 预期值 : N/A 实际值 : N/A 错误列表: – 可用物理内存 PRVF-7531 : 无法在节 ...
- LeetCode 53 Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- 发现C++Builder 2010一组类BUG
今天C++Builder 2010写小码,我们用一个集合类.您可以设置操作结果是不正确的,排除其他原因引起的,最后,它应该被设置以确定问题类的源,以下是一个集合类测试代码: enum TTes ...
- 选择排序java
先简述选择排序,然后上代码 进行选择排序就是将所有的元素扫描一遍,从中挑选(或者说是选择,这正是这个排序名字的由来)最小的一个元素,将这个最小的元素与最左边的元素交换位置 ,现在最左边的元素就是有序的 ...
- singleton pattern
1 normal mode class Singleton { private Singleton(){}; Singleton singleton; static Singleton getInst ...
- C3P0在多线程下的maxPoolSize配置
ETL工具完毕的差点儿相同了.今天遇到一个问题.就是给C3P0配置了maxPoolSize为10.目的是想让整个应用同一时候获得的最大的Connection个数为10,可是在測试应用的这一部分之后,发 ...
- 15一个NoSql数据库
随着因特网web2.0该网站的兴起.非关系型数据库,现在已经成为一个非常受欢迎的新领域.非关系数据库产品的发展非常迅速.而在处理传统的关系数据库web2.0现场.特别是大规模,高并发SNS类型web2 ...