1. 程式人生 > >Oracle 資料庫操作

Oracle 資料庫操作

Oracle資料庫操作的一些具體的賦權和語法應用.

[SQL語句分類]

DML 語句(資料操作語句)
Insert(用於新增欄位), Update(用於修改已有欄位), Delete, Merge

DDL 語句(資料定義語句)
Create, Alte(用於新增列)r, Drop, Truncate

DCL 語句(資料控制語言)
Grant, Revoke

事務控制語句
Commit, Rollback, Savepoint

新建表:

刪除表、新建表
drop table vims_sysset
create table vims_sysset
(
   id varchar2(36) primary key not null,--ID,主鍵
   name varchar2(20), --名稱
   address varchar2(255), --地址
   filesize varchar2(10)  --檔案大小 單位kb
);

建立序列:

create sequence sq_student
start with 1 --從1開始計數
increment by 1 --每次加1個
minvalue 1 --最小值
nomaxvalue --不設定最大值 設定最大值:maxvalue9999 
nocycle --一直累加,不迴圈

建立觸發器:

create or replace trigger student_trigger 
before insert on  student 
for each row /*對每一行都檢測是否觸發*/ 
begin
select sq_student.nextval into:new.id from sys.dual;
end;

查看錶結構

desc student;

刪除表:

drop table student;

刪除表中所有的資料(保留表結構)
delete from student;

刪除表中指定的資料
delete from student where age=20;

提交
commit;

刪除序列:

drop sequence sq_student;

刪除觸發器:

drop trigger student_trigger;

插入表資料:

insert into vims_export_template(id,name,address,filesize) values('3','name', 'address','filesize');

迴圈插入資料

declare
   i integer;
begin
   i := 1;
loop

insert into TEST_INVOICE (id, fpdm, fphm,fpje,fpse,kprq,xfsh,gfsh)
       values (i, '123123', '12312313','100.00','10.00',sysdate,'123012312',i);
      i := i + 1;
exit when i > 10000000;
end loop;
commit;
end;

建立資料表空間:

create tablespace vims_data 
logging 
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local;

建立臨時表空間:

create temporary tablespace vims_temp 
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local;

建立資料表空間:

create user ttvims identified by ttvims 
default tablespace vims_data 
temporary tablespace vims_temp;

alter user ttvims quota unlimited on vims_data ; 提示沒有許可權操作vims_data表空間,可以修改

別名:

tablename as 表別名 或 tablename 表別名
field as 別名 或 field 別名

空值:

is null 是空值
nvl(field, 'default') 將查詢出來的介面賦一個預設值

plsql查詢修改語句:
select * from student for update;

新增列:

alter table vims_biz_invoice add fsbz varchar(2) default('N'); 新增列,並賦預設值

修改列型別:

alter table vims_biz_invoice_inventorys modify wpsl varchar2(10)
alter table vims_biz_invoice modify (fsbz varchar2(2) default 'N');

刪除列:

alter table vims_biz_invoice drop column fsbz;

查詢資料庫中所有表:

select table_name from user_tables;

清空表:

truncate table table_name;

遞迴查詢:

select * from admin t connect by prior t.companyid = t.parentcompanyid start with t.companyid = ''; 

左連線查詢:

select * from test1 a left join test2 b on a.id = b.id;

右連線查詢:

select * from test1 a right join test2 b on a.id = b.id;

全連線查詢:

select * from test1 a full join test2 b on a.id = b.id; 全連線不支援(+)寫法

查詢和並列:

查詢和並列,多行轉字串 concat():字元連線函式 或 ||
select concat(xfsh,'|',xfmc) as acfield from cims_xtgl_company_gx;
select (xfsh||xfmc) as acfield from cims_xtgl_company_gx;

wm_concat函式:

wm_concat函式:可以把列值以","號分隔起來,並顯示成一行
select wm_concat(name) name from test;

把wm_concat結果裡的逗號替換成"|"
select replace(wm_concat(name),',','|') from test;

