sql cookbook实验记录(First)

本文档记录了在Oracle Database 19c环境下进行的SQL实验,包括使用内联视图、条件判断、随机数生成、ROWID应用及NULL值处理等技巧。通过具体示例,展示了如何优化查询和理解数据库底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下是sql cookbook的一些实验记录。返璞归真,其实都是一些很简单的东西,简单的东西才有生命力,也不可能每天都有一些重大课题让我们研究。废话不说,言归正传。

环境介绍:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

目前可以下载到的最新版本啦!

1 将查询作为内联视图的话,就可以调用别名

select * from (select saddr,sid as session_id,serial# from v$session )  where session_id=2

session_id是这里的别名。

别名加连接

select ename ||' work as a ' ||job  AS JOB  from emp

也可以这么改

SELECT CONCAT(ename||' work as a  ',job) AS job FROM emp;

不过concat的参数个人限制是2个

条件判断,

  SELECT ename,
       sal,
       CASE
           WHEN sal < 2000 THEN 'low'
           WHEN sal > 4000 THEN 'high'
           ELSE 'ok'
       END
           AS status
  FROM emp;

在这里输出一个status列,判断工资的高低。我在想公司会不会在后台分析这下。马克思说,资本是无情的。也许他们也会这么干。

从表emp中取出随机的5列。

SELECT *
  FROM (  SELECT ename, job
            FROM emp
        ORDER BY DBMS_RANDOM.VALUE ())
 WHERE ROWNUM <= 5;

不过取随机数应该是很费性能的,因为这个思路必定是走全表。

执行计划

还要注意一点,rownum是有递增关系的。Oracle先有第一行才有第二行。这不是一个先有鸡还是先有蛋的问题。
for example:
scott@ORCL>select * from emp where rownum=5;

no rows selected

在这里插入图片描述
在执行计划里面看的就更明白了。

不过rowid就不同了,rowid是具体存在的物理地址

在这里插入图片描述
所以肯定是可以指定rowid进行选择的,不过这里的地址肯定是在内存里面的。但是查询了相关资料,rowid是映射物理地址而生成的。

scott@ORCL>alter system flush buffer_cache;

System altered.

刷完了,当然要走物理读了。
在这里插入图片描述

取出了几个对照值,其实地址是不改变的。
在这里插入图片描述

可以根据rowid取出这一行记录所在的对象,文件号,block号
设置rownum在几次查询中也是不改变的。
在这里插入图片描述

附上SQL:

SELECT ROWID,
       DBMS_ROWID.rowid_object (ROWID)           obj_id#,
       DBMS_ROWID.rowid_relative_fno (ROWID)     rfile#,
       DBMS_ROWID.rowid_block_number (ROWID)     block#,
       DBMS_ROWID.rowid_row_number (ROWID)       row#
  FROM emp
 WHERE ROWID = 'AAAXHvAAHAAAAfbAAA' or rowid='AAAXHvAAHAAAAfbAAC'

其实这也反向证明了,rowid是根据什么生产的。
好了,衍生话题扯远了。

关于NULL值:
在这里插入图片描述

null和空值不是一个概念

scott@ORCL>select * from emp where comm='';    

no rows selected

在这里插入图片描述

同样的我们也可以用coalesce来实现这一个功能。

select  coalesce(comm,0),emp.* from emp where comm is null;

很明显,这案例用coalesce来做更简洁,易懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值