1. 程式人生 > >oracle最基本的操作語法

oracle最基本的操作語法

oracle資料庫基本操作

插入資料:

語法:

insert intotable (column1, column2, …)

                            values (column1_value,column2_value, …)

注意格式:

數值型欄位可以直接寫值

字元型欄位,其值要加上單引號

日期型欄位,其值要加上單引號,同時還要注意年、月、日的順序。或者使用to_date ()函式將字串轉化為日期型別

插入列排序和插入值要一一對應,非空列必須有值

注意:

由於insert、update和delete等操作需要影響資料表中的記錄,使用commit指令提交所有的操作,使用rollback指令回滾所有的操作

如果向表中插入所有的欄位,可以省略列的列表,但是必須包括所有的列的值,而

且和資料表中的定義順序一致

更新資料:

         語法:

update table set column1=value1, column2=value2, …

                  where condition

範例:

update empset empno=8888, ename=‘Jacky’

                            where empno=7566

刪除資料:

         語法:

delete from table where condition

範例:

delete fromemp

where empno=8888;

建立表

語法:

create table table_name (

column1 type1,

column2 type2,

 …… 完整性約束……

)

範例:

create table employees (

           emp_no number not null,

           emp_fname varchar2(20) not null,

           emp_lname varchar2(20) not null,

           dept_no varchar2(4) not null

                  )

修改表結構:

增加列

語法:alter table table_nameadd column_name type

範例:alter tableemployees add phone varchar2(20)

更新列

語法:alter tabletable_name modify column_name type

範例: alter tableemployees modify phone varchar2(30)

 更新列時應注意:

一般情況下,只能把資料的長度從低到高改變,不能從高到低改變。可以把某種資料型別改變為相容的資料型別

當表中沒有資料時,可以把資料的長度從高到低改變,可以把某種資料型別改變為其它資料型別

刪除列

語法: alter tabletable_name drop column column_name

範例: alter tableemployees drop column phone

刪除表:

語法:

drop tabletable_name

範例:

drop tableprojects

約束

語法:

alter table table_name

         add constraint   constraint_name   constraint_expression

分類:

         主鍵約束(primary key):唯一的標識,本身不能為空

                   範例:給person表加主鍵約束

                            constraint person_pid_pkprimary key(pid);

         唯一約束(unique):在一張表中只允許建立一個主鍵約束,而其他列如果不希望出現重複值的話,就可以使用唯一約束

範例:給person表的name加唯一約束

                            constraint person_name_ukunique(name);

         檢查約束(check):檢查一個列的內容是否合法

範例:給person表的性別列加上約束

                            constraint person_sex_ckcheck(sex in(‘男’,’女’));

         非空約束(not null):內容不可以為空

                   範例:name varchar(10) not null,

         外來鍵約束(foreign key):在兩張表中進行操作

範例:給person表和book表加外來鍵約束

                            constraint person_book_fkforeign key(pid) references person(pid);

新增約束

         語法:

                   Alert table 表名稱 add constraint 約束名稱 約束型別(約束欄位)

刪除約束

         語法:

                   alert table 表名 drop constraint 約束名稱

         級聯刪除

                   步驟:

1. 先建立一個無任何約束的book表。

2. 再建立另一個帶有主鍵的person表。

3. 給book表加主鍵,給person表加外來鍵

alert table book

add constraint book_pid_pkprimary key(bid);

alert table book

constraint person_book_fkforeign key(pid) references person(pid)

on delete cascade;

                            4.在刪除person表中資訊的時候,有關book表中的內容也會被刪除

結構化查詢語句(SQL)

SQL語言組成:

1.資料定義語言DDL(DataDefinition Language)

它是SQL中用來生成、修改、刪除資料庫基本要素(表、檢視、模式、目錄等)的部分。(CREATE,DROP,ALTER)

2.資料操縱語言DML(DataManipulation Language)

是SQL運算資料庫的部分,它是對資料庫中的資料輸入、修改及提取的有力工具。(INSERT,UPDATE ,DELETE,SELECT)

3.資料控制語言DCL(Data ControlLanguage)

提供資料庫完整性所必需的防護措施。(GRANT,REVOKE)

資料庫伺服器的關閉、啟動等

SQL語言的優點

(1)一體化特點:

使用SQL可實現資料庫生命週期中的全部活動

(2)高度非過程化:

它是一種非過程化語言,允許使用者依據做什麼來說明操作,而不用說明怎樣做,存取路徑的選擇和操作過程由系統自動完成

(3)語言簡潔,易學易用

(4)統一的語法結構對待不同的工作方式

無論是聯機互動使用,還是嵌入到高階語言中,其語法結構是基本一致的,這就大大改善了終端使用者和程式設計人員之間的交流

基本單表查詢

         查詢所有記錄:

                   select* from 表名稱;

         查詢所有記錄的某些欄位:

                   selectcolumn1,column2…… from 表名稱

         取消重複項:

                   selectdistinct column1,column2…… from 表名稱

         顯示欄位的別名:

                   selectdistinct column1 as 別名1,column2 as 別名2…… from 表名稱

         單條件查詢:

                   selectdistinct * from 表名稱{where 條件(s)}

         比較運算子:

           =(等於)

select *from emp where job=‘MANAGER’

<>、!=、^=(不等於)

select * from emp where sal<>1100

<(小於)

select * fromemp where sal<2000

>(大於)

select * fromemp where sal>2000

<=(小於等於)

select * fromemp where sal<=2000

>=(大於等於)

select * fromemp where sal>=2000

in(列表)

select * fromemp where sal in (1000, 2000, 3000)

not in(不在列表)

select * fromemp where sal not in (1000, 2000, 3000)

between…and…(介於之間)

select * fromemp where sal between 1000 and 2000

not between…and…(不介於之間)

select * fromemp where sal not between 1000 and 2000

is null(是否為空)

select * fromemp where comm is null (注意,區別null和0,空字串‘’)

is not null(是否不為空)

select * fromemp where comm is not null

組合條件查詢:

select empno,ename, sal from emp where job=‘CLERK’ and sal<=2500

組合查詢中使用的邏輯比較符:

and(與)

select * from emp where job=‘CLERK’ and  sal<>2000

or(或)

select * from emp where job=‘MANAGER’ or  sal<>2000

not(非)

select * from emp where not job=‘MANAGER’

         模糊查詢:

like(模式匹配,檢驗一個包含字串資料的欄位值是否匹配一指定模式)

not like(模式不匹配)

萬用字元含義:

_:任何一個單一的字元

%:任意長度的字元

範例:

select * from emp where job like ‘%M%;

                   注:如果在使用like的時候沒有指定查詢的關鍵字,則表示全部查詢

select * from emp where job like ‘%%’;

排序查詢:

         語法:

select distinct * from 表名稱 {where 條件(s)} {orderby 排序的欄位1 ,排序的欄位2 asc|desc(升序|降序)}

         範例:查詢emp表並按sal進行降序排列

                   select *from emp order by sal desc;

聚合函式:

count(*) :返回所有行記錄數

select count(*) from emp

count (列名):返回表示式非null的行記錄數

select count(mgr) from emp

min(列名):返回表示式最小值

select min(sal) from emp

max(列名):返回表示式最大值

select max(sal) from emp

sum(列名):返回表示式的總和

select sum(sal) from emp

avg(列名):返回表示式的平均值

select avg(sal) from emp

         字元函式:

substr(string,start,count):取子字串,從start開始,取count個

         selectsubstr(’13088888888’,3,8) from dual;

length :返回字串的長度

         selectname,length(name)  from gao.nchar_tst;

replace(m,n,l):內容的替換

         select replace(‘hello’,’ll’,’xx’)from dual;

upper():在一個字串不知道大小寫的情況下用

         select * from empwhere ename=upper(‘smith’);結果返回大寫

lower():將一個字串變為小寫字母表示

         select lower(‘HELLO’)from dual;

initcap():將單詞的首字母大寫

         select initcap(‘HELLO’)fromdual;

         數值函式:

           ceil (n):取大於等於數值n的最小整數

select ceil(756.584) from dual; 結果是:757

floor (n):取小於等於數值n的最大整數

select floor(756.584) from dual; 結果是: 756

round (m, n):四捨五入,保留n位

select round(756.584) from dual; 結果是:757

mod (m, n):取m整除n後的餘數

select mod(10,3) from dual;  結果是:1

