SQL空和NULL的区别

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战 A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义. 阅读详情

1.NULL意思为缺失的值(missing value).

2.三值逻辑(three-valued-logic: TRUE,FALSE,UNKNOWN). 在SQL中有三个逻辑谓词:TURE,FALSE,UNKNOWN.在大多数的编程语言中只有TRUE和FALSE,而在SQL中独有UNKNOWN,之所有存在与NULL有关.

  比如做如下比较: NULL>32;NULL=NULL;X+NULL>Y;NULL<>NULL.其计算结果均为UNKNOWN.

  可能会有些迷惑,于二值逻辑不同(NOT TURE=FALUSE;NOT FALSE=TRUE)的是NOT UNKNOWN=UNKNOWN.

3.UNKNOWN作为FALSE时的处理. 在SQL中查询过滤时(ON,WHERE,HAVING)会把UNKNOWN作为FALSE处理,这样就不会把计算值为UNKNOWN的行添加到下一个结果集中.

4.UNKNOWN作为TRUE时的处理. 在CHECK约束中UNKNOWN却作为TRUE来处理.

5.再谈NULL与NULL的比较,上面已经讲过(NULL=NULL;NULL<>NULL),即NULL与NULL的比较均为UNKNOWN. 但是对于UNIOUE约束,集合操作(如UNION,EXCEPT),排序,分组时,NULL与NULL为认为是等值的.

 

 

关于SQL Server的Null值的比较运算的。一般情况下我们查询空值或者非空值的时候,用的是is null/is not null,而很少用=/<>。但是在我的这个程序中,没有用is这样的关键字,而是用=/<>这样的比较元算符号,这就碰到了一些问题。
问题起源于一个Web查询页面,因为问题比较复杂的,所以简化一下来说明。
在页面上用户可以自由选择数据表的某些字段,填写该字段的查询条件,先是选择比较运算符号(=,<>等),然后填写值。提交之后,就需要创建一个SQL语句,查询条件的各部分由不同的程序模块创建。这里涉及两个程序模块,一个模块根据提交创建比较运算符号,一个模块负责创建比较值模块。在创建值模块中有这样一个规则,“如果提交的值是空的,把该值设为Null”。
但是我发现,如果比价值为Null的时候,同样一个SQL查询语句放在存储过程里边查询和通过应用程序直接查询的结果是不一样的。
查了查SQL Server文档,发现Null值的比较运算,存在两种规则:
在SQL2000中Null值的比较运算有两种规则。一种是ANSI SQL(SQL-92)规定的Null值的比较取值结果都为False,既Null=Null取值也是False。另一种不准循ANSI SQL标准,即Null=Null为True。
以一张表T的查询为例。

表T存在下面的数据:
RowId Data
--------------
1 'test'
2 Null
3 'test1'

按照ANSI SQL标准,下面的两个查询都不返回任何行:
Query1: select * from T where Data=null
Query2: select * from T where Data<>null
而按照非ANSI SQL标准,查询1将返回第二行,查询2返回1、3行。
ANSI SQL标准中取得Null值的行需要用下面的查询:
select * from T where Data is null
反之则用is not null。由此可见非ANSI SQL标准中Data=Null等同于Data Is Null,Data<>Null等同于Data Is Not Null。

而控制采用那一种规则,需要使用命令SET ANSI_NULLS [ON/OFF]。ON值采用ANSI SQL标准,OFF值采用非标准模式。另外SET ANSI_DEFAULTS [ON/OFF]命令也可以实现标准的切换,只是这个命令控制的是一组符合SQL-92标准的设置,其中就包括Null值的标准。

默认情况下,数据库管理程序(DB-Library)是SET ANSI_NULLS为OFF的。但是我们的大多数应用程序,都是通过ODBC或者OLEDB来访问数据库的,作为一种开放兼容的数据库访问程序,或许是兼容性的考虑,SET ANSI_NULLS值设置为ON。这样一来带来的一些问题是需要注意的。像存储过程或者自定义函数这样的应用程序都是基于DB-Library的,默认情况下,SET ANSI_NULLS为OFF,并且在这样的程序中,不能使用SET ANSI_NULLS在一个环境中修改规则,只能修改数据库配置参数。

考虑下面这种情况。
你的应用程序使用ADODB来访问数据库,采用OleDb或者ODBC数据提供程序。对于前面的查询1:
select * from T where Data=null
你可以直接发送命令取得结果集,也可以把它放到存储过程当中。但是他们的查询结果是不一样的。如果直接使用查询命令,什么结果也没有,而如果访问存储过程,你获得第2行的数据。