檢視字符集:

select * from nls_database_parameters; 檢視Oracle伺服器的字符集
select * from nls_instance_parameters; 檢視Oracle客戶端的字符集
select * from nls_session_parameters; 檢視session的字符集

日期轉換:

to_date: 把字串轉換為資料庫中的日期型別
to_date('2019-01-04 23:59:59', 'yyyy-MM-dd HH24:mi:ss')

to_char: 把日期或數字轉換為字串 
to_char('2019-01-04 23:59:59', 'yyyy-MM-dd HH24:mi:ss')

賦使用者許可權:

grant 
    create session, 
    create any table, 
    create any view ,
    create any index, 
    create any procedure,
    alter any table, 
    alter any procedure,
    drop any table,
    drop any view, 
    drop any index, 
    drop any procedure,
    select any table, 
    insert any table, 
    update any table, 
    delete any table
to ttvims;

賦查詢許可權:

說明:grant select on 表名 to 使用者名稱;
 例:grant select on T_REPORT_LOSS to aasi;

建立同義詞:

說明:create or replace synonym 表名 for 使用者名稱.表名;
  例:create or replace synonym tb_wx_to_user  for aasi.tb_wx_to_user;

新增表字段:

說明:alter table 表名 add (欄位名 欄位型別 預設值 是否為空);
 例:alter table sf_users add (userName varchar2(30) default '空' not null);

修改欄位的語法:

說明:alter table 表名 modify (欄位名 欄位型別 預設值 是否為空);
 例:alter table sf_InvoiceApply modify (BILLCODE number(4));

刪除欄位的語法:

說明:alter table 表名 drop column 欄位名;
 例:alter table sf_users drop column HeadPIC;

欄位的重新命名:

說明:alter table 表名 rename  column  列名 to 新列名   (其中:column是關鍵字)
 例:alter table sf_InvoiceApply rename column PIC to NEWPIC;

表的重新命名:

說明:alter table 表名 rename to  新表名
 例:alter table sf_InvoiceApply rename to  sf_New_InvoiceApply;

表添加註釋:

說明:comment on table 表名 is '註釋';
 例:comment on table sf_users is '註釋';

表字段添加註釋:

說明:comment on column 表名.欄位名 is '註釋';
 例:comment on column sf_users.name is '註釋';

條件查詢:

語法格式:
SELECT *|{[DISTINCT]<欄位名>|<表示式>[<別名>],...}
FROM <表名>
[WHERE <查詢條件>];
select * from emp where deptno=10;

如果涉及字串和日期值要用單引擴起來,字串大小寫敏感,日期值格式敏感,預設的日期格式是'DD-MON-RR'

獲取當前預設日期(yyyy-MM-dd HH24:mi:ss)
select sysdate from dual;

資料型別:

資料型別   說明
char   字元型,最大長度2000B,預設長度為1B
nchar   基於NLS國家字符集的字元型,最大長度2000B,預設為1字元
varchar2…………變長字元型,最大長度4000B
nvarchar2 基於NLS國家字符集的字元型,其餘同varchar2
varchar   同varchar2
number(m, n)……數值型,m為總位數,n為小數位數,總長度最大為38位
date………………日期型,有效表數範圍:公元前4712年1月1到公元后4712年12月31日
long   變長字元型,最大長度2GB,不支援對字串內容進行搜尋
raw   變長二進位制資料型別,最大長度2000B
long raw 變長二進位制資料型別,最大長度2GB
blob………………二進位制大物件型別,最大長度4GB
clob………………字元大物件型別,最大長度4GB
nclob   基於NLS國家字符集的字元大物件型別,最大長度4GB
bfile   在資料庫外部儲存的大型二進位制檔案大物件型別,最大長度4GB

運算子:

