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

简介: 空字符串在oracle中常常相当于null,为什么不说空字符串等价于null呢,看案例:可以看到,本身deptno是number类型的,而‘’字符串本身是varchar类型,这与null可以是任何类型不同,所以也就不等价。

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 c6
    from dual
  union all
  select null as c1, null as c2, null as c3, 3 as c4, null as c5, 2 as c6
    from 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 c6
    from dual
  union all
  select null as c1, null as c2, null as c3, 3 as c4, null as c5, 2 as c6
    from 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 emp
 where ((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 deptno
         when 10 then
          'low'
         when 20 then
          'high'
         else
          'ww'
       end as lel
  from 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
----------
         1
       300
       500
         1
      1400
         1
SQL> select nvl(comm,'a') as comm from emp;
select nvl(comm,'a') as comm from emp

ORA-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
----------
         1
         1
         1
         2
         1
         2

6 rows selected
SQL> select nvl2(comm,'a',2)as a from emp where deptno=30;

A
-
a
a
a
2
a
2

6 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=30

ORA-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可以是任何类型不同,所以也就不等价。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
6天前
|
SQL 存储 NoSQL
SQL vs. NoSQL:如何根据大数据需求选择合适数据库
【4月更文挑战第8天】本文对比分析了SQL与NoSQL数据库在大数据项目中的应用。SQL数据库适合结构化数据、强一致性和复杂事务处理,如金融系统,而NoSQL则适用于半结构化和非结构化数据、高并发及大数据场景,如社交网络。选择时应考虑业务需求、技术栈、团队经验和成本效益,以找到最佳解决方案。随着技术发展,NewSQL和Multi-model数据库也提供了更多选择。
35 0
|
6天前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
122 0
|
6天前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用合集之大数据计算MaxCompute即使用相同的SQL语句在DataWorks和Tunnel上执行,结果却不同,如何解决
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1天前
|
SQL 分布式计算 Java
大数据软件基础(2)—— Java、SQL
大数据软件基础(2)—— Java、SQL
8 0
|
4天前
|
SQL 运维 Linux
SQL基础(1),从三流Linux运维外包到秒杀阿里P7,
SQL基础(1),从三流Linux运维外包到秒杀阿里P7,
|
6天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在DataWorks中使用ODPS SQL时遇到"该文件对应引擎实例已失效,请重新选择可用的引擎实例"的错误提示”,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
40 0
|
6天前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之DataWorks中,填写ODPS SQL任务中的参数和分区信息如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
30 0
|
6天前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用合集之阿里云MaxCompute对SQL语句的长度的长度限制是多少
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
6天前
|
存储 运维 容灾
带你读《云上自动化运维宝典》——一文详解云上跨可用区容灾解决方案和异地多活能力建设最佳案例(3)
带你读《云上自动化运维宝典》——一文详解云上跨可用区容灾解决方案和异地多活能力建设最佳案例(3)
129 0