Oracle之函數學習
sql
一、字符函數是oracle中最經常使用的函數數據庫
lower(char):將字符串轉化爲小寫的格式session
upper(char):將字符串轉化爲大寫的格式oracle
length(char):返回字符串的長度ide
substr(char,m,n):取字符串的子串函數
將全部的員工的名字按小寫的方式顯示?學習
SQL> select lower(ename),sal from emp;測試
LOWER(ENAM SALspa
---------- ----------.net
smith 800
allen 1600
按照大寫的方式顯示?
SQL> select upper(ename),sal from emp;
UPPER(ENAM SAL
---------- ----------
SMITH 800
顯示正好有5個字符的員工?
SQL> select * from emp where length(ename)=5;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800
20
顯示全部員工姓名的前三個字符?
SQL> select substr(ename,1,3) from emp; 從第一個字符開始,向後偏移三個字符
SUBSTR(ENAME
------------
SMI
ALL
SQL> select substr(ename,2,3) from emp; 從第二個字符開始,向後偏移三個字符
SUBSTR(ENAME
------------
MIT
LLE
取出首字母爲大寫的行?
SQL> select upper(substr(ename,1,1)) from emp; 第一步取出首字母,而後將首字母進行替換成大寫
UPPE
----
S
A
將字符串首字母除外的字符都變成小寫?
第一步使用substr函數先將第二個字符到最後一個字符摘出來,由length函數計算出長度
SQL> select lower(substr(ename,2,length(ename)-1)) from emp;
LOWER(SUBSTR(ENAME,2,LENGTH(ENAME)-1
------------------------------------
mith
llen
將首字符爲大寫其餘字符爲小寫的條件查詢出來
將二者結合起來就行
SQL> select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) from emp;
UPPER(SUBSTR(ENAME,1,1))||LOWER(SUBSTR(E
----------------------------------------
Smith
Allen
Ward ||:Oracle使用雙豎線表示字符串鏈接函數
replace(char1,search_string,replace_string)
顯示全部員工的姓名,用「B」替換「A」?
SQL> select replace(ename,'A','B') from emp前者爲舊字符,後者爲新字符(也就是替換後的字符)
REPLACE(EN
----------
SMITH
BLLEN
二、數學函數
數學函數的輸入參數和返回值的數據類型都是數字類型的。數學函數包括cos、cosh、exp、in、
log、sinh、sqrt、tan、tanh、acos、asin、atan、round
round(n,[m])
該函數用於執行四捨五入,若是省掉m則四捨五入到整數,m爲正數,則四捨五入到小數點的m位,m爲負數,則四捨五入到小數點的m位前
SQL> select round(sal),sal from student where xm='xiaocai';
ROUND(SAL) SAL
---------- ---------
1234 1234.34 四捨五入
SQL> select round(sal,1),sal from student where xm='xiaocai';
ROUND(SAL,1) SAL
------------ ---------
1234.3 1234.34
trunc(n,[m])
該函數用於截取數字,若是省掉m,就截取整數部分,若是m是正數就截取到小數點的m位後。若是m是負數,則截取到小數點的前m位
SQL> select trunc(sal),sal from student where xm='xiaocai';
TRUNC(SAL) SAL
---------- ---------
1234 1234.34
SQL> select trunc(sal,1),sal from student where xm='xiaocai';
TRUNC(SAL,1) SAL
------------ ---------
1234.3 1234.34
mod(m,n)
取模,取得就是餘數
SQL> select mod(10,2) from dual; 在作oracle測試時,可使用dual表(虛擬表)
MOD(10,2)
----------
0
SQL> select mod(1,3) from dual; 餘數爲1
MOD(1,3)
----------
1
floor(n)
返回小於或者是等於n的最大整數
SQL> select floor(sal),sal from student where xm='xiaocai';
FLOOR(SAL) SAL
---------- ---------
1234 1234.34 小於或者等於1234.34的最大整數爲1234,也就是比原值稍小的整數(或者相等)
ceil(n)
返回大於或者是等於n的最小整數
SQL> select ceil(sal),sal from student where xm='xiaocai';
CEIL(SAL) SAL
---------- ---------
1235 1234.34 比原值稍大的整數(或者相等)
三、日期函數
日期函數用於處理date類型的數據
默認狀況下日期格式是dd-7月-yy
a、sysdate:該函數返回當前系統時間
SQL> select sysdate from dual;
SYSDATE
---------
26-SEP-16
b、add_months(d,n):往d上加n個月時間
查詢出入職時間到如今已通過了8個月的員工?
SQL> select * from emp where sysdate>add_months(hiredate,8); 入職時間是hiredate,往此基礎上增長8個月,此時的系統時間比這個大就是表面已經入職8個月了
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
顯示出員工入職時間到如今有多少天?
SQL> select sysdate-hiredate workday,ename from emp;
WORKDAY ENAME
---------- ----------
13057.8384 SMITH
12992.8384 ALLEN
SQL> select trunc(sysdate-hiredate) workday,ename from emp;
WORKDAY ENAME
---------- ----------
13057 SMITH
12992 ALLEN
c、last_day(d):返回指定日期所在月份的最後一天
找出個月倒數第三天受僱傭的全部員工和時間?
SQL> select hiredate,last_day(hiredate) from emp;
HIREDATE LAST_DAY(HIREDATE)
----------- ------------------
1980/12/17 1980/12/31 入職時間是1980/12/17,當年的那一月的最後一天是1980/12/31
1981/2/20 1981/2/28
SQL> select hiredate,ename from emp where hiredate=last_day(hiredate)-2;
HIREDATE ENAME
--------- ----------
28-SEP-81 MARTIN
四、轉換函數
轉換函數用於將數據類型從一種轉爲另一種,在某些狀況下,oracle server容許值的數據和實際的不同,這時
oracle server會隱含的轉化爲數據類型
create table t1(id int);
insert into t1 values ('10'):這樣oracle會自動的將'10'轉化爲10
create table t2(id vachar2(10));
inset into t2 values (1);這樣oracle就會自動將1轉化爲'1'
儘管oracle能夠進行隱含的數據類型轉化,可是它並不適應全部的狀況。爲了提升程序的可靠性
應該使用轉換函數進行轉換.
函數to_char
使用函數to_char來替換,將表的某一個字段的進行替換
SQL> select to_char(hiredate,'yyyy-mm-dd') from emp;
TO_CHAR(HI
----------
1980-12-17
SQL> select to_char(sysdate,'day') from dual; 以day字符串的格式替換一下查詢結果
TO_CHAR(SYSDATE,'DAY')
------------------------------------
thursday
日期能夠顯示時/分/秒
yy:兩位數字的年份
yyyy:四位數的年份
mm:2位數的月數
dd:2位數的天數
hh24:24小時的小時數,好比晚上八點就是:20點
hh12:8點就是08點
mi、ss顯示分鐘、秒
示例:
SQL> select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
ENAME TO_CHAR(HIREDATE,'YYYY-MM-DDHH
---------- ------------------------------
SMITH 1980-12-17 00:00:00
ALLEN 1981-02-20 00:00:00
WARD 1981-02-22 00:00:00
JONES 1981-04-02 00:00:00
MARTIN 1981-09-28 00:00:00
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from emp;
TO_CHAR(SYSDATE,'YY
-------------------
2016-09-26 10:39:51
2016-09-26 10:39:51
薪水yoga貨幣單位顯示:
9:顯示數字,並忽略前面0,表示薪水這個字段的類型一共有多少有效數和支持的小數位數
2:顯示數字,如位數不足,用0補充
.:在指定位置顯示小數點
,:在指定位置顯示逗號
$:在數字前加美圓
L:在數字前加本地貨幣(oracle安裝時會判斷該用戶使用的字符集來判斷是哪一個國家)
C:在數字前加國際貨幣單位符號
G:在指定位置顯示組分符號
D:在指定位置顯示小數點符號
SQL> select ename,to_char(sal,'L99999.99') from emp;
ENAME TO_CHAR(SAL,'L99999.99')
---------- ------------------------
SMITH ¥800.00
ALLEN ¥1600.00
WARD ¥1250.00
JONES ¥2975.00
MARTIN ¥1250.00
SQL> desc emp;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4)
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y 因爲這個表emp的字段sal是number(7,2),因此上面用的是一共七位有效數,兩位小數
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y
to_char()用來取出hiredate字段的年份
SQL> select ename,to_char(hiredate,'year') from emp;
ENAME TO_CHAR(HIREDATE,'YEAR')
---------- ------------------------------------------
SMITH nineteen eighty
ALLEN nineteen eighty-one
WARD nineteen eighty-one
SQL> select ename,to_char(hiredate,'yyyy') from emp;
ENAME TO_CHAR(HIREDATE,'YYYY')
---------- ------------------------
SMITH 1980
ALLEN 1981
WARD 1981
SQL> select to_char(sysdate,'day') from dual;
TO_CHAR(SYSDATE,'DAY')
----------------------
星期五
SQL> select to_char(sysdate,'dd') from dual;
TO_CHAR(SYSDATE,'DD')
---------------------
23 只顯示的就是這一天的日子
查詢入職時間是1980年的員工?
SQL> select * from emp where to_char(hiredate,'yyyy')=1980;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
查詢入職月份是12月的員工?
SQL> select * from emp where to_char(hiredate,'mm')=12;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
函數sys_context:系統函數,下面是該函數的一些替換值
一、terminal:當前會話客戶所對應的中斷的標識符
二、language:語言
三、db_name:當前數據庫名稱
四、nls_date_format:當前會話客戶所對應的日期格式
五、session_user:當前會話客戶所對應的數據庫用戶名
六、current_schema:當前會話客戶所對應的方案名
七、host:返回數據庫所在主機的名稱
經過該函數,能夠查詢到一些重要信息,好比你使用的是哪一個數據庫?
SQL> select sys_context('userenv','db_name') from dual;
SYS_CONTEXT('USERENV','DB_NAME')
--------------------------------------------------------------------------------
orcl11g
查看當前數據庫支持的語言
SQL> select sys_context('userenv','language') from dual;
SYS_CONTEXT('USERENV','LANGUAG
--------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
查看nls_date_format
SQL> select sys_context('userenv','nls_date_format') from dual;
SYS_CONTEXT('USERENV','NLS_DAT
--------------------------------------------------------------------------------
DD-MON-RR
SQL> select sys_context('userenv','terminal') from dual;
SYS_CONTEXT('USERENV','TERMINAL')
--------------------------------------------------------------------------------
pts/0
查看session_user,至關於show user;查看當前用戶
SQL> select sys_context('userenv','session_user') from dual;
SYS_CONTEXT('USERENV','SESSION
--------------------------------------------------------------------------------
SCOTT
查看current_schema:當前會話客戶所對應的方案名 一個用戶對應一個方案,一個方案有不少數據對象
SQL> select sys_context('userenv','current_schema') from dual;
SYS_CONTEXT('USERENV','CURRENT
--------------------------------------------------------------------------------
SCOTT
SQL> select sys_context('userenv','current_schema') from dual;
SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
--------------------------------------------------------------------------------
SCOTT
查看當前數據庫的host主機
SQL> select sys_context('userenv','host') from dual;
SYS_CONTEXT('USERENV','HOST')
--------------------------------------------------------------------------------
aliyun_test
schema:
oracle以方案的名稱來管理數據對象
當數據庫建立了一個用戶時,oracle就會給用戶分配一個schema方案
方案裏面存放着什麼呢?
不少的數據對象
表、視圖、觸發器、存儲過程等等(以方案的方式管理數據對象)
http://blog.csdn.net/kimsoft/article/details/4627520
A schema is a collection of database objects (used by a user.).
Schema objects are the logical structures that directly refer to the database’s data.
A user is a name defined in the database that can connect to and access objects.
Schemas and users help database administrators manage database security.
從定義中咱們能夠看出schema爲數據庫對象的集合,爲了區分各個集合,咱們須要給這個集合起個名字
這些名字就是咱們在企業管理器的方案下看到的許多相似用戶名的節點,這些相似用戶名的節點其實就是一個schema
schema裏面包含了各類對象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。
一個用戶通常對應一個schema,該用戶的schema名等於用戶名,並做爲該用戶缺省schema。
這也就是咱們在企業管理器的方案下看到schema名都爲數據庫用戶名的緣由。Oracle數據庫中不能新建立一個schema
要想建立一個schema,只能經過建立一個用戶的方法解決(Oracle中雖然有create schema語句,可是它並非用來建立一個schema的)
在建立一個用戶的同時爲這個用戶建立一個與用戶名同名的schem並做爲該用戶的缺省shcema。即schema的個數同user的個數相同
並且schema名字同user名字一一 對應而且相同,全部咱們能夠稱schema爲user的別名,雖然這樣說並不許確,可是更容易理解一些。
一個用戶有一個缺省的schema,其schema名就等於用戶名,固然一個用戶還可使用其餘的schema。
若是咱們訪問一個表時,沒有指明該表屬於哪個schema中的,系統就會自動給咱們在表上加上缺省的sheman名。
好比咱們在訪問數據庫時,訪問scott用戶下的emp表,經過select * from emp; 其實,這sql語句的完整寫法爲select * from scott.emp。
在數據庫中一個對象的完整名稱爲schema.object,而不屬user.object。相似若是咱們在建立對象時不指定該對象的schema
在該對象的schema爲用戶的缺省schema。這就像一個用戶有一個缺省的表空間,可是該用戶還可使用其餘的表空間
若是咱們在建立對象時不指定表空間,則對象存儲在缺省表空間中,要想讓對象存儲在其餘表空間中,咱們須要在建立對象時指定該對象的表空間。
補充:
SQL> select trunc(sysdate+7)+(1/24) from dual; 對於當前日期和時間,在日期上加7天,時間中的小時加1,其它分、秒都不變,1/24:一天除以24小時,等於1小時
SQL> select trunc((sysdate+7)+(1/24)) from dual; 上述sql和這相似,結果都同樣
SQL> select trunc((sysdate+7)+(1/24)) from dual;
TRUNC((SY
---------
03-OCT-16
=>:
建立函數中參數的賦值:=>(=>這個符號的含義)
oracle實參與形參有二種對應方式
1.一種是位置方式,和麪向對象語言參數傳遞相似;
2.另一種是=> 做爲形參對應,由於位置對應方法有缺限,好比一個函數有四個參數,但第三個是能夠不傳(有默認值)
這裏就沒辦法位置對應方法,oralce內部通常用此種方法做參數傳遞(通常是, 某些參數有默認值的時候,你須要跳過某些參數來進行調用)
在Oracle中各符號含義
%(百分號): 用來表示任意數量的字符,或者可能根本沒有字符。
_(下劃線): 表示確切的未知字符。
?(問號): 用來表示確切的未知字符。
#(井號): 用來表示確切的阿拉伯數字,0到9.
[a-d](方括號):用來表示字符範圍,在這裏是從a到d.
單引號('):在Oracle中,應該只使用單引號將文本和字符和日期括起來,不能使用引號(包括單雙引號)將數字括起來。
雙引號("):在Oracle中,單雙引號含義不一樣。雙引號被用來將包含特定字符或者空格的列別名括起來。雙引號還被用來將文本放入日期格式。
撇號('):在Oracle中,撇號也能夠寫成彼此相鄰的兩個單引號。爲了在供應商名字中間查找全部帶撇號的供應商名字,能夠這樣編寫代碼:select * from l_suppliers where supplier_name like '%''%'
&符號:在Oracle中,&符號經常使用來指出一個變量。例如,&fox是一個變量,稍微有點不一樣的一種&& fox.每當&fox出如今Oracle腳本中時,都會要求您爲它提供一個值。而使用&&fox,您只須要在& &fox第一次出現時爲它提供變量值。若是想將&符號做爲普通的符號使用,則應該關閉這個特性。要想關閉這個特性,能夠運行如下的命令: set define off ,這是一個SQLplus命令,不是一個SQL命令。SQLplus設置了SQL在Oracle中運行的環境。
雙豎線(||):Oracle使用雙豎線表示字符串鏈接函數。
星號(*):select *意味着選擇全部的列,count(*)意味着計算全部的行,表示通配符時,表示0個或任意多個字符。
正斜槓(/):在Oracle中,用來終止SQL語句。更準確的說,是表示了「運行如今位於緩衝區的SQL代碼」。正斜槓也用做分隔項。
多行註釋:/*……*/.
不等於:有多種表達方式:!=、^=、<>、not xxx=yyy、not(xxx=yyy)
insert插入數據
當使用values子句時,一次插入的數據有限,當使用子查詢插入數據時,一條insert語句能夠插入大量的數據
當處理行遷移或者裝載外部表的數據到數據庫時,可使用子查詢來插入數據
一、先建立一個單表
SQL> create table mytable(myid number(4),myname varchar2(20),mydept number(3));
Table created
SQL> desc mytable;
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
MYID NUMBER(4) Y
MYNAME VARCHAR2(20) Y
MYDEPT NUMBER(3) Y
二、利用子查詢將查詢到的某一行數據插入到新表中
SQL> insert into mytable select empno,ename,deptno from emp where deptno=20;
5 rows inserted
三、查看插入的數據
SQL> select * from mytable;
MYID MYNAME MYDEPT
----- -------------------- ------
7369 SMITH 20
7566 JONES 20
7788 SCOTT 20
7876 ADAMS 20
7902 FORD 20
利用子查詢遷移行,遷移庫數據,效率提高
用update結合子查詢更新
但願scott員工的崗位、工資、補助和smith員工同樣多?
SQL> update emp set (job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename='SCOTT';
1 row updated
SQL> select job,sal,comm from emp where ename='SMITH';
JOB SAL COMM
--------- --------- ---------
CLERK 800.00
SQL> select job,sal,comm from emp where ename='SCOTT';
JOB SAL COMM
--------- --------- ---------
CLERK 800.00
Oracle事務處理
事務用於保證數據的一致性,它由一組相關的dml(增刪改)語句組成,該組的dml語句要麼所有成功,要麼所有失敗
如:網上轉帳就是典型的要用事務來處理,用來保證數據的一致性
事務和鎖
當執行事務操做時,也就是dml語句操做時,oracle會在被做用的表上加鎖,防止其餘用戶在此表上
修改此表的表的結構,這裏對用戶來講就是很是重要的
提交事務
當執行使用commit語句能夠提交事務,當執行了commit語句以後,會確認事務的變化,結束事務,刪除保存點,釋放鎖
當使用commit語句結束事務以後,其餘會話將能夠查看到事務變化後的數據,當退出plus命令行時,會默認提交事務
回退事務
回退事務須要用到保存點,可以將誤操做的數據進行回滾
savepoint a;
rollback to a;
a1:8點
a2:12:00
a3:17:00
能夠從a3回滾到a2,而後從a2繼續回滾到a1
可是使用commit一旦提交,保存點都將失去
SQL> savepoint a1; 建立保存點
Savepoint created
SQL> delete from mytable where myname='SMITH'; 模擬刪除數據
1 row deleted
SQL> commit; 提交事物
Commit complete
SQL> rollback to a1; 進行保存點回滾,可是失敗,說明提交事物後,保存點將失效
rollback to a1
ORA-01086: 從未在此會話中建立保存點 'A1' 或者該保存點無效
只讀事務
只讀事務是指只容許執行查詢的操做,而不容許執行任何其餘dml操做的事務,使用只讀事務能夠確保用戶只能取得
某時間點的數據。假定機票代售點天天18點開始統計今天的銷售情況,這是可使用只讀事務,在設置只讀事務
以後,儘管其餘會話可能會提交新的事務,可是隻讀事務將不會取得最新數據的變化,從而能夠保證取得
特定時間點的數據信息