Oracle語句學習
(1)select * from dual中的dual到底是什麼?
在sql-developer中測試發現,dual只是一個包含一列,永遠只返回一條數據記錄的虛擬表。使用dual,是爲了構成select的語法規則。當我們需要查詢一些不需要表名的數據時,但爲了保證sql語法正確性,我們需要添加dual。
比如:
【1】查詢當前用戶
select user from dual;
【2】查詢Oracle的系統時間
select sysdate from dual;
(2)trunc(number)函數
trunc()的作用是按照一定的規則截取傳入的參數
【1】select trunc(123.456) from dual; 返回123 即直接去除小數位
【2】select trunc(123.456,2) from dual; 返回123.45 將小數點後2位的數字截去,說減去可能更容易理解
123.456-0.006=123.45
【3】select trunc(123.456,-2) from dual; 返回100 將小數點前2位的數字減去,即123.456-23.456=100
(3)nvl(a,b)函數
如果a爲null值時,則返回b。如果a不爲null值時,則返回a本來的值。
用java語言來概括就是
return a==null?b:a;
(4)sign(a)函數
如果a是負數,則返回-1
如果a是0,則返回0
如果a是正數,則返回1
(5)decode(key,x1,y1,x2,y2,.....xn,yn,defaultValue)函數
含義如下:類似於switch語句
switch(key){
case x1:
return y1;
case x2:
return y2;
.......
case xn:
return yn;
default:
return defaultValue;
}
【1】查詢某班男生和女生的數量
通常我們這麼寫:
select count(*) from 表 where 性別 = 男;
select count(*) from 表 where 性別 = 女;
之後好需要進行union
現在利用decode,可以這樣寫
select sum(decode(性別,男,1,0)),sum(decode(性別,女,1,0)) from 表
(6)listagg()函數的作用
列轉行,能夠將多條記錄轉化成一條記錄,中間用特定的分隔符連接
話不多說。示例:
查看每個人身上的標籤,標籤之間以逗號隔開
對應的sql語句爲:
select name,listagg(tag,',') within group(order by tag) tags from table_a group by name
此時輸出爲:
group bu name,先按照name字段就行分組
listagg(tag,',') 實現行轉列,將分組後的tag列表轉化成一行記錄,各個tag之間用逗號連接
within group(order by tag),tag行記錄內的多個tag,升序排列
(7)||是什麼意思?
相當於字符串連接,即相當於“+”
話不多說,示例:
(8)(+)代表什麼?
這個要談到左連接與右連接。
當此符號出現在連接條件的右邊時,此時是左連接。
當此符號出現在連接條件的左邊時,此時是右連接。
更加詳細的解釋見Oracle(+)號用法
不過需要注意的是,oracle中才有這種語法。mysql中是沒有的,只能乖乖的寫join了。