问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何正确理解 SQL 中的 NULL

发布网友 发布时间:2022-04-08 04:12

我来回答

2个回答

懂视网 时间:2022-04-08 08:34

  for i in 1..9999 loop

    insert into n1 values(i,‘name‘||i);

    if mod(i,100)=0then

      commit;

    end if;

  end loop;

  insert into n1(sid)values(10000);

  commit;

end;

查询sname列值走的是索引范围扫描

SQL> explain plan for select * from n1 where sname = 'name1';
Explained.

SQL> select * from table(dbms_xplan.display);
Plan hash value: 3644017351
--------------------------------------------------------------------------------
| Id | Operation	 | Name 	| Rows	| Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |		| 1 | 75 | 2 (0)| 00:00:01
|
|* 1 | INDEX RANGE SCAN| N1_SNAME_IND | 1 | 75 | 2 (0)| 00:00:01
|
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - access("SNAME"='name1')
Note
-----
 - dynamic sampling used for this statement (level=2)


is null方式查询,虽然sname中为null的记录1W行中只有一行,但还是没有走索引,也就是说is null不走索引。

SQL> explain plan for select * from n1 where sname is null;
Explained.

SQL> select * from table(dbms_xplan.display);
Plan hash value: 2416923229
--------------------------------------------------------------------------
| Id | Operation	 | Name | Rows | Bytes | Cost (%CPU)| Time	 |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT |	 | 1 | 75 | 9 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| N1	 | 1 | 75 | 9 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - filter("SNAME" IS NULL)
Note
-----
 - dynamic sampling used for this statement (level=2)
17 rows selected.


如果实际情况确实需要is null查询走索引呢?可通过创建联合索引的方式来实现。

drop index n1_sname ;

create index n1_sname_ind on n1(sname,sid);

 

SQL> explain plan for select * from n1 where  sid is not null and sname is null ;

SQL> select * from table(dbms_xplan.display);
Plan hash value: 3644017351
-------------------------------------------------------------------------------
| Id | Operation	 | Name 	| Rows	| Bytes | Cost (%CPU)| Time
|
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |		| 1 | 75 | 3 (0)| 00:00:01
|
|* 1 | INDEX RANGE SCAN| N1_SNAME_IND | 1 | 75 | 3 (0)| 00:00:01
|
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 1 - access("SNAME" IS NULL)
 filter("SID" IS NOT NULL)
Note
-----
 - dynamic sampling used for this statement (level=2)

18 rows selected.

可以看到创建联合索引后,SQL查询所耗费的资源明显降低。

需要注意的是我们查询最频繁最经常使用列,比如sname要放在联合索引的第一列;同时要走联合索引,需要where后面的条件出现联合索引包含的所有的字段,这也是为什么加了sid这个字段的原因。




 

版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL中的null

标签:

热心网友 时间:2022-04-08 05:42

SQL中Null的中文叫法是“空值”,其意思为"没有值"的值,它的数据类型是未知的,在数据库表里Null不占用物理磁盘空间,因为Null就是空无一物嘛,没有东西自然就没有占用。数据库表实际是二维表,新建表时所有的字段值都是Null(空值),同样添加新纪录时未指定字段值前每个字段值也是Null,每个网格由横向(字段名)和纵向记录行确定,当一个网格没有写入数据前其存储的值就是Null(空值),这是天然属性使然,写入数据后其值就变为非"空值",如果我们再将该网格里的数据值擦除掉它又会变为“空值”。筛选含“空值”的记录可以使用"expr is null",反之可以使用“expr is not” 。

说到Null不得不提到"零长度字符串"或者说"空字符串"(Sql中用一对没有间隔单引号''表示),对于这两者很多人会搞混淆。其实它们有根本上的区别,前者的数据类型是未知的,而后者的数据类型则是明确的即字符型,存储“空字符串”是要占用物理磁盘空间的。在不存在约束的情况下我们几乎可以将Null值写入任何数据类型的字段里(请注意写入Null值其背后的含义是擦除对应数据表网格中的数据值),而空字符串''只能写入字符串型字段里。还有Null值可以是“天然”就存在的,而空字符串则不会“天然”存在,它必须人为或以默认值形式写入数据表才会出现。

Null在Sql语言中是一个很重要的概念,只有正确理解它才能把握好这门语言。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求电脑玩安卓游戏的方法。步骤。以及所有的文件~谢谢 。有的联系我~ 我在电脑管家软件管理下的鹰击长空2都是解压包 澳洲留学读研申请攻略 澳洲留学申请时间是什么时候 去澳大利亚上大学需要什么手续 澳洲留学申请流程时间如何? 中南财经政法大学保险精算专业介绍 黄福记小吃梅干菜扣肉饼怎么样 如何开一家梅干菜扣肉饼店,成本要多少 在照明行业LED配光曲线图怎么看 什么是不适法的无因管理? 去看牙医,医生要给我做根管治疗,请问病历上写的都是什么意思,如果是跟管治疗,下一步是什么? 这算抑郁症吗? 软木塞如何打开 做了肾穿刺多久才能蹲着上厕所 孕妇能吃海鲜和鱼肉吗 孕妇不能吃哪些鱼 什么叫病历主诉用词啊 谢谢 孕妇能吃火锅鱼吗 余无不适是什么意思?' 边鱼和什么不能一起吃 孕妇能不能吃鲩鱼 主诉的主诉定义的修改 红薯可以与边鱼一起吃吗 如无不适啥意思 无所不适是什么意思? 吃梭边鱼的禁忌人群有哪些? 请问,中式婚礼策划找哪家公司好? 怎么找到一家好的婚礼策划公司? 孕妇能吃梭边鱼吗 拜合提亚尔 功夫茶具,请帮忙推荐。。我是新手。。 元本道汝窑的思想 读书不能产生财富,为什么我们还是要去读书? 古力娜扎 迪丽热巴,古力娜扎,全名叫什么 古力娜扎的资料 怎样联系酷狗繁星客服? 怎么联系繁星酷狗直播间客服 买平板电脑主要看什么配置? 沈阳药科大学成人自考本科什么时候报名 辽宁省自考办的联系方式是什么 平板电脑怎么看配置 葫芦岛自考都在哪里报名啊?有没有电话?是不是在自考办报名? 酷狗繁星兑换密码忘记了怎么办,又怎么找客服呢? 河池金城江机场的建设过程 怎样挽留女朋友的话语 报名自考上面显示等待报名点确认什么意思 酷狗繁星解封步骤? 如何挽留女朋友?