如下是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'
endas
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和空值不是乙個概念
同樣的我們也可以用coalesce來實現這乙個功能。
select
coalesce
(comm,0)
,emp.
*from emp where comm is
null
;
很明顯,這案例用coalesce來做更簡潔,易懂。 SQLCookbook 學習筆記 1檢索記錄
特殊字元 表示 所有列 使用 和指定某個列 效能相同。使用where 指定 要保留哪些行 判斷某個字段 是非為空 用 is null 或者 is not null 如 mysql select from menpiao where logdate is null 在使用 and 和or 的時候,可以...
SQLCookbook 學習筆記
許多人以一種馬馬虎虎的態度在使用sql,根本沒有意識到自己掌握著多麼強大的 本書的目的是開啟讀者的視野,看看sql究竟能幹什麼。一鱗半爪 從資料庫中檢索資料看似是一件容易的事情,然而,在it世界裡,盡可能高效地檢索資料至關重要。讀完本書,你不應該覺得要將現在所有 重寫,而是要認識到,現在sql已經有...
sqlCookbook學習總結(一)
1 從表中檢索所有的行或列 使用 字元 代表所有資料 例如select from emp查詢表emp中所有資料 使用where 可以返回指定行 如select from emp where id 使用具體字段返回個別列 如 select empno,name,age,salary,job from ...