power (m, n):取m的n次方

select mod(2,3) from dual;  結果是:8

                   trunc(n):截斷小數位

select trunc(756.584) from dual; 結果是:756

         日期函式:

last_day():給定日期的最後一天

                  select last_day(sysdate) from dual;

add_months(): 增加日期

                  select add_months(sysdate,2) from dual;

         months_between():給定日期範圍的月數

                   selectempno,ename,months_between(sysdate,hiredate) from emp;

         next_day():下一個給定的日期的今天是哪個日期

                   selectnext_day (sysdate,’星期一’) from dual;

current_date()返回當前會話時區中的當前日期。

         轉換函式:

to_char: a.根據格式把日期轉化成字元,b.對數字進行格式化,9代表了一位數字      

c.用數字表示區域

其中:a.年:yyyy 月:MM 日:dd

           b.99,999 代表了五位數字

           c.$:表示美元‘$‘  L:表示local的縮寫 ‘¥‘

                  select to_char(sysdate,'yyyy-mm-dd') from dual;

           注:在1-9個月份中,顯示的時候系統會預設加“0”,若想去掉“0”,則可以使用“fm”。即:’fmyyyy-mm-dd’

to_number:轉換成數字

         selectto_number(‘123’)+to_number(‘123’) from dual; 結果是:246

to_date: 根據格式把字元轉化成日期

         selectto_date(‘2009-8-6’,’yyyy-mm-dd’) from dual;

         通用函式:

                   decode():類似於if…elseif…else if…else…

select empno,ename,hirdatedecode(job,’clerk’,’業務員’,’salesman’,’銷售人員’,’manager’,’經理’,’analyse’,’分析員’,’persident’,’總裁’) from emp;

         其他常用函式:

ascii:返回與指定的字元對應的十進位制數

                  select ascii(’A’) A,ascii(’a’)a,ascii(’0’) zero,ascii(’ ’) space from dual

chr:給出整數,返回對應的字元

                  select chr(54740) zhao,chr(65) chr65from dual;

concat :連線兩個字串

                  select concat(’010-’,’88888888’)||’轉23’ fromdual;

rpad和lpad: 在左邊/右邊重複指定的字元

                  selectlpad(rpad(’gao’,10,’*’),17,’*’)from dual;

trim/ltrim/rtrim: 去除空白字元

         分組查詢:

                   語法:

select distinct *|查詢列1 as 別名1,查詢列2 as 別名2……  from 表名稱 {where 條件(s)} {groupby 分組條件{Having 分組條件}}{order by 排序的欄位1 ,排序的欄位2 asc|desc(升序|降序)}

範例:selectjob, count(*) from emp group by job

注:

常和聚合函式一起使用

聚合函式如果作為條件,必須使用having子句

除了聚合函式以外,如果在查詢中顯示其他欄位,該欄位必須出現在group by分組列中

group by中不能使用列的別名,也不能使用序列號

having中的聚合函式不能使用別名

         內連線:

                   語法:

                            Selectcolumn_list from tab_1 [inner] join tab_2 on join_condition

    其中:

column_list表示將要檢索的列名列表

table_1和table_2表示將要連線的表的名稱

inner join關鍵字表示內連線,其中inner是可選的

on是指定連線條件的關鍵字

join_condition表示內連線的條件

         範例:

select e.empno, e.ename, d.dname from emp e

inner join dept d on e.deptno=d.deptno

         左右全連線:

                   語法:

                            Selectcolumn_list form tab_1 [left|right|full] outer join tab_2 on join_condition

         其中:

left outer join表示左連線

right outer join表示右連線

full outer join表示全外連線。其中outer是可選的

其它的引數和內連線相同

範例:

select e.empno, e.ename, d.dname

from emp e left outer join dept d on e.deptno=d.deptno

         多表連線:

           等值連線

selecte.empno, e.ename, d.dname from emp e, dept d

                            where e.deptno=d.deptno

不等值連線

selecte.empno, e.ename, d.dname

                           fromemp e, dept d

                           wheree.deptno<>d.deptno and e.deptno=10

自連線:

使用自連線應注意:

使用兩個不同的別名命名錶

使用不平衡條件,例如大於或小於條件。如果使用平衡條件,則檢索結果會出現兩倍的冗餘

