如下是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来做更简洁,易懂。