一、oracle安裝、熟悉sqlplus基本操作、scott賬戶。
1.安裝時啟用樣本數據庫實例
2.賬戶解鎖
普通用戶scott/tiger
普通管理員system/manager
超級管理員sys/change_on_install
3.oralce服務
監聽服務-客戶端想連接數據庫,此服務必須打開。
OracleServie命名服務-數據庫的主服務
4.sqlplus主機字符串:如果一個電腦上有多個數據庫時,則要在此處輸入數據庫的名稱。如果不輸,表示默認服務。
5.設置環境變量 select * from emp;
此時原本應該一行顯示的數據沒有按一行顯示,顯示比較混亂。
如果要使用sqlplus,需設置環境設置。
設置每行顯示的長度:
set linesize 300;
修改每頁長度:設置標題不重復(oracle采用一頁一頁的方式輸出規則):
set pagesize 30;
6.sqlplus命令 clear scr;--清屏
1).在sqlplus中沒法修改輸入的內容,一般采用本機記事本程序進行編譯。
在命令窗口中輸入“ed 文件名”即可。選擇創建文件。
@文件名 可以執行。 @文件路徑[\]文件名 也針對於本地文件。
執行時要指定文件的路徑。如果文件名為“*.sql”,可省略后綴。
sql> ed a; sql> @a;
--導出數據Demo --注:sqlplus執行文件中的sql語句不能超過2500個字符。 SET TRIMSPOOL ON SET HEADING OFF SET NEWPAGE NONE SET SPACE 0 set feedback off SET PAGESIZE 0 SET TRIMOUT ON SET LINESIZE 2500 SET ECHO OFF SPOOL e:\dg_201204.txt select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_0 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_1 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_2 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_3 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_4 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_5 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_6 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_7 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_8 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_9 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%'; SPOOL off;
2).sqlplus中也可以使用其他用戶連接。
conn sys/wean as sysdba
--超級管理員必須用as sysdba
管理員權限下查詢不到select * from emp;如果一定要訪問,必須加上用戶名“scott.emp”;
select * from scott.emp;
emp是scott用戶下的表。
3).顯示當前正在連接的用戶是哪一個:
show user;
4).獲取數據庫中全部表名稱:
select * from tab;--用scott賬戶。
5).查看表結構:
desc emp; set linesize 100;
6).NUMBER(7,2)--表示小數位2位,整數位5位,總數為7位。
7).重復執行上一條語句的操作:"/"。
7.scott下的幾張表
1).雇員表:emp
EMPNO:雇員編號 NUMBER(4) EMPNAME:雇員姓名 VARCHAR2(10) JOB:職位 VARCHAR2(9) MGR:雇員領導編號 NUMBER(4) HIREDATE:雇佣日期 DATE SAL:月薪 NUMBER(7,2) COMM:獎金、佣金 NUMBER(7,2) DEPTNO:部門編號 NUMBER(2)
2).部門表:dept
DEPTNO 部門編號 NOT NULL NUMBER(2) DNAME 部門名稱 VARCHAR2(14) LOC 部門位置 VARCHAR2(13)
3).工資表:salgrade
GRADE 等級名稱 NUMBER LOSAL 此等級的最低工資 NUMBER HISAL 此等級的最高工資 NUMBER
4).獎金表:bonus
ENAME 雇員姓名 VARCHAR2(10) JOB 雇員工作 VARCHAR2(9) SAL 雇員工資 NUMBER COMM 雇員獎金 NUMBER
二、Oracle常用查詢關鍵字
1.distinct:如果查詢多列,必須保證所有列的數據完全重復。
2.||:字符串連接操作,"'":表示固定信息。
select '編號是:' || empno || '的雇員,姓名是:' || ename || ',工作是:' || job || '。' from emp;
3.四則運算,+、-、*、/,先乘除后加減。
select ename,sal*12 from emp;
4.取別名--避免中文別名。
select ename,sal*12 income from emp;
5.查詢是否為空的列的數據,“is not null”,“is null”
select * from emp where comm is not null;
6.查詢條件並且“and”,或者“or”
select * from emp where comm is not null and ename='WARD';
select * from emp where comm is not null or ename='WARD';
7.取反“not”。
select * from emp where not(comm is not null and ename='WARD');
8.指定過濾范圍“between and”--等價於sal>=1500 and sal<=3000。
select * from emp where sal between 1500 and 3000;
between and 支持查詢日期,oracle date格式“20-2月 -81”
select * from emp where hiredate between '1-1月 -81' and '31-12月 -81';
9.oracle中查詢字符串時,對大小寫敏感。
10.范圍語法“in(值1,值2,值3...)”,“not in(值1,值2,值3...)”。
11.模糊查詢“like '%M%'”。
"%"表示任意長度的內容;
"_"表示一個長度的內容。
三、函數,各種數據庫中最大的區別是函數的語法。
1.對查詢的結果排序order by(列1,列2)、ASC默認-升序,DESC-降序。
2.oralce單行函數 funtion_name(column|exception[arg1,arg2...]);
分類:
1).字符函數
--將小寫字符變成大寫字符 select * from emp where ename=upper('smith');
--變成小寫 select lower('hello world') from dual;
--將雇員姓名變成首字母大寫 select initcap(ename) from emp;
--字符串除了使用||,還可以使用concat() select concat('hello','world') from dual;
SQL> --字符串截取 SQL> --字符串長度 SQL> --字符串內容替換 SQL> select substr('hello',1,3) 截取字符串, 2 length('hello') 字符串長度, 3 replace('hello','1','x') 字符串替換 4 from dual; 截 字符串長度 字符 --- ---------- ----- hel 5 hello --substr函數中注意:oracle中substr的截取點是從0開始還是從1開始? --從0或1開始效果都一樣,因為oracle比較智能。
--顯示所有雇員的姓名及姓名的后三個字符。 SQL> select ename,substr(ename,length(ename)-2) from emp; ENAME SUBSTR(ENAME,LENGTH( ---------- -------------------- SMITH ITH ALLEN LEN --substr函數中可以采用倒着截取的方式,只要位置是負數表示倒着就行。與上面結果一樣。 SQL> select ename,substr(ename,-3,3) from emp;
2).數值函數
--四舍五入:round(數字) SQL> select round(189.536) from dual; ROUND(189.536) -------------- 190
--保留兩位小數 SQL> select round(189.536,2) from dual; ROUND(189.536,2) ---------------- 189.54
--對整數進行四舍五入 SQL> select round(189.536,-2) from dual; ROUND(189.536,-2) ----------------- 200
--截斷小數點:trunc(數字) SQL> select trunc(189.536) from dual; TRUNC(189.536) -------------- 189
--指定小數點后的保留位數,保留2位 SQL> select trunc(189.536,2) from dual; TRUNC(189.536,2) ---------------- 189.53
--指定小數點前的保留位數,保留2位 SQL> select trunc(189.536,-2) from dual; TRUNC(189.536,-2) ----------------- 100
--取余數(取模):mod(數字) SQL> select mod(10,3) from dual; MOD(10,3) ---------- 1
3).日期函數
日期-數字=日期;
日期+數字=日期;
日期-日期=數字(天數);
--獲取當前日期 SQL> select sysdate from dual; SYSDATE -------------- 18-5月 -12
--獲取被雇佣的星期數 SQL> select empno,ename,round((sysdate-hiredate)/7) from emp; EMPNO ENAME ROUND((SYSDATE-HIREDATE)/7) ---------- ---------- --------------------------- 7369 SMITH 1639 7499 ALLEN 1630
--給定日期范圍的月數:months_between() SQL> select empno,ename,round(months_between(sysdate,hiredate)) from emp; EMPNO ENAME ROUND(MONTHS_BETWEEN(SYSDATE,HIREDATE)) ---------- ---------- --------------------------------------- 7369 SMITH 377 7499 ALLEN 375
--求出指定日期上加上指定月數的日期:add_month() SQL> select add_months(sysdate,4) from dual; ADD_MONTHS(SYS -------------- 18-9月 -12
--下一個的今天是哪一個日期:next_day() --下一個星期一 SQL> select next_day(sysdate,'星期一') from dual; NEXT_DAY(SYSDA -------------- 21-5月 -12
--給定日期的最后一個日期:last_day() --本月的最后一天 SQL> select last_day(sysdate) from dual; LAST_DAY(SYSDA -------------- 31-5月 -12
4).轉換函數
--to_char() --轉換日期 SQL> select empno,ename,to_char(hiredate,'yyyy-mm-dd') from emp; EMPNO ENAME TO_CHAR(HI ---------- ---------- ---------- 7369 SMITH 1980-12-17 7499 ALLEN 1981-02-20
--去掉前導0 SQL> select empno,ename,to_char(hiredate,'fmyyyy-mm-dd') from emp; EMPNO ENAME TO_CHAR(HI ---------- ---------- ---------- 7369 SMITH 1980-12-17 7499 ALLEN 1981-2-20
--用在數字上 --數字中以“,”分割進行格式化 SQL> select empno,ename,to_char(sal,'L99,999') from emp; EMPNO ENAME TO_CHAR ---------- ---------- ------- 7369 SMITH 800 7499 ALLEN 1,600
--表示明確的區域 $:美元;L:本地金額顯示。 select empno,ename,to_char(sal,'L99,999') from emp; EMPNO ENAME TO_CHAR(SAL,'L99, ------ ---------- ----------------- 7369 SMITH ¥800
--to_number() SQL> select to_number('123')+to_number('123') from dual; TO_NUMBER('123')+TO_NUMBER('123') --------------------------------- 246
--to_date() --將字符串轉換成date類型 SQL> select to_date('2009-12-01','yyyy-mm-dd') from dual; TO_DATE('2009- -------------- 01-12月-09
5).通用函數
--查詢所有雇員的年薪 SQL> select empno,ename,(sal+comm)*12 from emp; EMPNO ENAME (SAL+COMM)*12 ---------- ---------- ------------- 7369 SMITH 7499 ALLEN 22800 7521 WARD 21000 7566 JONES 7654 MARTIN 31800 --之所有出現這種情況,是因為有些雇員的獎金為NULL,此情況可以改查詢語句: --nvl();將制定的空值按0顯示,不為空按默認顯示。 SQL> select empno,ename,(sal+nvl(comm,0))*12 from emp; EMPNO ENAME (SAL+NVL(COMM,0))*12 ---------- ---------- -------------------- 7369 SMITH 9600 7499 ALLEN 22800 7521 WARD 21000 7566 JONES 35700 7654 MARTIN 31800
--decode();類似於if...elseif...elseif...else... SQL> select decode(1,1,'內容是1',2,'內容是2',3,'內容是3') from dual; DECODE( ------- 內容是1 --雇員
四、多表連接查詢
1.在使用多表查詢的時候,會產生笛卡爾積(兩張表的記錄會交錯出現),如果兩張表的數據越多,笛卡爾積越大。
因此多表查詢在開發中不建議過多使用。
如果需要去掉笛卡爾積,需要用字段進行關聯的操作。
2.連接查詢
select e.empno,e.ename,d.deptno,d.dname,d.loc from emp e,dept d --右連接 where e.deptno(+)=d.deptno; select e.empno,e.ename,d.deptno,d.dname,d.loc from emp e,dept d --左連接 where e.deptno=d.deptno(+);
3.sql:1999
1).交叉連接:cross join,產生笛卡爾積。
select e.empno,e.ename,d.deptno,d.dname,d.loc from emp e cross join dept d;
2).自然連接:natural join,自動匹配。
select * from emp natural join dept;
3).指定連接:using子句,直接指定關聯的列。
select * from emp e join dept d using(deptno);
4).自定連接:on子句,用戶自己指定關聯的條件。
select * from emp e join dept d on(e.deptno=d.deptno);
5).左連接、右連接:left outer join,right outer join。
select * from emp e right outer join dept d on(e.deptno=d.deptno);
五、組函數、分組查詢、子查詢。
1.組函數 count(); max(); min(); avg(); sum();
2.分組查詢group by
3.子查詢的三種查詢操作符號
--"in" --求出每個門本的最低工資的雇員信息 select * from emp where sal in (select min(sal) from emp group by deptno); --"=any",與"in"一樣 select * from emp where sal =any (select min(sal) from emp group by deptno); --">any",比里面最小的值要大 select * from emp where sal >any (select min(sal) from emp group by deptno); --"<any",比里面最大的值要小 select * from emp where sal >any (select min(sal) from emp group by deptno); --">all",比里面最大的值要大 select * from emp where sal >all (select min(sal) from emp group by deptno); --"<all",比里面最小的值要小 select * from emp where sal <all (select min(sal) from emp group by deptno);
4.子查詢可以用where后、from后、having后、select列中。
六、事務處理。
1.提交事務:commit;
2.回滾事務:rollback;
3.oracle事務處理的死鎖。
七.表的管理。
1.oracle中常用數據類型
No 數據類型 描述
1 varchar、varchar2 字符串,有限長度,為255
2 number number(n):長度為n的整數;number(m,n):小數為n,整數長度為m-n,也可以使用float;
3 date 日期類型
4 clob 大對象,大文本數據,一般可以存放4G文本
5 blod 大對象,表示二進制數據,最大可以存放4G,如電影、歌曲、圖片...
2.表的創建
--語法 create table 表名稱( 字段名稱1 字段類型 [default 默認值], 字段名稱2 字段類型 [default 默認值], ... 字段名稱n 字段類型 [default 默認值] ); --demo create table person( pid varchar2(18), name varchar2(18), age varchar2(18), birthday varchar2(18), sex varchar(2) default '男' );
3.表的復制
--復制表結構及數據 create table 表名稱 as (子查詢); --復制表結構:加上where 永遠不成立的條件 create table 表名稱 as (子查詢) where 1=2;
4.表的刪除
--語法 drop table 表名稱; --demo drop table person;
5.表結構的修改(數據庫程序開發中,很少有修改表結構,IBM DB2無此語法)
--增加列語法 alter table 表名稱 add ( 列名稱1 列類型 default 默認值, 列名稱2 列類型 default 默認值, ... 列名稱n 列類型 default 默認值 ); --demo alter table person add ( address varchar(30) default '暫無地址' );
--修改列語法 --注意:如果原數據過大,修改后的類型過小,無法修改。 alter table 表名稱 modify ( 列名稱 列類型 default 默認值 ); --demo alter table person modify ( name varchar(20) default '無名氏' );
6.表的重命名(僅限Oralce中使用)
--語法 rename 舊表名稱 to 新表名稱; --demo rename person to t_person;
7.截斷表(清空表數據)(僅限Oralce中使用)
--如果將person表中的一條數據delete掉,可以通過rollback回滾; --如果要清空一張表的數據,但不需要回滾,可以立刻釋放資源,需要用到截斷表。 --語法 truncate table 表名稱; --demo truncate table t_person;
八.約束(保證數據庫中數據的完整性)
1.約束的分類(5)
主鍵約束:唯一的標識,本身不能為空(身份證號);
唯一約束:一張表中,只能建立一個主鍵約束,若其他列不希望重復,可以使用唯一約束;
檢查約束:檢查一個列的內容是否合法;
非空約束:字段內容不能為空;
外鍵約束:兩張表中進行關聯的約束。
2.約束的創建
1).primary key
--方式1 create table person ( pid varchar2(18) primary key, name varchar2(200), age number(3), birthdaty date, sex varchar2(2) default '男' ); --方式2 create table person ( pid varchar2(18), name varchar2(200), age number(3), birthdaty date, sex varchar2(2) default '男', constraint person_pid_pk primary key(pid) );
2).not null
create table person ( pid varchar2(18) primary key, name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男' );
3).unique
--方式1 create table person ( pid varchar2(18) primary key, name varchar2(200) unique not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男' ); --方式2 create table person ( pid varchar2(18), name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男', constraint person_pid_pk primary key(pid), constraint person_name_uk unique(name) );
4).check
--方式1 create table person ( pid varchar2(18) primary key, name varchar2(200) unique not null, age number(3) not null check(age between 0 and 150), birthdaty date, sex varchar2(2) default '男' check(sex in ('男','女')) ); --方式2 create table person ( pid varchar2(18), name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男', constraint person_pid_pk primary key(pid), constraint person_name_uk unique(name), constraint person_age_ck check(age between 0 and 150), constraint person_sex_ck check(sex in ('男','女')) );
5).foreign key
--刪除子表再刪除父表 --可以使用級聯刪除方式強制刪除表 drop table person cascade constraint;
--主外鍵使用 create table person ( pid varchar2(18), name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男', constraint person_pid_pk primary key(pid), constraint person_name_uk unique(name), constraint person_age_ck check(age between 0 and 150), constraint person_sex_ck check(sex in ('男','女')) ); create table book ( bid varchar2(2) primary key not null, bname varchar2(30) not null, bprice number(5,2) not null, pid varchar2(18), constraint person_book_pid_fk foreign key(bid) references person(pid) );
--級聯刪除,當主表中的數據刪除時,子表中的數據自動刪除 create table person ( pid varchar2(18), name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男', constraint person_pid_pk primary key(pid), constraint person_name_uk unique(name), constraint person_age_ck check(age between 0 and 150), constraint person_sex_ck check(sex in ('男','女')) ); create table book ( bid varchar2(2) primary key not null, bname varchar2(30) not null, bprice number(5,2) not null, pid varchar2(18), constraint person_book_pid_fk foreign key(bid) references person(pid) on delete cascade );
3.約束的修改
--語法 alter table 表名稱 add constraint 約束名稱 約束類型(約束字段) drop table person cascade constraint; create table person ( pid varchar2(18), name varchar2(200) not null, age number(3) not null, birthdaty date, sex varchar2(2) default '男' ); alter table person add constraint person_pid_pk primary key(pid); alter table person add constraint person_name_uk unique(name); alter table person add constraint person_age_ck check(age between 0 and 150); alter table person add constraint person_sex_ck check(sex in ('男','女')); drop table book; create table book ( bid varchar2(2) not null, bname varchar2(30) not null, bprice number(5,2) not null, pid varchar2(18) ); alter table book add constraint book_bid_pk primary key(bid); alter table book add constraint person_book_pid_fk foreign key(bid) references person(pid) on delete cascade;
4.約束的刪除
alter table book drop constraint book_bid_pk;
5.偽類rownum
--查詢5-10條記錄 select * from (select rownum rn,empno from emp where rownum<=20) t1 where t1.rn>=5 and t1.rn<=10;
九、同義詞
select * from scott.emp;
十、少用的用法
基礎 數據查詢語言 SELECT 數據操作語言 INSERT,DELETE,UPDATE 事務控制語言 COMMIT,ROLLBACK,SAVEPOINT 數據定義語言 CREATE,ALTER,DROP 數據控制語言 GRANT,REVOKE 一.SELECT 1.DATE類型數據默認顯示格式 DD-MON-YY TO_CHAR(,'YYYY-MM-DD') 按指定格式顯示 SQL> SELECT ename,hiredate FROM emp WHERE rownum<=1; ENAME HIREDATE ---------- -------------- SMITH 17-12月-80 SQL> SELECT ename,TO_CHAR(hiredate,'YYYY-MM-DD') FROM emp WHERE rownum<=1; ENAME TO_CHAR ---------- ---------- SMITH 1980-12-17 SQL> SELECT ename,TO_CHAR(hiredate,'YYYY-MM-DD hh-mm-ss') FROM emp WHERE rownum<=1; ENAME TO_CHAR ---------- ------------------- SMITH 1980-12-17 12-12-00 2.處理NULL,NULL表示未知值,既不是空,也不是0 NVL(expr1,expr2) NVL2(expr1,expr2,expr3) 9i后新特性 SQL> SELECT ename,sal,comm,sal+nvl(comm,0) as "月收入" FROM emp WHERE rownum<=3; ENAME SAL COMM 月收入 ---------- ---------- ---------- ---------- SMITH 800 800 ALLEN 1600 300 1900 WARD 1250 500 1750 SQL> SELECT ename,sal,comm,nvl2(comm,comm+sal,sal) as "月收入" FROM emp WHERE rownum<=3; ENAME SAL COMM 月收入 ---------- ---------- ---------- ---------- SMITH 800 800 ALLEN 1600 300 1900 WARD 1250 500 1750 3.使用多列排序 第一列中有重復的,第二列排序第一列中重復的數據,以此類推 SQL> SELECT ename,sal,comm FROM emp WHERE deptno=30 2 ORDER BY sal ASC,comm DESC; ENAME SAL COMM ---------- ---------- ---------- JAMES 950 MARTIN 1250 1400 WARD 1250 500 TURNER 1500 0 ALLEN 1600 300 BLAKE 2850 已選擇6行。 SQL> SELECT ename,sal,comm FROM emp WHERE deptno=30 2 ORDER BY sal ASC; ENAME SAL COMM ---------- ---------- ---------- JAMES 950 WARD 1250 500 MARTIN 1250 1400 TURNER 1500 0 ALLEN 1600 300 BLAKE 2850 已選擇6行。 4.使用非選擇列排序 SQL> SELECT ename FROM emp WHERE rownum<=5 ORDER BY sal; ENAME ---------- SMITH WARD MARTIN ALLEN JONES 5.使用列別名排序 SQL> SELECT ename,sal*12 year FROM emp WHERE rownum<=5 ORDER BY year; ENAME YEAR ---------- ---------- SMITH 9600 WARD 15000 MARTIN 15000 ALLEN 19200 JONES 35700 6.使用列位置排序 SQL> SELECT ename,sal*12 year FROM emp WHERE rownum<=5 ORDER BY 2 DESC; ENAME YEAR ---------- ---------- JONES 35700 ALLEN 19200 MARTIN 15000 WARD 15000 SMITH 9600 7.使用CASE表達式 SQL> SELECT ename,sal,CASE WHEN sal>3000 THEN 3 WHEN sal>2000 THEN 2 ELSE 1 END grade 2 FROM emp 3 WHERE deptno=10; ENAME SAL GRADE ---------- --------- ---------- CLARK 2450.00 2 KING 5000.00 3 MILLER 1300.00 1 8.查詢歷史記錄 SQL> SELECT ename,sal 2 FROM emp 3 AS OF TIMESTAMP to_timestamp('2012-07-27 15:21:00','YYYY-MM-DD HH24:MI:SS') 4 WHERE ename='CLARK'; ENAME SAL ---------- ---------- CLARK 2450 9.使用WITH子句重用子查詢 SQL> WITH summary AS( 2 SELECT dname,SUM(sal) AS dept_total 3 FROM emp,dept 4 WHERE emp.deptno=dept.deptno 5 GROUP BY dname) 6 SELECT dname,dept_total 7 FROM summary 8 WHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary); DNAME DEPT_TOTAL -------------- ---------- RESEARCH 9375 SALES 9400