自連線的結果一定要有實際意義

                            範例:

selectd1.deptno, d1.dname, d2.loc

                                    from dept d1, dept d2

                                    where d1.loc = d2.loc and d1.dname<> d2.dname

子查詢:

在select查詢語句裡可以嵌入select查詢語句,成為子查詢或巢狀查詢。子查詢形成的結果又成為父查詢的條件

使用子查詢應注意:

子查詢可以巢狀多層

子查詢操作的資料表可以是父查詢不操作的資料表

子查詢中不能有orderby排序語句

範例:

select empno, ename, job, sal from emp

                  where sal>(select sal from emp whereename=‘WARD’)

 in(not in)操作符:指定一個查詢的範圍       

                   select* from emp where sal in(select min(sal) from emp group by deptno );

any(some)操作符:=any:與in操作符一樣   >any:比裡面最大的值大   <any:比裡面最小的值小 

select empno, ename, job, sal from emp

                where sal > any (select sal from emp where job=‘MANAGER’)

          all:所有滿足條件的

select empno, ename, job, sal from emp

                            where sal > all (selectsal from emp where job=‘MANAGER’)

         exists:滿足條件的

select e.empno, e.ename, e.job, e.sal

                            from emp e, dept d  where exists

                            (select * from emp wheredeptno=d.deptno)

並操作(union)的巢狀查詢:

並操作是集合中並集的概念,屬於集合A或集合B的元素的總和就是並集

select deptnofrom emp

                            union (all)

                   select deptno from dept

union all和union不同之處在於unionall會將每一條符合條件的記錄都列出來,無論記錄是否重複

交操作(intersect)的巢狀查詢:

交操作是集合中交集的概念,屬於集合A且屬於集合B的元素的總和就是交集

select deptnofrom emp

                            intersect

                   select deptno from dept

差操作(minus)的巢狀查詢:

差操作是集合中差集的概念,屬於集合A且不屬於集合B的元素的總和就是差集

select deptnofrom dept

                            minus

                    select deptno from emp

rownum():表示行號,實際上是一個列,但這個列是偽劣,此列可以在每張表中出現。且rownum採用自動編號的形式出現。

         範例:

                   查詢表emp的前5條記錄

                   select* from emp where rownum<=5

返回第4條到第10條記錄:

select * from

                  (select rownum as no, e.* from emp e whererownum<=10)

                  where no>=4

以上是oracle的重點  下面的只做瞭解

索引:

語法:

create[unique] index index_name

                            on table_name(column_name [,column_name…])

                            [tablespace tablespace_name]

其中引數:

unique:表示唯一性索引,即索引值不允許重複

index_name:指定要建立的索引的名稱

table_name:要建立索引的目標表名稱

column_name:索引的目標列名稱

tablespace_name:索引所要位於的表空間的名稱。如果沒有指定,那麼索引位於當前使用者預設的表空間中

為employees表的emp_fname列建立索引以加快查詢速度:

create indexindex_fname on employees (emp_fname)

建立同義詞(SYNONYM):

同義詞(SYNONYM):可以理解為其它物件的一個別名,由它對映到另一個物件。

同義詞分為公有(public)同義詞和私有同義詞,僅有同義詞對所有使用者可見,預設建立的同義詞是私有同義詞,只有某個使用者可見。

建立語法:

create [public] synonym table_name for user.table_name;

drop [public] synonym table_name;

序列:

語法:

createsequence sequence_name

                  [start with start_number]

                  [increment by increment_number]

                  [(maxvalue maximum_number |nomaxvalue)]

                  [(minvalue minimum_number |nominvalue)]

                  [(cycle | nocycle)]

                  [(cache cache_number| nocache)]

                  [(order | noorder)]

其中引數:

sequence_name:指定序列的名稱

start_number:指定序列的起始整數值,預設值為1

increment_number:指定序列的步長,即增量

maximum_number:指定序列的最大值

nomaxvalue:沒有最大值限制,這是預設值

minimum_number:指定序列的最小值

nominvalue:沒有最小值的限制,這是預設值

cycle:序列數值是否迴圈生成

nocycle:序列數值不能迴圈,這是預設值

cache_number:保留在記憶體中的整數的數量,預設值是20