=   等 於
>   大 於
>=   大於等於
<   小於
<=   小於等於
<>   大等於(即不等於)
BETWEEN...AND... 界於兩值之間(包括邊界,注意:小值在前面)
IN(set)    出現在集合中
LIKE    模糊查詢(% 表示零或多個字元 like 'S%',_表示一個字元 like '_A%',對於特殊符號可使用 ESCAPE 識別符號來
        查詢 like '%\_%' escape '\'),like ‘%123%’ 通配兩頭固定中間,like ‘%123’ 通配開頭固定結尾, 
        like '123%' 通配結尾固定開頭
IS NULL    為空值
IS NOT NULL 不為空值

AND   邏輯"與"
OR   邏輯"或"
NOT   邏輯"非"
三者優先順序:NOT>AND>OR

優先順序   運算子
1   *, /
2   +, -
3   ||
4   =, >, >=, <, <=, <>
5   IS [NOT] NULL, LIKE, [NOT] IN
6   [NOT]BETWEEN..AND..
7   NOT
8   AND
9   OR

分頁:

SELECT * 
     FROM
   (select  ROWNUM r, result.*  from
      (
       查詢SQL語句...
   ) result )
     <![CDATA[ where r <= ${end} and r > ${start} ]]>

表連線
select 欄位列表 from table1, table2 where table1.column1 = table2.column2

求和:

select count(0)
  from 
  (
   查詢SQL語句...
  ) result

聚合函式:

group by 分組
select * from student group by name having count(age) > 25; 按照姓名分組查詢,並且過濾出年齡大於25歲的資料

order by 排序
select * from student order by age ASC; 預設正序排列 (DESC)降序,(ASC, 預設)升序
select deptno, empno, ename, sal from emp order by deptno, sal; 多欄位排序
select empno, ename, sal*12 annsal from emp order by annsal; 欄位別名排序
select deptno, empno, ename, sal from emp order by nulls last; NULL排序

執行順序: where -> group by -> select ... from ... -> order by.

聚合函式,日期函式,字串函式,格式化函式,型別轉換函式,加密函式,控制流函式,數學函式,系統資訊函式
Oracle 函式分為單行函式和多行函式兩大類:
單行函式
操作資料項
接受引數並返回處理結果
對每一返回行起作用
可修改資料型別
可巢狀使用

單行函式分類
字元函式
數值函式
日期函式
轉換函式
通用函式

字元函式
字元大小寫轉換函式
函式   功能   用法    返回結果
lower()   轉換為小寫 lower('John Smith') john smith
upper()   轉換為大寫 upper('John Smith') JOHN SMITH
initcap() 單詞首字母大寫 initcap('JOHN smith') John Smith

數值函式
函式   功能   用法    返回結果
abs()   取絕對值 abs(-3.14)   3.14
round()   四捨五入 round(3.1415)   3
  round(3.1415, 3) 3.142
  round(314.1592, -2) 300
trunc()   截斷   trunc(3.1415, 3) 3.141
ceil()   向上取整 ceil(3.14)   4
floor()   向下取整 floor(3.14)   3
sign()   判斷數值正負 sign(-3.14)   -1
sin()..   三角函式.. sin(3.14)   .001592653
power()   冪運算   power(4.5, 2)   20.25
sqrt()   開平方根 sqrt(9)    3
mod()   取模   mod(10, 3)   1
exp()   基數為e的冪運算 exp(1)    2.71828183
log()   對數運算 log(4, 16.0)   2
ln()   自然對數運算 ln(7)    1.94591015

日期型別
關於日期型別
Oracle內部以數字格式儲存日期和時間資訊:世紀,年,月,日,小時,分鐘,秒
預設的日期格式是DD-MON-YY
可使用sysdate函式獲取當前系統日期和時間

日期型資料的算術運算
日期型資料可以直接加或減一個數值,結果仍為日期
兩個日期型資料可以相減,結果為二者相差多少天
查詢200-12-25減1991-12-25一共有多少天
select to_date('25-12月 -09') - to_date('25-12月 -1991') from dual;

 日期函式
函式    功能      用法    返回結果
add_months(x, y) 計算在日期x基礎上增加y個月後的日期 add_months(sysdate, 2)
last_day(x)   返回日期x當月最後一天的日期   last_day(sysdate)
months_between(x, y) 返回日期x和y之間相差的月數   months_between(sysdate, hiredate)
round(x, y)   將日期x四捨五入到y所指定的   round(sysdate, 'month')
  日期單位(月或年)的第一天   round(sysdate, 'year')
trunc(x, y)   將日期x截斷到y所指定的    trunc(sysdate, 'month')
  日期單位(月或年)的第一天   trunc(sysdate, 'year')
next_day   計算指定日期x後的第一個星期幾   next_day(sysdate, '星期二')(由引數y指定)對應的日期

轉換函式
資料型別轉換包括隱含轉換和顯式轉換兩方式,建議使用顯式的資料型別轉換,確保SQL語句的可靠性
字元型別 -> 數值型別 -> to_number()
字元型別 -> 日期型別 -> to_date()
數值型別 -> 字元型別 -> to_char()
日期型別 -> 字元型別 -> to_char()

日期 -> 字串
to_char()函式可以將日期型數值轉換為字串形式
 格式:
to_char(date)     // 預設轉換為'dd-mm-yy'格式
to_char(date, 'format_model')   // 轉換為模式串指定的格式

常用日期格式符
格式符   說明    舉列
yyyy   年份    2008
mm   用數字顯示月份   02
dd   在當月中是第幾天 28
day   星期幾    星期五
am/pm   顯示上午/下午   上午
hh/hh12/hh24 小時    2:30 14:30
mi   分鐘    30
ss   秒鐘    46
說明:除上述格式符外,日期模式串中還可直接出現如下字元( - : ; / );
如要顯示其它文字字串則需使用雙引號括起來;也可在械串的開頭使用"fm"標
記以去掉數字前面的零

字串 -> 日期
to_date()函式可以將字串轉換為日期型數值形式
 格式:
to_date(char)     // 按預設格式'dd-mm-yy'進行解析
to_date(char, 'format_model')   // 按模式串指定的格式進行解析

數字
to_char()函式可以將數字值轉換為字串形式

字串 -> 數字
to_number()函式可以將字串轉換為數字值形式
 格式:
to_number(char)
to_number(char, 'format_model')

通用函式
通用函式適用於任何型別資料(包括空值):
nvl()
nvl2()
nullif()
coalesce()
case表示式
decode()
 
NVL()函式
NVL()函式用於將空值null替換為指定的預設值,適用於字元,數字,日期等型別資料
語法格式: NVL(exp1, exp2)
說明: 如果表示式exp1的值為null,則返回exp2的值,否則返回exp1的值

NVL2()函式
NVL2()函式用於實現條件表示式功能
語法格式: NVL2(exp1, exp2, exp3)
說明: 如果表示式exp1的值不為null,則返回exp2的值,否則返回exp3的值

NULLIF()函式
NULLIF()函式用於資料等價性比較並根據比較結果返回null或其中一個被比較的數值
語法格式: NULLIF(exp1, exp2)
說明: 如果表示式exp1與exp2的值相等返回null,否則返回exp1的值

COALESCE()函式
COALESCE()函式用於實現資料"接合"功能
語法格式: COALESCE(exp1, exp2, ...)
說明: 依次考察各引數表示式,遇到非null值即停止並返回該值

CASE()函式
CASE()表示式用於實現多路分支結構
語法格式:
CASE exp1 when comparison_exp1 then return_exp1
  [when comparison_exp2 then return_exp2
  when comparison_expn then return_expn
   else esle_exp]
  end [TempName]
說明: 如果 exp1 是 comparison_exp1 的時候,就返回 return_exp1
   [ comparison_exp2 的時候,就返回 return_exp2
   comparison_expn 的時候,就返回 return_expn
   else 就返回 esle_exp ]
   end [別名]

DECODE()函式
和CASE()表示式類似,DECODE()函式也用於實現多路分支結構
語法格式:
decode(col|expression, search1, result1
   [, search2, result2, ...,]
   [, default])
說明: 如果 col|expression 是 search1 的時候,就返回 result1
   [ search2 的時候,就返回 result2, ...]
   [, default])
   [別名]

函式巢狀
單行孫數可以巢狀使用, 巢狀層次無限制
巢狀函式的執行順序是由內到外
select empno, lpad(initcap(trim(ename)), 10, '*') name, job, sal from emp;
 
AVG(DISTINCT|ALL)
ALL表示對所有的值求平均值,DISTINCT只對不同的值求平均值
SELECT AVG(SAL) FROM SCOTT.EMP;
SELECT AVG(DISTINCT SAL) FROM SCOTT.EMP;

MAX(DISTINCT|ALL)
求最大值,ALL表示對所有的值求最大值,DISTINCT表示對不同的值求最大值,相同的只取一次
(加不加查詢結果一致,不知DISTINCT有什麼用途,不同於AVG等聚合函式)
SELECT MAX(DISTINCT SAL) FROM SCOTT.EMP;
SELECT MAX(SAL) FROM SCOTT.EMP

MIN(DISTINCT|ALL)
求最小值,ALL表示對所有的值求最小值,DISTINCT表示對不同的值求最小值,相同的只取一次
SELECT MIN(SAL) FROM SCOTT.EMP;
SELECT MIN(DISTINCT SAL) FROM SCOTT.EMP;

STDDEV(distinct|all)
求標準差,ALL表示對所有的值求標準差,DISTINCT表示只對不同的值求標準差
SELECT STDDEV(SAL) FROM SCOTT.EMP;
SELECT STDDEV(DISTINCT SAL) FROM SCOTT.EMP;

VARIANCE(DISTINCT|ALL)
求協方差  ALL表示對所有的值求協方差,DISTINCT表示只對不同的值求協方差
SELECT VARIANCE(SAL) FROM SCOTT.EMP;
SELECT VARIANCE(DISTINCT SAL) FROM SCOTT.EMP;

SUM(DISTINCT|ALL)
求和  ALL表示對所有值求和,DISTINCT表示只對不同值求和(相同值只取一次)
SELECT SUM(SAL) FROM SCOTT.EMP;
SELECT SUM(DISTINCT SAL) FROM SCOTT.EMP;

COUNT(DISTINCT|ALL)
求記錄、資料個數。 ALL對所有記錄,陣列做統計, DISTINCT只對不同值統計(相同值只取一次)
SELECT COUNT(SAL) FROM SCOTT.EMP;
SELECT COUNT(DISTINCT SAL) FROM SCOTT.EMP;  
 
MEDIAN
求中位數
SELECT MEDIAN(SAL) FROM SCOTT.EMP;
SELECT MEDIAN(DISTINCT SAL) FROM SCOTT.EMP;  --錯誤:DISTINCT 選項在此函式中禁用

VARIANCE(DISTINCT|ALL)
統計資料表選中行x列的方差
select VARIANCE(distinct sal),VARIANCE(all sal),VARIANCE(sal) from table3; 

distinct
去除重複資料
select distinct deptno from emp;
select distinct deptno, job from emp;

Using 子句
如果不希望參照被連線表的所有同名列進行等值連線,自然連線將無法滿足
要求,可以在連線時使用Using子句來設定用於等值連線的列(參照列)名.
select empno, ename, sal, deptno, dname from emp join dept using(deptno);
*不允許在參照列上使用表名或者別名作為字首

On 子句
如果要參照非同名的列進行等值連線,或想設定任意的連線條件,可以使用 ON 子句
select empno, ename, sal, emp.deptno, dname from emp join dept on(emp.deptno = dept.deptno);
* 必須加上表名字首(emp.deptno)

子查詢(Sub Query)
select * from emp where sal > (select sal from emp where empno = 7654);

轉載請註明出處!