我写了一个.Net程序来验证这一点。同时也为了验证.Net SqlClient的SET ANSI_NULLS的设置,由于SqlClient不是通过OleDb或者ODBC这些数据提供程序来访问SQL Server,而是直接对SQL Server进行访问,本来我以为它会采用SQL Server默认的设置,但是结果恰恰相反,它的默认设置和OleDb、ODBC一样。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;
public class AnsiNullsTest{
public static void Main(String[] args){
IDbConnection conn;
String connType = "SqlClient";
if(args.Length>0)connType = args[0];
if(connType.ToUpper()=="OLEDB"){
Console.WriteLine("Connection Type:OLEDB");
conn = new OleDbConnection("Provider=SQLOLEDB.1;User ID=sa;PWD=test;Initial Catalog=TEST;Data Source=TEST");
}else if(connType.ToUpper()=="ODBC"){
Console.WriteLine("Connection Type:ODBC");
conn = new OdbcConnection("Driver={SQL Server};UID=sa;PWD=test;Database=TEST;Server=TEST");
}else{
Console.WriteLine("Connection Type:SQLClient");
conn = new SqlConnection("Server=TEST;Database=TEST;User ID=sa;PWD=test");
}
Test(conn);
}
public static void Test(IDbConnection conn){
String query1 = "select 'Test' where null=null";
String query2 = "exec p_Test"; //存储过程中是一样的SQL语句
IDbCommand cmd;
IDataReader reader;
Console.WriteLine("print 'Test' set ansi_nulls off");
try{
cmd = conn.CreateCommand();
conn.Open();
cmd.CommandText = query1;
reader = cmd.ExecuteReader();
Console.WriteLine("command:" + query1);
while(reader.Read()){
Console.WriteLine("result:" + reader[0].ToString());
}
reader.Close();
cmd.CommandText = query2;
reader = cmd.ExecuteReader();
Console.WriteLine("command:" + query2);
while(reader.Read()){
Console.WriteLine("result:" + reader[0].ToString());
}
reader.Close();
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
finally{
conn.Close();
}

}
}

它有一个参数,根据参数采用不同的参数值采用不同的数据库访问程序。命令对象作了两次查询,一次是SQL查询命令,一次是调用存储过程。语句都是一样,但是结果不一样。

来源:(http://blog.sina.com.cn/s/blog_6006eaea0100dbw9.html) - SQL空和NULL的区别_己未羊_新浪博客

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph... 阅读详情

相关推荐

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二)

1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。

qq_43279097的博客 1920

sqlnull空值区别

【代码】sqlnull空值区别

学亮编程手记 1610

ThingsBoard实战指南:RPC命令下发与设备交互详解

本文深入解析了ThingsBoard平台中RPC命令下发的核心机制与实战应用。通过对比客户端与服务端RPC模式,详细阐述了从仪表盘控件配置到设备端Python代码响应的完整双向交互流程,并提供了常见问题排查与进阶优化技巧,帮助开发者构建可靠、实时的物联网设备控制系统。

weixin_29168153的博客 175

SQL Server Null的比较运算

前几天写一个数据库查询程序,碰到的一个问题,是关于SQL ServerNull值的比较运算的。一般情况下我们查询空值或者非空值的时候,用的是is null/is not null,而很少用=/这样的比较元算符号,这就碰到了一些问题。问题起源于一个Web查询页面,因为问题比较复杂的,所以简化一下来说明。在页面上用户可以自由选择数据表的某些字段,填写该字段的查询条件,先是选择比较运算符号(=,但是我

The Time With Working 6713

MySQLNULL空值区别

02 NULL空值 NULL也就是在字段中存储NULL值,空值也就是字段中存储字符('')。 1、占用区别 mysql> select length(NULL), length(''), length('1'); +--------------+------------+-------------+ | length(NULL) | length('') | length('...

星夜小筑的专栏 799

sqlnull

sql空值null

PhilsphyPrgram的博客 719

(MySQL、Oracle)数据库,表中值为null的字段不能参与等于运算

案例 查出所有未删除的用户,下图的sql查不出deletded为null的字段(按道理null <> '1’是true,但实际不是,这是个坑): 建议使用NVL函数解决: 使用 NVL(deletded,0) 进行转换,如果deletded 为空值,就使用0赋值使用,如果是有值,使用字段deletded本身值。 正确的sql: ...

y2020520的博客 1581

sql里的null区别

null表示为未知,未定义; 表示为白,或者0; sql查询,排序时null在‘’的前面; 定义字段为not null,写为可以写入; null不可以用来比较,只能用is null判断; 转载于:https://www.cnblogs.com/zuopy/p/7718405.html...

dengzhan8320的专栏 602

Django与SQL语言中——NULL字符串的区别

SQL有指定空值的独特方式,它把空值叫做NULLNull数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中,NULL的值不同于字符串,就像Python中None不同于字符串("")一样。这意味着某个字符型字段(如VARCHAR)的值不可能同时包含NULL字符串。 这会引起不必要的歧义或...

weixin_30653023的博客 211

搜索mysql表内字段字符串_【SQL】表中的字符串与NULL中的区别何在

展开全部对于SQL的新手,NULL值的概念常常会造成混淆,常认为NULL是与字符串''相同的事。情况并非如此。例如,下636f70793231313335323631343130323136353331333337623533述语句是完全不同的:mysql>INSERTINTOmy_table(phone)VALUES(NULL);mysql>INSERTINTOm...

weixin_29839415的博客 301

sqlnull字符串、0的区别

sqlnull字符串、0的区别

zhaizhai的博客 1万+

Sql 语句字符串NUll值的区别及使用技巧

文章目录Oracle 数据库创建表表插入操作表查询操作NULL 值总结MySQL 数据库创建表表插入操作表查询操作 在上节总结 Oracle语句判断字符串是否为数字及translate函数解析 一章中有对 NULL 值的使用,当时更换为空值进行判断,但是效果不一样。对此查询相关文档对字符串 NULL 值的区别进行记录。 Oracle 数据库 创建表 新建一张测试表,用于后续的 Sql 操作校验...

Herishwater的博客 5467

还不知道SQLNULL字符串到底有什么区别

场景 在系统中添加用户时前后端数据库都没有做数据有效性的校验,导致添加用户时,输入的工号为字符串也能添加到用户表中。如下图所示: 查看user表结构: sno属性NOT NULL,但是在插入时插入的是’'字符串,导致能够插入成功 隐患 设计数据库时这样的操作会导致严重的安全问题,前后端在编写代码时也都需要对数据有效性进行校验,避免系统中出现奇怪的数据。 在本例中,系统的默认密码也是sno,导致如下问题发生: 即:用户名密码都为的用户能够成功登录系统 总结 NULL ‘’ 并不相等 ..

lijiext 1114

mysql语句空值字段相等_Sql 语句字符串NUll值的区别及使用技巧

Oracle 数据库创建表表插入操作表查询操作NULL 值总结MySQL 数据库创建表表插入操作表查询操作在上节总结 Oracle语句判断字符串是否为数字及translate函数解析 一章中有对 NULL 值的使用,当时更换为空值进行判断,但是效果不一样。对此查询相关文档对字符串 NULL 值的区别进行记录。Oracle 数据库创建表新建一张测试表,用于后续的 Sql 操作校验。表插入操作当设...

weixin_35080040的博客 1154

sql中 双引号 is null区别

select * from sc where grad is null grad是null, select * from sc where grad = "" grad是""字符串 你要理解NULL与""的区别. Null 是没有的意思 不占用内存间 ""是的字符串 它是一个字符串,不过里面没有内容 sql中的等于不等于, '=' ,'!=','<>','is null'.... 不等于:<> ,!=,~= ,^= 这四个符号据说都可以在oracle中表...

qq_18072961的博客 458

SQL判断不等于的5种方法判断非的11种方法

做牛客练习题的时候遇到的

makarov5的博客 1万+

SQL中的空值NULL值:核心差异、判断方法及数据库实现对比

一、空值NULL的本质区别SQL中,空值(Empty Value)NULL值的差异体现在语义、存储及处理逻辑上,具体如下:语义定义空值:表示字段被显式赋值为“无内容”,如字符串''、数字0等。它是一个具体的值,但内容为。例如,用户填写表单时未输入姓氏,可能存储为''。NULL:表示数据未知、不存在或未定义,是一个...

qq_35485206的博客 1744

sql语句中null字符的区别

null字符的区别: 1、NULL:代表声明了一个对象,而不仅仅是一个字符串,值可以赋给任何对象。 字符:代表声明了一个对象实例,这个对象实例的值是一个长度为0的字符串。 2、String s=null; 只是定义了一个句柄,即你有了个引用,但是这个引用未指向任何内存间。 String s=”“; 这个引用已经指向了一块是字符串的内存间,是一个实际的东东了,所以可以对它操作。 总结:null是一个对象,而字符串是一个对象实例。 ...

学习小玩家的博客 3001

SQL Server中的NULL值处理:判断与解决方案

其实可以用一种常识来解释,比如你编写一本字典,但是呢,你这个字典就只有一个或者几个值,换句话说就是数据量很小,当你查字典的时候,直接翻字典,第一页就是,比你再去查什么拼音,偏旁啥的来得快,这就是因为sqlserver数据库引擎通过判断,扫描全表的效率表走索引块,但是对于nulll列是否会走索引,一直都有分歧,这个我们就不多做赘述,还是回到正题。本文将介绍SQL Server中判断处理NULL值的不同方法,以及一些解决方案,帮助您更好地处理数据库中的NULL值情况。这可能增加代码的复杂性维护成本。

2301_78834737的博客 6320

MySQL中处理空值时要小心两个个陷阱

【IT168 专稿】MySQL数据库是一个基于结构化数据的开源数据库SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱。   陷阱一:空值不一定为   空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个...

weixin_30301449的博客 5731

SQL ServerNULL的比较问题

SQL ServerNull值并不是一个值,而是表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此任何与Null值进行比对的二元操作符结果一定为Null,包括Null值本身。而在SQL Server中,Null值的含义转换为Bool类型的结果为False Select ‘有值’ Where 3 not in (1,2,NULL) 以上语句执行后未得到预想的值

那片田,那片天~~ 4603

基于YOLOv8的细胞检测计数系统源码(部署教程+训练好的模型+各项评估指标曲线).zip

基于YOLOv8的细胞检测计数系统源码(部署教程+训练好的模型+各项评估指标曲线).zip平均准确率:0.98类别:RBC、WBC、platelets【资源介绍】1、ultralytics-mainultralytics-main为YOLOv8源代码,里面涵盖基于yolov8分类、目标检测额、姿态估计、图像分割四部分代码,我们使用的是detect部分,也就是目标检测代码2、搭建环境安装anaconda pycharm windows系统、mac系统、Linux系统都适配在anaconda中新建一个新的envs虚拟间(可以参考博客来),命令窗口执行:conda create -n YOLOv8 python==3.8创建完YOLOv8-GUI虚拟间后,命令窗口执行:source activate YOLOv8 激活虚拟间然后就在YOLOv8虚拟间内安装requirements.txt中的所有安装包,命令窗口执行:pip install -r requirements.txt使用清华源安装更快3、训练模型过程进入到\ultralytics-main\ultralytics\yolo\v8\detect\文件夹下,datasets即为我们需要准备好的数据集,训练其他模型同理。data文件夹下的bicycle.yaml文件为数据集配置文件,该文件为本人训练自行车检测模型时创建,训练其他模型,可自行创建。博文有介绍https://blog.csdn.net/DeepLearning_?spm=1011.2415.3001.5343train.py中238行,修改为data = cfg.data or './bicycle.yaml' # or yolo.ClassificationDataset("mnist")237行修改自己使用的预训练模型若自己有显卡,修改239行,如我有四张显卡,即改成args = dict(model=model, data=data, device=”0,1,2,3“)以上配置完成后运行train.py开始训练模型,训练完毕后会在runs/detect/文件夹下生成train*文件夹,里面包含模型评估指标等4、推理测试训练好模型,打开predict.py,修改87行,model = cfg.model or 'yolov8n.pt',把yolov8n.pt换成我们刚才训练完生成的模型路径(在\ultralytics-main\ultralytics\yolo\v8\detect\runs\detect文件夹下),待测试的图片或者视频存放于ultralytics\ultralytics\assets文件夹,运行predict.py即可,检测结果会在runs/detect/train文件夹下生成。

Springboot+vue学生管理系统源码

Springboot+vue学生管理系统源码idea导入后端项目,设置好依赖,运行SystemApplication.java使用vscode或者hbuilderx等工具打开前端项目,运行即可另外前端vue页打包成静态资源放到后端里面了,即便不运行前端vue项目也是可以的如果需要修改,则使用npm run bulid重新打包,生成的前端代码,放到后端代码的resources的static目录下

上一篇: DBCC SQLPERF 参数总结
下一篇: SQL Server分布式事务配置(MSDTC)(远程数据库更新)
ynigeng
博客等级 码龄20年 19粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值