nocache:不指定儲存在記憶體中的整數的數量

order:按照順序生成序列值

noorder:不強調按照順序生成序列值

序列中包含兩個偽列,即currval和nextval列。在使用序列之前,必須先使用nextval對序列執行初始化操作

返回序列的下一個值:

selectsequence_name.nextval from dual

返回序列的當前值:

selectsequence_name.currval from dual

檢視:

作用:

檢視能簡化使用者的操作

檢視使使用者能以多種角度看待同一資料

檢視對重構資料庫提供了一定程度的邏輯獨立性

檢視能夠對機密資料提供安全保護

語法:

create orreplace view 檢視名字

as SQL語句

使用,語法如下:

select * from檢視名

刪除檢視的語法如下:

drop view 檢視名

儲存過程:

語法:

         CREATE[OR REPLACE] PROCEDURE<過程名>  (

         <引數1>,[方式l] <資料型別1>, 

         <引數2>,[方式2] <資料型別2>, 

         ……) 

         IS|AS (is或as完全等價 )

         [區域性變數宣告]

         BEGIN 

               PL/SQL過程體 

         END<過程名>

其中引數:

in引數型別:表示輸入給過程的引數

out引數型別:表示引數在過程中將被賦值,可以傳給過程體的外部

in out引數型別:表示該類引數既可以向過程體傳值,也可以在過程體中賦值,以便向過程體外傳值

儲存過程可以直接用EXECUTE命令呼叫或PL/SQL程式塊內部呼叫

用EXECUTE命令呼叫儲存過程的格式如下: 

SQL>EXECUTE  proc_name(par1,par2…);

儲存過程也可以被另外的PL/SQL塊呼叫,呼叫的語句是:

         DECLARE par1,par2;

         BEGIN

            proc_name(par1,par2…);

         END;

         在呼叫前要宣告變數par1,par2

刪除儲存過程:

DROP PROCEDURE proc_name; 

函式:

語法:

         CREATE[OR REPLACE] FUNCTION<函式名> [(引數列表)]

         RETURN資料型別

         IS|AS (is或as完全等價 )

         [區域性變數宣告]

         BEGIN 

               PL/SQL函式體 

         END[<函式名>]

函式的結束一定要使用return語句返回一個與宣告匹配的值

create or replacefunction f_getinfo(str varchar2) return varchar2
is
begin
  dbms_output.put_line('test function ');
  return 'Hello ' || str;
end;

函式的功能是返回一個值,因此可以用在SQL查詢語句中,也可以用在PL-SQL語句塊中。

用SQL呼叫函式的格式如下: 

SQL>select  fun_name(par1,par2…) from tablename;

如:select f_getinfo('Jack')from dual;

刪除函式可使用如下命令:

         dropfunction funname;

觸發器:

功能:

允許/限制對錶的修改

自動生成派生列,比如自增欄位

強制資料一致性

提供審計和日誌記錄

防止無效的事務處理

啟用複雜的業務邏輯

型別: 

DML語句(DELETE,INSERT,UPDATE)

DDL語句(CREATE,ALTER, DROP)

資料庫操作(SERVER ERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)

語法:

         CREATE[ OR REPLACE ] TRIGGER name 

         {BEFORE | AFTER }  { event [ OR ... ] }

         ON table [FOR [ EACH ] { ROW | STATEMENT } ] 

         [WHEN(condition) ]

         plsql block| call procedure s_statement

注意事項:

觸發器可以宣告為在對記錄進行操作之前(檢查約束之前和 INSERT,UPDATE 或 DELETE 執行前)或之後(在檢查約束之後和完成 INSERT, UPDATE 或 DELETE 操作)觸發

一個 FOR EACH ROW 執行指定操作的觸發器為操作修改的每一行都呼叫一次

SELECT 並不更改任何行,因此不能建立 SELECT 觸發器。這種場合下檢視更適合

觸發器和某一指定的表格有關,當該表格被刪除時,任何與該表有關的觸發器同樣會被刪除

在一個表上的每一個動作只能有一個觸發器與之關聯

在一個單獨的表上,最多隻能建立三個觸發器與之關聯,一個INSERT觸發器,一個DELETE觸發器和一個UPDATE觸發器

刪除觸發器語法:

DROP TRIGGER name ON table