Oracle數(shù)據(jù)庫常用語句總結(jié)大全
創(chuàng)建/刪除數(shù)據(jù)庫
# 創(chuàng)建 create database databasename # 刪除 drop database databasename
創(chuàng)建/刪除表
# 常規(guī)創(chuàng)建 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) # 使用舊表創(chuàng)建新表 select * into table_new from table_old # 使用舊表創(chuàng)建新表 create table tab_new as select col1,col2… from tab_old # 刪除表 drop table tabname
其他表操作
# 重命名表 alter table 原表名 rename to 新表名
增加字段
語法:
alter table 表名 add (字段名 字段類型 默認(rèn)值 是否為空);
例如:
alter table tablename add (ID varchar2(30) default '空' not null);
修改字段
語法:
alter table 表名 modify (字段名 字段類型 默認(rèn)值 是否為空);
例如:
alter table tablename modify (ID number(4));
重命名字段
語法:
alter table 表名 rename column 列名 to 新列名 --其中:column是關(guān)鍵字
例如:
alter table tablename rename column ID to newID;
刪除字段
語法:
alter table 表名 drop column 字段名;
例如:
alter table tablename drop column ID;
主鍵/索引/視圖相關(guān)
# 添加主鍵 alter table tabname add primary key(col) # 刪除主鍵 alter table tabname drop primary key(col) # 創(chuàng)建索引 create [unique] index idxname on tabname(col….) # 刪除索引 (索引是不可更改的,想更改必須刪除重新建。) drop index idxname # 創(chuàng)建視圖 create view 視圖名 as select statement # 刪除視圖 drop view viewname
數(shù)據(jù)插入
# 全字段添加-語法: insert into 表名 values(所有列的值); #例如: insert into test values(1,'zhangsan',20); # 自定義字段添加-語法: insert into 表名(列) values(對應(yīng)的值); # 例如: insert into test(id,name) values(2,'lisi'); # 將表1數(shù)據(jù)插入到表2-語法: insert into 表2 select * from 表1; # 例如: insert into test(name,role,createId,createdate) select name,role,id,now() from test_user;
數(shù)據(jù)更新
# 語法: update 表 set 列=新的值 [where 條件] --更新滿足條件的記錄 # 例如: update test set name='zhangsan2' where name='zhangsan'
數(shù)據(jù)刪除
# delete語法: delete from 表名 where 條件 --刪除滿足條件的記錄 # 例如 delete from test where id = 1; delete from test -->刪除所有 delete刪除的時(shí)候,會記錄日志 刪除會很慢 # truncate語法: truncate table 表名 --刪除所有數(shù)據(jù),不會影響表結(jié)構(gòu),不會記錄日志,數(shù)據(jù)不能恢復(fù),刪除得很快
字段拼接
- CONCAT(char1,char2),在oracle中concat函數(shù)只能拼接兩個(gè)值,這根mysql不一樣
- 返回兩個(gè)字符串連接后的結(jié)果,兩個(gè)參數(shù)char1,char2是要連接的兩個(gè)字符串。
- 等價(jià)操作:連接操作符“||”
- 如果char1,char2任何一個(gè)為NULL,相當(dāng)于連接了一個(gè)空格
- 注意:建議多個(gè)字串連接時(shí),用“||”更直觀
#字符串函數(shù) CONCAT()函數(shù),用來連接字符串 SELECT CONCAT(ename,sal) FROM emp SELECT CONCAT( CONCAT(ename,','),sal) FROM emp SELECT ename||','||sal FROM emp
merge into
- 在Oracle中,常規(guī)的DML語句只能完成單一功能,,例如insert/delete/update只能三選一,而merge into語句可以同時(shí)對一張表進(jìn)行更新/插入/刪除。
- merge into常用在數(shù)據(jù)同步的場景,它會選定一張基表作為數(shù)據(jù)源,然后與目標(biāo)表的記錄進(jìn)行匹配,根據(jù)匹配的結(jié)果,可以對目標(biāo)表同時(shí)進(jìn)行更新/插入/刪除操作。
語法
MERGE INTO target_table USING source_table ON (join_condition) WHEN MATCHED THEN UPDATE SET … [WHERE …] [DELETE … WHERE …] WHEN NOT MATCHED THEN INSERT (column_list) VALUES (value_list) [WHERE …] LOG ERRORS INTO … REJECT LIMIT [integer|UNLIMITED]
- target_table 是要更新的表
- source_table 是參考表
- USING … ON () 是兩個(gè)表的連接條件,用于判斷記錄是否匹配
- WHEN MATCHED 對于滿足匹配條件的記錄進(jìn)行的操作,可以更新或刪除
- WHEN NOT MATCHED 對于不滿足匹配條件的記錄,可以插入
- LOG ERRORS INTO 可以將匹配錯(cuò)誤的記錄記錄到日志表中
案例
素材
create table src_table( id number(6), name varchar2(32), salary number(6), bonus number(6)); insert into src_table values(1,'Vincent',1000,100); insert into src_table values(2,'Victor',2000,200); insert into src_table values(3,'Grace',3000,300); create table tgt_table( id number(6), name varchar2(32), age number(6), salary number(6), bonus number(6)); insert into tgt_table values(1,'someone',1,0,0); insert into tgt_table values(3,'someone',3,0,0); insert into tgt_table values(4,'someone',4,0,0); commit;
同時(shí)更新和插入
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.name=s.name, t.salary=s.salary, t.age=10 when not matched then insert values(s.id,s.name,10,s.salary,s.bonus+50); commit; select * from tgt_table;
- When matched 為匹配存在的記錄(id為1,3),更新了name, salary, age個(gè)字段
- When not match 為目標(biāo)表不存在的記錄(id為2),插入了該記錄,同時(shí)bouns字段加50
- Matched 和 not matched的子句是獨(dú)立的,可以任意選擇一項(xiàng),或同時(shí)出現(xiàn)
- 目標(biāo)表中id為4的記錄在源表中不存在(不滿足連接條件),因此不會涉及
對于匹配的記錄,可以使用where子句進(jìn)一步限制范圍
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.bonus=s.bonus where s.id>=2; Select * from tgt_table order by id;
- 這里對匹配的記錄bonus字段進(jìn)行更新,同時(shí)進(jìn)一步限制id>=2的記錄才更新
- Where 子句的條件可以通過源表或者目標(biāo)表指定,這里是通過源表的s.id指定
在update子句后,還可以跟上delete … where …子句,對匹配上的記錄進(jìn)行刪除操作
merge into tgt_table t using src_table s on (t.id=s.id) when matched then update set t.bonus=s.bonus+50 where s.id>=3 delete where id>=2; select * from tgt_table order by id;
- delete where id>=2 指定將ID大于等于2的記錄刪除,但注意id為2的記錄并未被刪除,只有3被刪除了
- 因?yàn)閐elete只會在update匹配的到記錄范圍內(nèi)刪除,update子句有個(gè)where s.id>=3,delete也會受到這個(gè)條件的限制
- 實(shí)際執(zhí)行的效果是 delete where s.id>=3 and id>=2,只有id為3的記錄滿足這個(gè)條件
- id為4的記錄不在匹配范圍內(nèi),不受merge into語句的影響,也不會被刪除
記錄同步錯(cuò)誤
數(shù)據(jù)同步的時(shí),源表和目標(biāo)表的結(jié)構(gòu)/數(shù)據(jù)類型/約束可能并不一致,這就導(dǎo)致數(shù)據(jù)同步可能部分失敗,現(xiàn)在我們修改tgt表,限制salary字段值不能超過3000,即插入超過3000的數(shù)字將失?。?/p>
Alter table tgt_table modify salary number(6) check(salary<=3000);
首先調(diào)用dbms_errlog.create_error_log為tgt_table創(chuàng)建一張錯(cuò)誤日志表,表名為errlog:
exec dbms_errlog.create_error_log('tgt_table', 'errlog');
- 第一個(gè)參數(shù)指定要?jiǎng)?chuàng)建錯(cuò)誤日志的基表,第二個(gè)參數(shù)是錯(cuò)誤日志表名
然后在執(zhí)行merge into 語句時(shí),在最后跟上log errors into子句,如果語句執(zhí)行過程中遇到錯(cuò)誤,則會將錯(cuò)誤記錄到錯(cuò)誤日志中,方便后期排查和修復(fù),這里將tgt_table清空,嘗試將src_table的3條數(shù)據(jù)同步進(jìn)去,同時(shí)salary增加1000
truncate table tgt_table; merge into tgt_table t using src_table s on (t.id=s.id) when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus) log errors into errlog('something is wrong.'); select * from tgt_table;
- 這里將tgt_table表清空,然后嘗試將src_table中的3條記錄同步進(jìn)來,同步過程中我們將salary增加了1000
- 因?yàn)閠gt_table表salary有約束不能超過3000,因此語句回滾,一條記錄都沒同步進(jìn)來
- errlog中的’something is wrong.’ 是用戶定義的錯(cuò)誤標(biāo)記,可以幫助識別是哪個(gè)語句導(dǎo)致的錯(cuò)誤
查詢errlog表,可以看到導(dǎo)致失敗的原因,id為3的記錄,salary在增加1000后為4000,違反了目標(biāo)表的約束(check salary<=3000)
如果我們不想讓出現(xiàn)錯(cuò)誤的時(shí)候語句就回滾,可以在后面跟上一個(gè)reject limit N子句,限制只有出現(xiàn)N個(gè)以上的錯(cuò)誤時(shí)才回滾語句:
merge into tgt_table t using src_table s on (t.id=s.id) when not matched then insert values(s.id,s.name,10,s.salary+1000,s.bonus) log errors into errlog('Allow one error.') reject limit 1; select * from tgt_table;
- 我們在上面的語句后面增加了1個(gè)reject limit 1子句,當(dāng)出現(xiàn)1個(gè)及以下的錯(cuò)誤時(shí),并不會回滾
- 因此id為1和2的記錄成功插入,語句并未報(bào)錯(cuò)
- errlog的用戶標(biāo)記修改為’Allow one error.’
- 通過Allow one error標(biāo)簽,我們發(fā)現(xiàn)ID為3的記錄因違反約束沒有被插入
- 但這此有reject limit 1子句,語句允許出現(xiàn)1個(gè)及以下錯(cuò)誤,因此滿足條件的記錄被成功插入
- 如果選擇reject limit unlimited,則不限制錯(cuò)誤數(shù)量
分頁查詢
在Oracle中,可以使用ROWNUM關(guān)鍵字來實(shí)現(xiàn)分頁查詢。
示例1:查詢表中的前10條記錄
SELECT * FROM your_table WHERE ROWNUM <= 10;
示例2:查詢表中的第11到20條記錄
SELECT * FROM ( SELECT t.*, ROWNUM AS rnum FROM ( SELECT * FROM your_table ORDER BY your_column ) t WHERE ROWNUM <= 20 ) WHERE rnum >= 11;
示例3:查詢表中的第21到30條記錄,并按照指定的列進(jìn)行排序
SELECT * FROM ( SELECT t.*, ROWNUM AS rnum FROM ( SELECT * FROM your_table ORDER BY your_column ) t WHERE ROWNUM <= 30 ) WHERE rnum >= 21;
注意,在查詢結(jié)果之前使用ROWNUM,否則可能會產(chǎn)生錯(cuò)誤的結(jié)果。此外,使用子查詢的方式可以在外層查詢中使用rnum進(jìn)行過濾,從而實(shí)現(xiàn)分頁效果。
分組查詢/篩選
在Oracle中,可以使用分組查詢和篩選語法來對數(shù)據(jù)進(jìn)行分組和篩選。
基本的語法如下:
SELECT column1, column2, ..., aggregate_function(column) FROM your_table WHERE conditions GROUP BY column1, column2, ... HAVING conditions;
其中,column1, column2, …是要查詢的列,aggregate_function是聚合函數(shù)(如SUM、COUNT、AVG等),your_table是要查詢的表,conditions是查詢條件,column1, column2, …是要進(jìn)行分組的列。
示例1:統(tǒng)計(jì)每個(gè)部門的員工數(shù)量,并篩選出員工數(shù)量大于5的部門
SELECT department, COUNT(*) AS employee_count FROM your_table GROUP BY department HAVING COUNT(*) > 5;
示例2:計(jì)算每個(gè)部門的平均工資,并篩選出平均工資大于1000的部門
SELECT department, AVG(salary) AS average_salary FROM your_table GROUP BY department HAVING AVG(salary) > 1000;
示例3:統(tǒng)計(jì)每個(gè)部門的最高工資,并篩選出最高工資大于5000的部門
SELECT department, MAX(salary) AS highest_salary FROM your_table GROUP BY department HAVING MAX(salary) > 5000;
在HAVING子句中可以使用聚合函數(shù)進(jìn)行篩選,用來對分組后的結(jié)果再進(jìn)行一次篩選。與WHERE子句不同的是,HAVING子句是在分組后進(jìn)行篩選,可以使用聚合函數(shù),而WHERE子句是在分組前進(jìn)行篩選,不能使用聚合函數(shù)。
注意,在SELECT子句中,除了分組的列和聚合函數(shù)外,還可以選擇其他需要顯示的列,如:
SELECT department, job, COUNT(*) AS employee_count, AVG(salary) AS average_salary FROM your_table GROUP BY department, job HAVING COUNT(*) > 5;
排序
在Oracle中,可以使用ORDER BY子句對查詢結(jié)果進(jìn)行排序。ORDER BY子句的語法如下:
SELECT column1, column2, ... FROM your_table WHERE conditions ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
其中,column1, column2, …是要排序的列,ASC表示升序(默認(rèn)),DESC表示降序。
示例1:按照工資升序排序查詢結(jié)果
SELECT * FROM your_table ORDER BY salary ASC;
示例2:按照部門升序、工資降序排序查詢結(jié)果
SELECT * FROM your_table ORDER BY department ASC, salary DESC;
示例3:按照姓名升序、年齡降序排序查詢結(jié)果
SELECT * FROM your_table ORDER BY name ASC, age DESC;
可以根據(jù)需要在ORDER BY子句中指定多個(gè)列,并對每個(gè)列設(shè)置排序方式。如果不指定排序方式,默認(rèn)為升序。
注意,ORDER BY子句應(yīng)該在WHERE子句之后使用,用于對篩選后的結(jié)果進(jìn)行排序。如果只有一個(gè)列需要排序,可以直接寫上列名,如果有多個(gè)列需要排序,使用逗號分隔。
連接查詢
在Oracle中,可以使用不同的連接查詢語法來聯(lián)結(jié)多個(gè)表。以下是Oracle中的一些常見連接查詢語法及示例:
1. 內(nèi)連接(INNER JOIN):
SELECT column1, column2, ... FROM table1 INNER JOIN table2 ON table1.column = table2.column;
示例:
SELECT employees.employee_id, employees.first_name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;
2.左連接(LEFT JOIN):
SELECT column1, column2, ... FROM table1 LEFT JOIN table2 ON table1.column = table2.column;
示例:
SELECT employees.employee_id, employees.first_name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id;
3.右連接(RIGHT JOIN):
SELECT column1, column2, ... FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
示例:
SELECT employees.employee_id, employees.first_name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.department_id;
4.全外連接(FULL OUTER JOIN):
SELECT column1, column2, ... FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;
示例:
SELECT employees.employee_id, employees.first_name, departments.department_name FROM employees FULL OUTER JOIN departments ON employees.department_id = departments.department_id;
5.交叉連接(CROSS JOIN):
SELECT column1, column2, ... FROM table1 CROSS JOIN table2;
示例:
SELECT employees.first_name, departments.department_name FROM employees CROSS JOIN departments;
注意:以上語法和示例僅供參考,實(shí)際使用時(shí)應(yīng)根據(jù)具體的表和列名進(jìn)行調(diào)整。連接查詢可以通過指定JOIN條件,將多個(gè)表中的數(shù)據(jù)關(guān)聯(lián)起來,從而獲取更加豐富的查詢結(jié)果。
子查詢
在Oracle中,可以使用子查詢來作為查詢語句的一部分,以便在查詢中使用子查詢的結(jié)果。以下是Oracle中子查詢的語法和示例:
語法:
SELECT column1, column2, ... FROM table1 WHERE columnN IN (SELECT columnM FROM table2 WHERE condition);
示例:
- 使用子查詢獲取某個(gè)表中符合條件的數(shù)據(jù):
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
- 使用子查詢獲取某個(gè)表中的最大值或最小值:
SELECT employee_id FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);
- 使用子查詢作為存在性檢查:
SELECT employee_id, first_name, last_name FROM employees WHERE EXISTS (SELECT * FROM job_history WHERE job_history.employee_id = employees.employee_id);
- 使用子查詢作為計(jì)算列:
SELECT employee_id, first_name, last_name, (SELECT MAX(salary) FROM employees) - salary AS salary_diff FROM employees;
注意:以上語法和示例僅供參考,實(shí)際使用時(shí)應(yīng)根據(jù)具體的表和列名進(jìn)行調(diào)整。子查詢可以嵌套在主查詢中,以便根據(jù)子查詢的結(jié)果來篩選、計(jì)算或檢查數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于Oracle數(shù)據(jù)庫常用語句總結(jié)大全的文章就介紹到這了,更多相關(guān)Oracle常用語句大全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle 聲明游標(biāo)(不具備字段)規(guī)則應(yīng)用
在開發(fā)過程中可能會聲明一個(gè)含有某張表不具備字段的游標(biāo),來解決特殊問題,本文將詳細(xì)介紹這類問題,需要了解更多的朋友可以參考下2012-11-11利用PL/SQL從Oracle數(shù)據(jù)庫導(dǎo)出和導(dǎo)入數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了利用PL/SQL從Oracle數(shù)據(jù)庫導(dǎo)出數(shù)據(jù)和導(dǎo)入數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03詳解Linux系統(tǒng)中Oracle數(shù)據(jù)庫程序的啟動和關(guān)閉方式
這篇文章主要介紹了Linux系統(tǒng)中Oracle數(shù)據(jù)庫程序的啟動和關(guān)閉方式,文中還講到了滴哦Oracle啟動錯(cuò)誤問題的解決,需要的朋友可以參考下2016-03-03oracle數(shù)據(jù)庫實(shí)現(xiàn)獲取時(shí)間戳的無參函數(shù)
這篇文章主要介紹了oracle數(shù)據(jù)庫實(shí)現(xiàn)獲取時(shí)間戳的無參函數(shù)的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Oracle數(shù)據(jù)庫中SQL語句的優(yōu)化技巧
這篇文章主要介紹了Oracle數(shù)據(jù)庫中SQL語句的優(yōu)化技巧的相關(guān)資料,需要的朋友可以參考下2016-07-07Oracle存儲過程的編寫經(jīng)驗(yàn)與優(yōu)化措施(分享)
本篇文章是對Oracle存儲過程的編寫經(jīng)驗(yàn)與優(yōu)化措施進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05