ORACLE SQL基礎


一、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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM