1、查找空值

null不支持加、减、乘、除、大小比较、相等比较,否则结果只能为空。

SQL> select * from dept where 1>=null;DEPTNO DNAME          LOC
------ -------------- -------------SQL> select * from dept where 1<=null;DEPTNO DNAME          LOC
------ -------------- -------------SQL> select * from dept where 1+ null<=0;DEPTNO DNAME          LOC
------ -------------- -------------SQL> select * from dept where 1+ null>=0;DEPTNO DNAME          LOC
------ -------------- -------------SQL> select * from dept where 1* null>=0;DEPTNO DNAME          LOC
------ -------------- -------------SQL> select * from dept where deptno=null;DEPTNO DNAME          LOC
------ -------------- -------------

如果要查某个字段数据为空的记录时,应该用is null而不是=null,并且如果在子查询的查询过滤字段中存在null值而不过滤,那么整个查询结果将会返回空值,原理同上,后面会有具体实验。

2、将空值转换成实际值

nvl和coalesce相比较来说,后者更好用,看下面案例,返回多个值中第一个不为空的值:
先来组织数据:

with v as(select null as c1, null as c2, 1 as c3, null as c4, 2 as c5, null as c6from dualunion allselect null as c1, null as c2, null as c3, 3 as c4, null as c5, 2 as c6from dual)
select * from v

with v as(select null as c1, null as c2, 1 as c3, null as c4, 2 as c5, null as c6from dualunion allselect null as c1, null as c2, null as c3, 3 as c4, null as c5, 2 as c6from dual)
select coalesce(c1,c2,c3,c4,c5,c6) as c from v


可以看到,相对nvl来说,coalesce支持多个参数,能很方便的返回第一个不为空的值。如果上面的语句改用nvl,就要嵌套好多层,改写coalesce后的语句如下:

select nvl(nvl(nvl(nvl(nvl(c1,c2),c3),c4),c5),c6) as c from v

3、查询满足多个条件的行

对于见查询操作起来比较容易,对于多个条件的组合,要使用括号,这样在更改维护语句时可不再考虑优先级问题,而且可以很容易的借用各种工具找到各个组合的起止位置,比如查询:查询部门10中的所有员工、所有得到提成的员工以及部门20中工资不超过2000美元的员工。

select *from empwhere ((deptno = 10 or comm is not null) or (sal <= 2000 and deptno = 20));

4、引号常用方式

平时用sql查询来生成一个sql脚本或则插入数据时引号的常用处理案例:
a.如果是生成脚本:

select 'insert into emp(empno,ename)values(123,''' || 'aa' || ''');'from dual


可以看到,对于生成插入脚本时,如果要插入的列中带有varchar类型数据,‘insert into emp(empno,ename)values(123,‘这一段本身是一个字符串,需要前后各一个引号引起来,由于后面紧接着aa是字符类型,所以需要引号一起来,又因为引号需要另一个引号做转译,就出现了,’’’ ||和 ‘’‘);’

5、在select语句中使用条件逻辑

这里先说case when,当然还有decode等,后面再一一说。
使用案例:

       with t as (
select (case when sal<=1000 then '0000-1000'
when sal<=2000 then '1000-2000'when sal<=300 then '2000-3000'when sal<=4000 then '3000-4000'when sal<=5000 then '4000-5000'else 'high'end) as 档次,ename,sal from emp
)
select 档次,count(*) as 人数
from t
group by 档次
order by 1


或者

    select case deptnowhen 10 then'low'when 20 then'high'else'ww'end as lelfrom emp

6、限制返回的行数

再查询的时候并不需要每次都返回所有数据,比如进行抽查时候会只要求返回几条数据,我们可以通过使用伪例rownum来过滤,rownum依次对返回的每一条数据做一个标识。

如果用rownum=2来查询会发生什么?

因为rownum是依次对数据做标识,要把所有的数据都取出来才能对每条数据标记第一第二第三,然后才能取出来第二,正确的取第二行数据的查询应该是这样的:先生成序号再取第二条记录。

7、从表中随机的返回n条记录

像上面那种查数并不能做到随机返回n条记录,读者可以自己测一下多次执行上面取n条记录的查询,看查询结果就明白了。
这里我们通过使用dbms_random来对数据进行随机排序,然后取其中三行:

with t as (
select a.*,rownum as rm from emp a order by dbms_random.value()
)select * from t where rownum<=3;

多次执行上面sql看查询结果:


可以看出每次执行都是随机的三条,那这里我为什么要嵌套一层?直接这么用不就完事了:
select a.*, rownum as rm
from emp a
where rownum <= 3
order by dbms_random.value()
多次执行看查询结果:




连续三次的查询结果,我们可以看到,虽然上面三个查询结果empno 都是 7499 7521 7369 ,只是这三条记录每次所处的位置不同,这不能算是随机的取三条记录,而是三条一样的记录随机的分配不同的rownum,所以正确的写法是:先随机排序,再取数据。

8、模糊查询

主要说 escape可以 转义特殊有意义字符,看下面几个案例(从网上找了几个案例,懒得写案例了)

9、translate

先看几个案例

SQL> select translate('ab 你好 bdfsdsfs','abdfs','') as a from dual;
A
-
SQL> select translate('ab 你好 bdfsdsfs','abdfs','#') as a from dual;
A
-------# 你好
SQL> select translate('ab 你好 bdfsdsfs','1abdfs','1') as a from dual;
A
------你好

translate是按照位置进行字符替换,看第一个案例,如果被替换的字符串整体为空,那么整个查询结果也是空,第二个案例按照位置替换,字符a被替换成了#,根据这两个案例,在第三个案例中,要被替换的字符中加了个数字1,用来替换的字符列表中也只写了一个1,看查询结果看到所有的字母就全被替换了。translate用这个方法可以平时过滤一些不想要的字符。

10、nvl/nvl2/nvlliff

nvl(exp1,exp2);作用是如果表达式exp1为空则返回exp2表达式,如果exp1表达式不为空则返回exp1表达式。但nvl函数有一个前提条件是两个参数的数据类型要一样,不然会报错误。如下由于comm是数字类型,所以第二个参数不能是其它类型,不然会报错:

SQL> select nvl(comm,1) as comm from emp;COMM
----------1300500114001
SQL> select nvl(comm,'a') as comm from emp;
select nvl(comm,'a') as comm from empORA-01722: 无效数字

nvl2(exp1,exp2,exp3);这个函数需要有三个参数。它的使用是如果exp1为空则返回exp3,如果exp1不为空则返回exp2。
但有一点需要注意的是nvl2函数中exp2与exp3数据类型要一样,当exp2与exp3两个参数数据类型不一样的时候,exp3参数数据类型会转换为exp2数据类型,但前提是可以进行转换才可以,如果不能进行转换是会报错误的,看下面案例:

SQL> select nvl2(comm,1,2)as a from emp where deptno=30;A
----------1112126 rows selected
SQL> select nvl2(comm,'a',2)as a from emp where deptno=30;A
-
a
a
a
2
a
26 rows selected
SQL> select nvl2(comm,2,'a')as a from emp where deptno=30;
select nvl2(comm,2,'a')as a from emp where deptno=30ORA-01722: 无效数字

第一个案例exp2,exp3数据类型一致没问题,第二个案例中,exp2,exp3数据类型不一致,但是数字2可以转换成varchar类型’2’,所以第二个也没报错,但是第三个案例中,字符a不能转成数值类型,所以报错。

nullif(exp1,exp2);它的作用是如果exp1与exp2两个参数的值相等则返回空,如果不相等则返回exp1,同样两个参数的数据类型也要一样。

11、感兴趣的数据排在前面

假如领导对工资在1000-2000之间的员工更感兴趣,于是要求工资在这个范围的员工要排在前面以便优先查看:

当然也可以把case when放到order by中写。

12、union all与空字符串

在使用union all时候,如果上下两个结果集列数不同可以在列少的那一个数据集加null值列补充:

select empno,ename,deptno from emp
union all
select empno,ename ,null from emp

空字符串在oracle中常常相当于null,为什么不说空字符串等价于null呢,看案例:

可以看到,本身deptno是number类型的,而‘’字符串本身是varchar类型,这与null可以是任何类型不同,所以也就不等价。

13、union 去重功能导致数据出错

【大数据开发运维解决方案】Oracle Sql基础查询相关推荐

  1. 【大数据开发运维解决方案】sqoop避免输入密码自动增量job脚本介绍

    上一篇文章介绍了sqoop增量同步数据到hive,同时上一篇文章也给出了本人写的hadoop+hive+hbase+sqoop+kylin的伪分布式安装方法及使用和增量同步实现的连接,上篇文章连接:S ...

  2. 【大数据开发运维解决方案】ssh: undefined symbol: EVP_KDF_ctrl, version OPENSSL_1_1_1b问题解决过程

    文章目录 前言 一.问题描述 二.原因分析 三.解决方案 总结 前言 近期在做信创工作,运维Informatica的同事,在之前我为他做了个华为fusioninsight集群内节点与其Informat ...

  3. 【大数据开发运维解决方案】ogg(GoldenGate)三大进程常用参数

    ============================================1.管理进程 oggCI (ogg1) 22> edit params mgr PORT 7809 DYN ...

  4. 【大数据开发运维解决方案】Solr5.1+Jcseg分词器安装部署(中英文同义词、停止词配置)

    Solr5.1+Jcseg分词器安装部署(同义词.停止词) ###################################################################### ...

  5. 【大数据开发运维解决方案】超级详细的VMware16安装Redhat8挂载镜像配置本地yum源安装unixODBC教程

    文章目录 前言 一.安装配置VMware 1.虚拟网络配置 2.修改windows网卡配置 二.安装RedHat8.6 1.虚拟机安装 1.1.新建虚拟机 1.2.接下来选择 稍候安装操作系统,下一步 ...

  6. 【大数据开发运维解决方案】hadoop fs常用命令案例解释

    文章目录 前言 一.hadoop fs常用命令参数列表 二.案例展示 hadoop fs -mkdir hadoop fs -ls hadoop fs -put hadoop fs -get hado ...

  7. 阿里,B站小伙伴刚刚分享的大数据开发运维学习规划,抓紧收藏

    一.大数据运维相关答疑与概述 1.0 Class介绍 本课程是专门培养大数据运维与架构方向专业人才的体系化课程.课程所有讲师小伙伴全部是在职的知名企业大数据开发专家,大数据技术专家职位员工,非专门的培 ...

  8. 为什么数据科学家需要承担开发运维的工作?

    作者 | Caleb Kaiser 译者 | 弯月,责编 | 夕颜 头图 | CSDN下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 如果你需要创建一个生产环境下的机器学习 ...

  9. Terraform实战 | 实用云部署编程入门指南,DevOps软件开发运维必备

    Terraform是一种部署技术,任何想要通过基础设施即代码(Infrastructure as Code,IaC)方法来置备和管理基础设施的人,都可以使用这种技术.基础设施指的主要是基于云的基础设施 ...

最新文章

  1. awk取文本列_awk命令结构/内置变量/获取文本某行或某列
  2. leetcode算法题--石子游戏
  3. 天天python爬虫,你不腻的吗?
  4. 各大媒体优劣对比_信息流投放广告丨各大平台的信息流都有什么特点与弊端
  5. 神清气爽,小妹妹,先给她示范了一遍红色警戒
  6. java中calendarr_Java端获取当前时间的前12个小时
  7. XP cmd命令 部分
  8. 基佬大乱斗自建服务器,玩家必看干货基佬大乱斗怎么联机实现双人作战
  9. UML学习_2_参与者
  10. Redis Cluster集群实验
  11. 基于4G路由器的救护车联网方案:生命,刻不容缓
  12. body英语什么意思是什么_body是什么意思中文翻译
  13. 程序自我保护 c语言编程,外文翻译基于C语言的MIS程序库设计外文翻译译文(样例3)...
  14. python 求某月的天数
  15. html跳转到关注的微信公众号,手机浏览器一键跳转微信公众号关注的方法
  16. 第二阶段(day07)bootstrap
  17. rz command
  18. qlv格式转换器分流失败 原因及解决方法
  19. java国王毒酒答案,500桶48小时国王囚犯答案解析-奥数500桶酒其中1桶是毒酒试题及答案【附原题】完整打包下载-东坡下载...
  20. 【C语言细枝末节の杂谈】转义字符

热门文章

  1. torch和torchvision对应关系
  2. 从蓝海战略到长尾理论
  3. 递归方程组解的渐近阶的求法--套用公式法
  4. 电脑硬盘不小心删除了 怎么恢复数据硬盘?
  5. supervisor /usr/lib64/python2.7/socket.py line: 224
  6. 2022年大二学生HTML期末作业,网页制作作业(我的校园网站制作)
  7. ArcGIS for Desktop安装及授权常见问题解答
  8. 房子场景模型如何建造?看3D建模教程:3ds max、zbrush制作房子
  9. Python脚本解析BitTorrent种子文件内容
  10. 打开浏览器,显示网页可能暂时无法连接,或者它已永久性的移动到了新地址