?? oracle(day2).txt
字號:
一、單行函數
1.字符函數
字符是大小寫敏感的
轉小寫 lower(字段名) --- 其中的參數可以是一個字符串常量或是一個字段名
轉大寫 upper(字段名)
首字母大寫 initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符個數)
dual表,是專門用于函數測試和運算的,他只有一條記錄
字符串拼接 concat(...,....)
求指定子串 substr(...,起始位置,取字符個數)
可以使用"-"表示從右向左取,取的時候可以從左往友取。
例:select substr(first_name,-2,2) sub from s_emp;(取后兩個)
select substr(first_name,2,2) sub from s_emp;(取前兩個)
2,數值函數
四舍五入 round(數據,保留小數點后幾位)
可以用負數表示小數點前,0,表示小數點后第一位,也就是保留個位,-1表示個位(保留到十 位)。
例:select round(15.36,1) from dual;
截取數字函數 trunc(數據,保留的位數(小數點后位數)) 截取個位之后補0
例:select trunc(123.456,1) from dual;
3,日期函數
日期格式,
全日期格式 世紀信息,年月日,時分秒。
缺省日期格式,日-月-年 dd-mon-rr
修改當前會話的日期格式,會按照指定的格式輸出日期
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
返回當前日期 sysdate
例:select sysdate from dual;
select sysdate+1 from dual; 獲得明天的日期,加1,單位是天
日期是格式敏感的
求兩個日期間相隔了多少個月 months_between(date1,date2)
加減指定數量的月份 add_months(date,月數),月數可以為負,負值就是減去相應的月數。
從date日期開始的第一個星期五 next_day(date,FriDay)
返回月末的日期 last_day(date)
截取日期 trunc(date,'年或月或日或時分秒')
例:select next_day(sysdate,2) from dual;
例:select trunc(add_months(sysdate,1),'month') from dual;
ROUND('25-MAY-95','MONTH') 01-JUN-95
ROUND('25-MAY-95 ','YEAR') 01-JAN-95
TRUNC('25-MAY-95 ','MONTH') 01-MAY-95
TRUNC('25-MAY-95 ','YEAR') 01-JAN-95
練習:
返回下個月的第一天的日期
select round(last_day(sysdate),'MONTH') from dual;
select add_months(trunc(sysdate,'MONTH'),1);
4,不同數據類型間轉換函數
將日期轉成字符 tochar(date,'日期格式')
日期格式要用有效格式,格式大小寫敏感 'yyyy mm dd hh24:mi:ss',
'year'(全拼的年),'mm'(數字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;
將字符轉換成數字 to_number('...')
將數字轉字符to_char(number,'fmt') fmt是數字格式
將字符串轉成日期 to_date('...','日期格式')
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
二、多表查詢
表連接(關聯查尋)
如果多表查詢時不加where子句,也就是過濾條件或者是使用了無效的條件,就會產生兩表之間記錄的相互逐條匹配(組合),產生很多無效的結果(笛卡爾積)。
注意:在使用表連接時,要注意查詢的表間的關系信息,表之間的字段所表示的信息的關系
1、等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3=表別名2.字段名4;
表連接時,當表與表之間有同名字段時,可以加上表名或表的別名,加以區分,使用時要用
表名.字段名或表別名.字段名(列名)。當表的字段名是唯一時,可以不用加上表名或表的別名。
注意:當為表起了別名,就不能再使用表名.字段名。
例:select a.first_name,a.last_name,b.name
from s_emp a,s_dept b
where a.dept_id=b.id;
2、非等值連接
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表2 表別名2
where 表別名1.字段名3 ..... 表別名2.字段名4
....可以使比較運算符,也可以使其他的除了'='的運算符
例:select e.ename, d.grade,e.sal
from emp e,salgrade d
where e.sal between d.losal and d.hisal;
3、自連接
用別名把一張表中的數據分成兩部分,然后在使用條件過濾。
select [表別名1.字段名1],[表別名2.字段名2],...
from 表1 表別名1 ,表1 表別名2
where 表別名1.字段名3=表別名2.字段名4;
例:select a.first_name ename,b.first_name cname
from s_emp a,s_emp b
where a.manager_id=b.id;
以上所提到的表連接,都叫做內連接,嚴格匹配兩表的記錄。
4、外連接
會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,數據庫會模擬出記錄去和那些不匹配的記錄匹配。
例:select a.first_name enamei,a.id,b.first_name cname,b.id
from s_emp a,s_emp b
where a.manager_id=b.id(+);
即用a表中的數據去匹配b表的,若b表中有null,系統模擬紀錄與其匹配
注意:要把那一方的記錄全部都顯示出來,還有注意條件(+)跟在要全部選出的對端。
外連接的應用:
列出哪個部門沒有員工
select e.deptno,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno
and e.deptno is null;
標準sql中的外連接:
select e.last_name,c.name
from s_emp e right join s_customer c
on e.id=c.sales_rep_id;
注意:a)right join-->把join右邊的表全部顯示出來,另外一方 沒有用null來補齊
left join--->把join左邊的表全部顯示出來
join ------->沒有left/right是內連接(都非空才連接起來,嚴格匹 配兩表的記錄)
full join---->滿連接(把左右兩邊的都顯示出來)
b)join 一定放在from中
c)條件用on
三、組函數
group 組
group by 分組子句,按指定的分組規則分組 ,這個group by 子句可以跟在 select 語句后或是 having后面。
group by子句也會出發排序操作,會按分組字段排序。
select [組函數或分組的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;
例:select avg(salary) from s_emp group by dept_id;
注意:組函數可以處理一組數據,返回一個值。
組函數會忽略空值。
avg(..),求平均值,sum(..),求和 這兩個函數的參數只能是number型的。
以下所提到的函數可以使用任意類型做參數。
count(..),用來統計記錄數,可以使用排重命令。count(...)默認使用的是all。
max(..),min(..)求最大值和最小值,
count(*),統計表中記錄數。
例:select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.dept_id;
注意:只要寫了group by子句,
*** select后就只能用group by后的字段或者是組函數。 ***
where子句只能夠過濾記錄,放單行函數。
having子句可以過濾組函數結果或是分組的信息,且寫在group by子句后。
例:
select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.id
having sum(a.salary)>4000;
column 也可以定義有別名的列的格式。
column "別名" 格式定義
注意:要先過濾掉不需要的記錄,然后再進行分組操作,提高效率。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -