一篇讓Java程序猿隨時可以翻看的Oracle總結
前言:Oracle學習也有十幾天了,但是呢,接下來還要學習許多其他的東西,並不能提步不前,所以在此總結了以下Oracle中常用的命令和語句,沒有語法都是實例,以便以后工作的時候隨時翻看,畢竟是自己的東西,一看就懂。
有關的語句和操作基本都是按照實戰中的順序來總結的,比如創建用戶,建表,序列初始化,插入數據的順序呢。
這篇文章的基表是大家最為熟知的Scott用戶下的emp員工表,dept部門表以及salgrade薪水等級表,一切的語句都是圍繞它寫的。
下面來看一下Oracle中常用的操作都有哪些吧!
一.用戶的有關操作。
- 創建用戶
create user scott identified by 123456;
- 給用戶分配權限
grant connect,resource to scott; grant create view to scott; grant create synonym to scott;
- 撤銷用戶權限
revoke connect,resource from scott; revoke create view from scott; revoke create synonym from scott;
- 刪除用戶
drop user scott cascade;
- 修改用戶密碼
alter user scott identified by 123456;--命令修改 conn scott/123456 password;--命令可視化修改1 connect scott/123456 password;--命令可視化修改2
- 設置用戶是否鎖定
alter user scott account lock; alter user scott account unlock;
二.表空間的有關操作。
- 創建表空間
create tablespace mysapce datafile 'D:a.ora' size 10M--絕對路徑和大小 extent management local uniform size 1M;--每個分區的大小
- 擴展表空間
alter tablespace mysapce add datafile 'D:b.ora' size 10M;
- 為ORACLE對象指定表空間
create user space_text identified by 123456 account unlock default tablespace mysapce; --創建表、索引也可以指定表空間;一旦指定,表空間無法修改。
- 刪除表空間
drop tablespace mysapce;
三.DDL的有關操作。
- 表table
--創建員工表 CREATE TABLE EMP( EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR VARCHAR(10), --上司 HIREDATE DATE, --入職日期 SAL NUMBER(7,2), --薪水 COMM NUMBER(7,2), --津貼 DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT );
--創建部門表 CREATE TABLE DEPT( DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14) , LOC VARCHAR2(13) --地址 );
--創建工資等級表 CREATE TABLE SALGRADE( GRADE NUMBER, --等級 LOSAL NUMBER, --等級中最低的薪水 HISAL NUMBER --等級中最高的薪水 );
- 視圖view
--為emp表的empno,ename,sal和dept表的dname和salgrade表的grade創建一個視圖 create view emp_dept_salgrade as select e.empno,e.ename,e.sal,d.dname,s.grade from emp e inner join dept d using(deptno) inner join salgrade s on e.sal between s.losal and s.hisal; select * from emp_dept_salgrade;--通過視圖查詢
- 序列sequence
--為員工表的EMPNO創建一個序列 create sequence emp_empno_seq start with 1001 increment by 1 nomaxvalue nocycle cache 10; select emp_empno_seq.currval from dual;查詢序列的當前值 select emp_empno_seq.nextval from dual;查詢序列的下一個值
- 同義詞synonym
--為視圖emp_dept_salgrade創建同義詞
create synonym eds for emp_dept_salgrade;
select * from eds;通過視圖的同義詞來查詢視圖中的數據
- 觸發器trigger
--為員工表的empno創建一個自動插入的觸發器
create or replace trigger emp_empno_tri
before insert on emp
for each row
begin
:new.empno:=emp_empno_seq.nextval;--語句級(for each row)觸發器里面可以:new.列名來給進行操作。
end;
- 存儲過程procedure
--創建一個可以控制行數的乘法表的過程。 create or replace procedure nine_nine(nine_line in number) as begin for i in 1..nine_line loop for j in 1..i loop dbms_output.put(i||'*'||j||'='||i*j||' '); end loop; dbms_output.put_line(''); end loop; end; --調用這個乘法過程 set serveroutput on; execute nine_nine(9);
- 存儲函數function
--創建一個求1!+2!+..+20!的值的存儲函數 create or replace function one_tw return number as value_sum number:=0; value_loop number:=1; begin for i in 1..20 loop value_loop:=value_loop*i; value_sum:=value_sum+value_loop; end loop; return value_sum; end; select one_tw() from dual;--調用函數 備注:存儲函數的調用可以放在表達式的位置,即表達式在哪里成立,它就可以在哪里調用。
- 事務rollback、commit、savepoint
三.常用的結構查詢。
- 查詢用戶和用戶的信息
select username,user_id,password,default_tablespace from dba_users; select * from dba_users;
- 查詢用戶所擁有的角色
select * from user_role_privs;--系統用戶 select * from session_roles;--普通用戶
- 查詢用戶的權限
select * from user_sys_privs;普通用戶和系統用戶都可以
- 查看表中列的字符長度和字節長度
select length(ename),lengthb(ename) from emp;
- 查詢表的相關信息
SELECT table_name, tablespace_name, temporary FROM user_tables;
- 查詢表中列的相關信息
SELECT table_name,column_name, data_type, data_length, data_precision, data_scale FROM user_tab_columns;
- 對表進行重命名
rename student to mystudent;
- 給表添加備注
comment on table student is '我的練習';
- 給表中列添加備注
comment on column student.sno is '學生號';
- 查看表和視圖的備注信息
select * from user_tab_comments where table_name='STUDENT';
- 查看表和視圖中列的備注信息
select * from user_col_comments where table_name='STUDENT';
- 查看表的結構
describe student;
- 截斷表
truncate table student;
- 使用連接運算符
select empno||ename as employees from emp; select concat(empno,ename) as employees from emp;
- 查看表的約束信息
select * from user_constraints where table_name='EMP';
- 查看列的約束信息
select * from user_cons_columns where column_name='SNO';
- 查看序列的信息
select * from user_sequences where sequence_name='EMP_EMPNO_SEQ';
- 查看索引的信息
select * from user_indexes;
- 查看視圖的信息
select * from user_views;
- 查看同義詞
select * from user_synonyms;
- 查看觸發器
select * from user_triggers;
- 查看存儲過程
select * from user_procedures;
四.DML的有關操作。
- 插入數據insert
--dept--
INSERT INTO DEPT
select 10,'ACCOUNTING','NEW YORK' from dual
union
select 20,'RESEARCH','DALLAS' from dual
union
select 30,'SALES','CHICAGO' from dual
union
select 40,'OPERATIONS','BOSTON' from dual;
commit; --使用Oracle中的多行插入方法,關鍵字union,select自己想要的數據,與dual偽表組建一個完整的結構。
--emp--
INSERT INTO EMP(ename,job,mgr,hiredate,sal,comm,deptno)
select 'SMITH','CLERK',1009,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20 from dual
union
select 'ALLEN','SALESMAN',1006,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30 from dual
union
select 'WARD','SALESMAN',1006,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30 from dual
union
select 'JONES','MANAGER',1009,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20 from dual
union
select 'MARTIN','SALESMAN',1006,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30 from dual
union
select 'BLAKE','MANAGER',1009,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30 from dual
union
select 'CLARK','MANAGER',1009,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10 from dual
union
select 'SCOTT','ANALYST',1004,to_date('13-10-87','dd-mm-rr')-85,3000,NULL,20 from dual
union
select 'KING','PRESIDENT',1007,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10 from dual
union
select 'TURNER','SALESMAN',1006,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30 from dual
union
select 'ADAMS','CLERK',1009,to_date('13-10-87', 'dd-mm-rr')-51,1100,NULL,20 from dual
union
select 'JAMES','CLERK',1009,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30 from dual
union
select 'FORD','ANALYST',1004,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20 from dual
union
select 'MILLER','CLERK',1004,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10 from dual;
commit; --這里使用了觸發器emp_empno_tri來自動插入emp表的empno員工編號
--salgrade-- INSERT INTO SALGRADE VALUES (1,700,1200); INSERT INTO SALGRADE VALUES (2,1200,1400); INSERT INTO SALGRADE VALUES (3,1400,2000); INSERT INTO SALGRADE VALUES (4,2000,3000); INSERT INTO SALGRADE VALUES (5,3000,9999); commit;
- 更新數據update
update emp set sal=3000 where empno=1004;
- 刪除數據delete
delete from emp where empno=1004;--from可以省略
- 查詢數據select
查詢數據是DML語句中最關鍵的部分,也是最難的部分,在這里有許多圍繞scott用戶的實例,都是稍微復雜一點的查詢,簡單的就沒必要寫了。
1.最常用。
select * from emp; select * from dept; select * from salgrade;
2.內部連接。
2-1.查詢每個員工所在的部門,使用where連接.
select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
2-2.inner join on連接.
select e.empno,e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;
2-3.inner join using連接.
select e.empno,e.ename,d.dname from emp e inner join dept d using(deptno);
3.外部連接。
3-1.左外連接:例如:查詢出部門的員工的情況(顯示所有部門).
select e.ename,d.dname from emp e left join dept d using(deptno);
3-2.右外連接用(+).
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno(+);
3-3.右外連接:例如:查詢出所有的員工的部門情況(顯示了所有員工).
select e.ename,d.dname from emp e right join dept d using(deptno);
3-4.右外連接用(+).
select e.ename,d.dname from emp e,dept d where e.deptno(+)=d.deptno;
4.自連接。
4-1.查詢出員工及他的上級。
select a.ename as 員工,b.ename as 上級 from emp a ,emp b where a.mgr=b.empno; select a.ename as 上級,b.ename as 上級 from emp a inner join emp b on a.mgr=b.empno;
5.子查詢。
5-1.查詢工資高於平均工資的員工信息.
select * from emp where sal>(select avg(sal) from emp);
5-2.使用ANY查詢任意滿足工資低於最低檔工資的員工信息.
select * from emp where sal<any(select losal from salgrade);
5-3.查詢所有員工所屬部門.
select dname from (select distinct dname from dept);
5-4.查詢滿足大於每個部門的最低工資的員工信息.
select * from emp where sal>all(select min(sal) from emp group by deptno);
5-5.查詢出每個部門中,高出本部門平均工資的員工的雇員號和姓名.
select empno as 雇員號,ename as 姓名 from emp outer where sal> (select avg(sal) from emp inner where inner.deptno=outer.deptno );
5-6.查詢不在部門10的員工信息:注意子查詢中的1,由於只關心子查詢是否返回TRUE值,使用1可以提高查詢的效率.
5-6.1.EXISTS子查詢效率高於IN子查詢.
select * from emp a where not exists (select 1 from emp b where a.deptno=10);
5-6.2.in的效率低,但比較好理解.
select * from emp where deptno not in 10;
5-7.查詢emp表中可以管理別的員工的員工.
select ename from emp a where exists(select ename from emp b where a.empno=b.mgr);
5-8.刪除中部門重復行.
delete emp where rowid not in (select min(rowid) from emp group by deptno);
5-9.查找emp表第6-10條記錄.
select * from(select rownum m,ename,sal,deptno from emp where rownum<=10) where m>5;