欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle數(shù)據(jù)庫常用語句總結(jié)大全

 更新時(shí)間:2024年09月28日 10:17:50   作者:蘇生Susheng  
SQL是結(jié)構(gòu)化查詢語言,用于管理關(guān)系型數(shù)據(jù)庫系統(tǒng),本指南涵蓋了創(chuàng)建和刪除數(shù)據(jù)庫、表以及其他高級表操作如增加、修改、刪除字段,還介紹了主鍵、索引、視圖操作和數(shù)據(jù)DML操作,需要的朋友可以參考下

創(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)文章

最新評論