Oracle之單表查詢及常用函式
1.語法:
select 欄位列表
from 表名
[where 查詢條件]
[group by 分組]
[having 分組條件]
[order by 排序]
select * 代表查詢所有的欄位
select id as “編號”,sname 學生姓名,age “【年齡】” –as 之後是別名 也可以直接省略
select t.*
from t_student t – 給表取別名
where classid is null -- 空判斷 where age not in (20,23,...) --範圍判斷 where age between 20 and 25 --區間判斷between'A' and 'Z' where sname not like '%江%' --sname like '江%' -- '江%' 以江開頭 '%江' 以江結尾 '%江%' 包含江 --模糊查詢 _一個下劃線表示一個位置 order by age -- asc 升序 desc降序 預設升序 select distinct age,sex from t_student --distinct 去掉重複記錄
統計函式:
count:統計條數
select count(*) from t_student
select count(id) from t_student
select count(classid) from t_student
– 統計的是該列中非空的記錄的個數
select count(1) from t_student;
select id,sname,age,sex,classid,1,2,3 from t_student
sum:求和
select sum(age) from t_student;
min:取最小值
select min(age) from t_student;
max:取最大值
select max(age) from t_student;
avg:取平均值
select avg(age) from t_student;
select sum(age),min(age),max(age),avg(age) from t_student;
count(1)與count(*)比較:
如果你的資料表沒有主鍵,那麼count(1)比count(*)快
如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count(*)要快
如果你的表只有一個欄位的話那count(*)就是最快的啦
count(*) count(1) 兩者比較。主要還是要count(1)所相對應的資料欄位。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因為count(),自動會優化指定到那一個欄位。所以沒必要去count(?),用count(
count詳解:
count(*)將返回表格中所有存在的行的總數包括值為null的行,然而count(列名)將返回表格中除去null以外的所有行的總數(有預設值的列也會被計入).
distinct 列名,得到的結果將是除去值為null和重複資料後的結果
group by :分組函式
select age,sex
from t_student
group by age,sex
–注意:分組函式中的 欄位列表只能出現分組的欄位和統計函式
– 分組函式在沒有統計函式使用的時候作用和 distinct 是一樣的
select sex,count(sex)
from t_student
group by sex
–分組函式【聚合函式】在沒有和 group by 一塊使用的時候統計的是查詢的所有的資料
–如果和 group by 一塊使用的化,那麼統計的是分組後的各組資料
select classid,sex,count(1)
from t_student
group by classid,sex
having count(1) > 1 – 分組後的條件
select classid,sex,count(1)
from t_student
where age > 20 -- 分組之前加條件
group by classid,sex
where 和 having 的區別
where 只能跟在 from 後面 表示對查詢的資料來源過濾
having 只能出現在 group by 後面,對分組後的資料進行過濾,
常用函式:
concat:連線函式
select concat(id,sname),length(sname) from t_student
日期函式:
字串轉date: to_date
update t_student set birth=to_date(‘1990-01-01’,’yyyy-mm-dd’)
date轉字串: to_char
select sysdate
,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’)–在資料庫中是HH24 mi
,to_char(sysdate,’yyyy-mm-dd’)
,to_char(sysdate,’yyyy-mm’)
,to_char(sysdate,’yyyy’)
from dual;
months_between(sysdate,date);–兩者時間的月份數
add_months:在當前時間的基礎上增加月份數
select add_months(sysdate,12) from dual;
last_day():返回指定日期的當月的最後一天
select last_day(sysdate) from dual;
extract:擷取日期指定部分的內容
select extract(DAY from sysdate) from dual; –dual是一個系統自帶的虛表
nvl(column,value);如果查詢的欄位為null,就用預設值填充
select id,sname,sex,nvl(sex,’哈哈’) from t_student
decode:類似於Java中的if語句
select
id,sname,sex
,decode(sex,1,'男') -- if(sex == 1){男}
,decode(sex,1,'男',2,'女') -- if(){}else if(){}
,decode(sex,1,'男',2,'女','不詳')--if(){}else if(){}else{}
from t_student
rowid:行id,資料儲存的位置,唯一
rownum:行號,系統自動維護的,從1開始自增,有1才有2
select t.*,rownum from t_student t
查詢出學生表中前5條的學生記錄
select t.*,rownum from t_student t where rownum <=5
查詢出學生表中第5條到第10條的記錄
select t.*,rownum from t_student t where rownum >=5 and rownum <=10 —這是錯誤的寫法
—分頁查詢的實現方式(在Oracle中要這麼實現)
select t1.*,rownum
from
(select t.*,rownum num from t_student t) t1 –先查詢所有的資料和行號
where t1.num >= 5 and t1.num <=10 –再從中選出想要的部分
select t2.*,rownum
from
(select t1.* ,rownum num from t_student t1 where rownum <=10) t2 --先取上限的資料及行號
where t2.num >=5 --再取下限的資料
case的使用
查詢出學生表中年齡在【20歲以下】【21-25】【26以上】分別有多少人
select t.*,
case when age <= 20 then 1 else 0 end “21以下”
,case when age >20 and age <26 then 1 else 0 end “21-25”
,case when age >= 26 then 1 else 0 end “26以上”
from t_student t
select
sum(case when age <= 20 then 1 else 0 end ) "21以下"
,sum(case when age >20 and age <26 then 1 else 0 end) "21-25"
,sum(case when age >= 26 then 1 else 0 end )"26以上"
from t_student t
select
count(case when age <= 20 then 1 else null end ) "21以下"
,count(case when age >20 and age <26 then 1 else null end) "21-25"
,count(case when age >= 26 then 1 else null end )"26以上"
from t_student t
函式
說明
ASCII(x)
返回字元x的ASCII碼。
CONCAT(x,y)
連線字串x和y。
INSTR(x, str [,start] [,n)
在x中查詢str,可以指定從start開始,也可以指定從第n次開始。
LENGTH(x)
返回x的長度。
LOWER(x)
x轉換為小寫。
UPPER(x)
x轉換為大寫。
LTRIM(x[,trim_str])
把x的左邊截去trim_str字串,預設截去空格。
RTRIM(x[,trim_str])
把x的右邊截去trim_str字串,預設截去空格。
TRIM([trim_str FROM] x)
把x的兩邊截去trim_str字串,預設截去空格。
REPLACE(x,old,new)
在x中查詢old,並替換為new。
SUBSTR(x,start[,length])
返回x的字串,從staart處開始,擷取length個字元,預設length,預設到結尾。
ABS(x)
x絕對值
ABS(-3)=3
ACOS(x)
x的反餘弦
ACOS(1)=0
COS(x)
餘弦
COS(1)=1.57079633
CEIL(x)
大於或等於x的最小值
CEIL(5.4)=6
FLOOR(x)
小於或等於x的最大值
FLOOR(5.8)=5
LOG(x,y)
x為底y的對數
LOG(2,4)=2
MOD(x,y)
x除以y的餘數
MOD(8,3)=2
POWER(x,y)
x的y次冪
POWER(2,3)=8
ROUND(x[,y])
x在第y位四捨五入
ROUND(3.456,2)=3.46
SQRT(x)
x的平方根
SQRT(4)=2
TRUNC(x[,y])
x在第y位截斷
TRUNC(3.456,2)=3.45