You are on page 1of 48

Oracle SQL

Black_Snail

Oracle SQL

........................................................................................................................................ 2
1 ................................................................................................... 4
2 SQL .......................................................................................... 5
2.1 IS NULL IS NOT NULL.................................................................................... 5
2.2 ...................................................................................................................... 5
2.3 % like .................................................................................. 6
2.4 Order by ...................................................................................................... 6
2.5 NOT......................................................................................................................... 6
2.6 IN EXISTS........................................................................................................ 7
3 SQL .................................................................................................. 9
3.1 ORACLE ................................................................................ 9
3.2 Table ................................................................................................... 9
3.3 SQL ...................................................................................................... 10
3.4 ()............................. 11
3.5 WHERE ................................................................................. 12
3.6 SELECT * ............................................................................. 13
3.7 ........................................................................................ 13
3.8 DECODE .................................................................. 14
3.9 ,........................................................................... 15
3.10 ...................................................................................................... 16
3.11 TRUNCATE DELETE .......................................................................... 16
3.12 COMMIT ........................................................................................ 16
3.13 ...................................................................................................... 17
3.14 Where HAVING .................................................................... 17
3.15 .................................................................................................. 17
3.16 SQL . ........................................................................... 18
3.17 (Alias) .......................................................................................... 20
3.18 EXISTS IN ............................................................................................. 20
3.19 NOT EXISTS NOT IN........................................................................... 21
3.20 EXISTS ....................................................................................... 21
3.21 EXISTS DISTINCT ............................................................................... 22
3.22 SQL ........................................................................ 22
3.23 TKPROF SQL ....................................................... 23
3.24 EXPLAIN PLAN SQL .................................................................. 23
3.25 .................................................................................................. 25
3.26 .......................................................................................................... 25
3.27 ...................................................................................................... 27
3.28 .................................................................................................. 27

POSS www.poss.cn

Oracle SQL

3.29 .......................................................................................... 28
3.30 .............................................................................................. 29
3.31 ...................................................................................................... 30
3.32 .................................................................................. 30
3.33 ...................................................................................................... 31
3.34 NOT ................................................................................ 31
3.35 >=>........................................................................................................... 33
3.36 UNION OR ()................................................................. 33
3.37 IN OR ................................................................................................. 36
3.38 IS NULL IS NOT NULL ........................................... 37
3.39 .................................................................................. 37
3.40 ORACLE ............................................................................................. 38
3.41 UNION-ALL UNION ( ) ........................................... 39
3.42 (Hints) .................................................................................................. 40
3.43 WHERE ORDER BY ............................................................................ 41
3.44 ...................................................................................... 42
3.45 WHERE .................................................................................. 43
3.46 ...................................................................................................... 44
3.47 CBO ......................................................................... 45
3.48 .................................................................................. 46
3.49 GROUP BY ................................................................................................ 46
3.50 .............................................................................................................. 47
3.51 (CURSORs) ............................................................................. 47
3.52 EXPORT IMPORT ................................................................................ 47
3.53 ...................................................................................................... 48

POSS www.poss.cn

Oracle SQL

1
SQL
SQL

SQL SQL SQL

SQL

POSS www.poss.cn

Oracle SQL

2 SQL
SQL where where
SQL SQL

2.1 IS NULL IS NOT NULL


SQL where is null is not null Oracle

2.2

employee
FIRST_NAME LAST_NAME.Bill Cliton
SQL

select * from employss


where
first_name||''||last_name ='Beill Cliton';
Bill Cliton
last_name SQL Oracle
last_name

Select * from employee


where
first_name ='Beill' and last_name ='Cliton';
name Bill Cliton
name

POSS www.poss.cn

Oracle SQL

SQL

select * from employee


where
first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)
and
last_name = SUBSTR('&&name',INSTR('&&name,' ')+1)

2.3 % like

cliton SQL

select * from employee where last_name like '%cliton%';


% Oracle last_name

select * from employee where last_name like 'c%';

2.4 Order by
ORDER BY Oracle Order by
Order by

order by
order by
order by

2.5 NOT
where
andor notNOT
NOT

POSS www.poss.cn

Oracle SQL

... where not (status ='VALID')


NOT NOT NOT
<>
where NOT NOT

... where status <>'INVALID';

select * from employee where salary<>3000;


NOT

select * from employee where salary<3000 or salary>3000;

Oracle salary

2.6 IN EXISTS
where
where
IN

... where column in(select * from ... where ...);


EXIST

... where exists (select 'X' from ...where ...);

Oracle IN EXISTS

POSS www.poss.cn

Oracle SQL

select 'X' EXISTS


where
where IN EXISTS
IN
EXISTOracle
Oracle IN

EXISTS IN

NOT EXISTS NOT IN NOT


NOT EXISTS NOT IN

POSS www.poss.cn

Oracle SQL

3 SQL
Oracle SQL

3.1 ORACLE
ORACLE 3 :

a. RULE () b. COST () c. CHOOSE ()

, init.ora OPTIMIZER_MODE ,
RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . SQL (session)
.
(CBO, Cost-Based Optimizer) , analyze ,
(object statistics).
(CHOOSE),
analyze . table analyze , CBO , ,
RULE .
,ORACLE CHOOSE , (full table
scan) , CHOOSE ,.

3.2 Table
ORACLE :
a.
. ORACLE (database block)
.
b. ROWID
ROWID ,, , ROWID
..ORACLE (INDEX)(ROWID).
ROWID ,.

POSS www.poss.cn

Oracle SQL

3.3 SQL
SQL ,, ORACLE SQL .
SGA(system global area)(shared buffer pool)
. , SQL (),
, ORACLE . ORACLE
SQL . ORACLE
(cache buffering) ,.
init.ora ,,
,.
ORACLE SQL ,ORACLE .
,ORACLE ,,SQL (
,).:
A.:
.
:
SELECT * FROM EMP;

SELECT * from EMP;


Select * From Emp;
SELECT

FROM EMP;

B.:
:

Jack

Jill

sal_limit

private synonym

Work_city

public synonym

Plant_detail

public synonym

sal_limit

private synonym

Work_city

public synonym

Plant_detail

table owner

SQL .

POSS www.poss.cn

10

Oracle SQL

SQL

select max(sal_cap) from sal_limit;

select count(*) from work_city where sdesc

like 'NEW%';
select a.sdesc,b.location from work_city a ,

plant_detail b where a.city_id = b.city_id

private
synonym - sal_limit ,

public synonym - work_city


jack private
synonym plant_detail
jill ,.

C. SQL (bind variables)

SQL (),(,
)

a.
select pin , name from people where pin = :blk1.pin;
select pin , name from people where pin = :blk1.pin;

b.
select pin , name from people where pin = :blk1.ot_ind;
select pin , name from people where pin = :blk1.ov_ind;

3.4 ()
ORACLE FROM , FROM
( driving table). FROM ,
. ORACLE , .
,(FROM ),(FROM
),.
:
TAB1 16,384
TAB2 1

TAB2 ()

POSS www.poss.cn

11

Oracle SQL

select count(*) from tab1,tab2 0.96

TAB2 ()
select count(*) from tab2,tab1 26.09
3 , (intersection table),
.
:
EMP LOCATION CATEGORY .
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
SQL
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000

3.5 WHERE
ORACLE WHERE ,,
WHERE , WHERE .
:

(, 156.3 )
SELECT
FROM EMP E
WHERE SAL > 50000

POSS www.poss.cn

12

Oracle SQL

AND

JOB = MANAGER

AND 25 < (SELECT COUNT(*) FROM EMP


WHERE MGR=E.EMPNO);
(, 10.6 )
SELECT
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND
AND

SAL > 50000

JOB = MANAGER;

3.6 SELECT *
SELECT COLUMN , SQL *
.,. ,ORACLE , *
, , .

3.7
SQL , ORACLE : SQL ,
, , . , , ORACLE
.
,
0342 0291 .
1 ()
SELECT EMP_NAME , SALARY , GRADE
FROM EMP
WHERE EMP_NO = 342;

SELECT EMP_NAME , SALARY , GRADE


FROM EMP
WHERE EMP_NO = 291;
2 ()
DECLARE

POSS www.poss.cn

13

Oracle SQL

CURSOR C1 (E_NO NUMBER) IS


SELECT EMP_NAME,SALARY,GRADE
FROM EMP
WHERE EMP_NO = E_NO;
BEGIN
OPEN C1(342);
FETCH C1 INTO ,..,.. ;
..

OPEN C1(291);
FETCH C1 INTO ,..,.. ;
CLOSE C1;
END;
3 ()
SELECT A.EMP_NAME , A.SALARY , A.GRADE,
B.EMP_NAME , B.SALARY , B.GRADE
FROM EMP A,EMP B
WHERE A.EMP_NO = 342
OR B.EMP_NO = 291;
:
SQL*Plus , SQL*Forms Pro*C ARRAYSIZE ,
, 200

3.8 DECODE
DECODE .
:
SELECT COUNT(*)SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE SMITH%;

SELECT COUNT(*)SUM(SAL)

POSS www.poss.cn

14

Oracle SQL

FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE SMITH%;

DECODE
SELECT COUNT(DECODE(DEPT_NO,0020,X,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,X,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE SMITH%;
,DECODE GROUP BY ORDER BY .

3.9 ,
,(
)
:
SELECT NAME
FROM EMP
WHERE EMP_NO = 1234;

SELECT NAME
FROM DPT
WHERE DPT_NO = 10 ;

SELECT NAME
FROM CAT
WHERE CAT_TYPE = RD;
3 :
SELECT E.NAME , D.NAME , C.NAME
FROM CAT C , DPT D , EMP E,DUAL X
WHERE NVL(X,X.DUMMY) = NVL(X,E.ROWID(+))
AND NVL(X,X.DUMMY) = NVL(X,D.ROWID(+))

POSS www.poss.cn

15

Oracle SQL

AND NVL(X,X.DUMMY) = NVL(X,C.ROWID(+))


AND E.EMP_NO(+) = 1234
AND D.DEPT_NO(+) = 10
AND C.CAT_TYPE(+) = RD;
(: ,,,
)

3.10
( ROWID)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);

3.11 TRUNCATE DELETE


,, (rollback segments ) .
COMMIT ,ORACLE (
).
TRUNCATE , .,
.,.
(: TRUNCATE ,TRUNCATE DDL DML)

3.12 COMMIT
, COMMIT, ,
COMMIT :
COMMIT :
a..
b.
c.redo log buffer
d.ORACLE 3

POSS www.poss.cn

16

Oracle SQL

(: COMMIT ,
)

3.13
, count(*) count(1) , ,
. COUNT(EMPNO)
(: CSDN ,, ,
,)

3.14 Where HAVING


HAVING , HAVING .
,. WHERE ,.
:
:
SELECT REGIONAVG(LOG_SIZE)
FROM LOCATION
GROUP BY REGION
HAVING REGION REGION != SYDNEY
AND REGION != PERTH
:
SELECT REGIONAVG(LOG_SIZE)
FROM LOCATION
WHERE REGION REGION != SYDNEY
AND REGION != PERTH
GROUP BY REGION
(: HAVING , COUNT() . ,
WHERE )

3.15
SQL ,.
:

POSS www.poss.cn

17

Oracle SQL

SELECT TAB_NAME
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)

SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
Update Column :
:
UPDATE EMP
SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),
SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;
:
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)
FROM EMP_CATEGORIES)
WHERE EMP_DEPT = 0020;

3.16 SQL .
SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H

POSS www.poss.cn

18

Oracle SQL

WHERE H.EMPNO = E.EMPNO


AND H.HIST_TYPE = T.HIST_TYPE
GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;
.
FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2
AS
TDESC VARCHAR2(30);
CURSOR C1 IS
SELECT TYPE_DESC
FROM HISTORY_TYPE
WHERE HIST_TYPE = TYP;
BEGIN
OPEN C1;
FETCH C1 INTO TDESC;
CLOSE C1;
RETURN (NVL(TDESC,?));
END;

FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2


AS
ENAME VARCHAR2(30);
CURSOR C1 IS
SELECT ENAME
FROM EMP
WHERE EMPNO=EMP;
BEGIN
OPEN C1;
FETCH C1 INTO ENAME;
CLOSE C1;
RETURN (NVL(ENAME,?));
END;

SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),
H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)

POSS www.poss.cn

19

Oracle SQL

FROM EMP_HISTORY H
GROUP BY H.EMPNO , H.HIST_TYPE;
(: SQL . , SQL
. )

3.17 (Alias)
SQL , Column .,
Column .
(: Column SQL Column , SQL
Column ,SQL Column )

3.18 EXISTS IN
,,.,
EXISTS( NOT EXISTS).
:
SELECT *
FROM EMP ()
WHERE EMPNO > 0
AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC = MELB)
:
SELECT *
FROM EMP ()
WHERE EMPNO > 0
AND EXISTS (SELECT X
FROM DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
AND LOC = MELB)
(: , NOT EXISTS NOT IN ,)

POSS www.poss.cn

20

Oracle SQL

3.19 NOT EXISTS NOT IN


,NOT IN . ,NOT IN
(). NOT IN ,
(Outer Joins) NOT EXISTS.
:
SELECT
FROM EMP
WHERE DEPT_NO NOT IN (SELECT DEPT_NO
FROM DEPT
WHERE DEPT_CAT=A);
.:
(: )
SELECT .
FROM EMP A,DEPT B
WHERE A.DEPT_NO = B.DEPT(+)
AND B.DEPT_NO IS NULL
AND B.DEPT_CAT(+) = A
(: )
SELECT .
FROM EMP E
WHERE NOT EXISTS (SELECT X
FROM DEPT D
WHERE D.DEPT_NO = E.DEPT_NO
AND DEPT_CAT = A);

3.20 EXISTS
, EXISTS
SELECT ENAME
FROM EMP E
WHERE EXISTS (SELECT X
FROM DEPT
WHERE DEPT_NO = E.DEPT_NO

POSS www.poss.cn

21

Oracle SQL

AND DEPT_CAT = A);

()
SELECT ENAME
FROM DEPT D,EMP E
WHERE E.DEPT_NO = D.DEPT_NO
AND DEPT_CAT = A ;
(: RBO , FILTER, NESTED LOOP)

3.21 EXISTS DISTINCT


(), SELECT
DISTINCT. EXIST
:
:
SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO
:
SELECT DEPT_NO,DEPT_NAME
FROM DEPT D
WHERE EXISTS ( SELECT X
FROM EMP E
WHERE E.DEPT_NO = D.DEPT_NO);
EXISTS , RDBMS ,
.

3.22 SQL
SQL SQL:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

POSS www.poss.cn

22

Oracle SQL

SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND

BUFFER_GETS > 0

AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8


ORDER BY 4 DESC;
(: SQL , SQL
)

3.23 TKPROF SQL


SQL trace SQL .
,.,CPU .
.
SQL TRACE :
ALTER SESSION SET SQL_TRACE TRUE
SQL TRACE , SQL_TRACE init.ora TRUE,
USER_DUMP_DEST

(: , TKPROF , SQL TRACE ,


SQL TRACE init.ora TIMED_STATISTICS,
. trace , TKPROF ,TKPROF .
ORACLE . )

3.24 EXPLAIN PLAN SQL


EXPLAIN PLAN SQL , SQL
. , ORACLE ,(
).
,. EXPLAIN PLAN
, , ,
.

POSS www.poss.cn

23

Oracle SQL

NESTED LOOP , NESTED


LOOP ,.

:
, SQLPLUS SET TRACE .
:
SQL> list
1 SELECT *
2 FROM dept, emp
3* WHERE emp.deptno = dept.deptno
SQL> set autotrace traceonly /*traceonly */
SQL> /
14 rows selected.
Execution Plan

----------------------------------------------------------

SELECT STATEMENT Optimizer=CHOOSE

0 NESTED LOOPS

TABLE ACCESS (FULL) OF 'EMP'

TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

Statistics
---------------------------------------------------------0 recursive calls
2 db block gets
30 consistent gets
0 physical reads
0 redo size
2598 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client

POSS www.poss.cn

24

Oracle SQL

0 sorts (memory)
0 sorts (disk)
14 rows processed
,:
1.

TABLE ACCESS (FULL) OF 'EMP'

2.

INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

3.

TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

4.

NESTED LOOPS (JOINING 1 AND 3)

: TOAD ORACLE OMS SQL Analyze


EXPLAIN PLAN ..

3.25
,. ,ORACLE
B-tree . ,. ORACLE Update
, ORACLE . .
,(primary key).
LONG LONG RAW , . ,
. ,, ,.
,. ,
, , .
INSERT , DELETE , UPDATE 4 , 5 I/O .
,.

:
.
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>

3.26
ORACLE .
1 ( INDEX UNIQUE SCAN)
, WHERE INDEX.

POSS www.poss.cn

25

Oracle SQL

:
LODGING : LODGING LODGING_PK
MANAGER LODGING$MANAGER.

SELECT *
FROM LODGING
WHERE LODGING = ROSE HILL;
, SQL , , LODGING_PK
, ROWID, ROWID .
INDEX ,ORACLE ( ROWID
). , .
SQL INDEX UNIQUE SCAN .
SELECT LODGING
FROM LODGING
WHERE LODGING = ROSE HILL;
(INDEX RANGE SCAN)
:
1.

2.

1:
SELECT LODGING
FROM LODGING
WHERE LODGING LIKE M%;
WHERE , ORACLE LODGING_PK .
, .

2:
SELECT LODGING
FROM LODGING
WHERE MANAGER = BILL GATES;

POSS www.poss.cn

26

Oracle SQL

SQL , LODGING$MANAGER (
ROWID) ROWID LODGING . LODGING$MANAGER
,.
SQL LODGING , LODGING$MANAGER ,
ROWID .
WHERE , (WILDCARD),
.
SELECT LODGING
FROM LODGING
WHERE MANAGER LIKE HANMAN;
ORACLE .

3.27
(Driving Table)().
, SQL .
CBO (COST BASED OPTIMIZER), SQL
,,.
RBO (RULE BASED OPTIMIZER) , ,
, FROM .
:
SELECT A.NAME , B.MANAGER
FROM

WORKER A,

LODGING B
WHERE

A.LODGING = B.LODING;

LODGING LODING , WORKER ,


WORKER .

3.28
SQL , ORACLE
, .
ORACLE ,.

POSS www.poss.cn

27

Oracle SQL

WHERE ..
.
, FROM
. FROM .
, WHERE
.
:
DEPTNO ,EMP_CAT .
SELECT ENAME,
FROM EMP
WHERE DEPT_NO = 20
AND EMP_CAT = A;
,DEPTNO , EMP_CAT .
:
TABLE ACCESS BY ROWID ON EMP
AND-EQUAL
INDEX RANGE SCAN ON DEPT_IDX
INDEX RANGE SCAN ON CAT_IDX

3.29
WHERE , ORACLE ,ORACLE .
:
DEPTNO ,EMP_CAT .
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT = A;
EMP_CAT , DEPTNO .
:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON CAT_IDX

POSS www.poss.cn

28

Oracle SQL

3.30
ORACLE ,, WHERE
.
:
DEPTNO ,EMP_CAT .
SELECT ENAME
FROM EMP
WHERE DEPTNO > 20
AND EMP_CAT > A;
, ORACLE DEPT_NO . :
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
:
:
SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';
INDEX_NAME

UNIQUENES

------------------------------ --------EMPNO

UNIQUE

EMPTYPE

NONUNIQUE

SQL> select * from emp where empno >= 2 and emp_type = 'A' ;
no rows selected

Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)

EMPNO ,,
!

POSS www.poss.cn

29

Oracle SQL

3.31
, ORACLE (
,) .
:
SELECT ENAME
FROM EMP
WHERE EMPNO = 7935
AND DEPTNO + 0 = 10

/*DEPTNO */

AND EMP_TYPE || = A /*EMP_TYPE */

. ,,
SQL .
, EMP EMP_TYPE
EMP_CLASS .
SELECT ENAME
FROM EMP
WHERE EMP_TYPE = A
AND EMP_CLASS = X;
EMP_TYPE . . ,,
EMP_CLASS ,,,
. ,EMP_TYPE
EMP_CLASS.
. , EMP_CLASS .
.
SELECT ENAME
FROM EMP
WHERE EMP_TYPE = A
AND EMP_CLASS|| = X;

3.32
WHERE
:

POSS www.poss.cn

30

Oracle SQL

SELECT
FROM DEPT
WHERE SAL * 12 > 25000;
:
SELECT
FROM DEPT
WHERE SAL > 25000/12;
:

3.33

ORACLE

:
SELECT ENAME
FROM EMP
WHERE EMPNO = 2326
AND DEPTNO = 20 ;
EMPNO EMPNO
TABLE ACCESS BY ROWID ON EMP
INDEX UNIQUE SCAN ON EMP_NO_IDX

3.34 NOT
NOT, NOT .
ORACLENOT,.
:
: (,)
SELECT

POSS www.poss.cn

31

Oracle SQL

FROM DEPT
WHERE DEPT_CODE NOT = 0;
: (,)
SELECT
FROM DEPT
WHERE DEPT_CODE > 0;
,, ORACLE NOT .
NOT > to <=
NOT >= to <
NOT < to >=
NOT <= to >
:
,. SQL .
:

SQL> select * from emp where NOT empno > 1;


no rows selected
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)

SQL> select * from emp where empno <= 1;


no rows selected
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)

, ORACLE
NOT

POSS www.poss.cn

32

Oracle SQL

3.35 >=>
DEPTNO ,
:
SELECT *
FROM EMP
WHERE DEPTNO >=4
:
SELECT *
FROM EMP
WHERE DEPTNO >3
, DBMS DEPT 4
DEPTNO=3 DEPT 3 .

3.36 UNION OR ()
, UNION WHERE OR . OR
. , . column ,
OR .
, LOC_ID REGION .
:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = MELBOURNE

:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = MELBOURNE

POSS www.poss.cn

33

Oracle SQL

OR, .
:

WHERE KEY1 = 10 ()
OR KEY2 = 20

()

ORACLE
WHERE KEY1 = 10 AND
((NOT KEY1 = 10) AND KEY2 = 20)
:
: (a = 1003 , b = 1 1003 )
SQL> select * from unionvsor /*1st test*/
2 where a = 1003 or b = 1;
1003 rows selected.
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 CONCATENATION

TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'


INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
144 consistent gets
0 physical reads
0 redo size
63749 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)

POSS www.poss.cn

34

Oracle SQL

0 sorts (disk)
1003 rows processed
SQL> select * from unionvsor /*2nd test*/
2 where b = 1 or a = 1003 ;
1003 rows selected.
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 CONCATENATION

TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'


INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
143 consistent gets
0 physical reads
0 redo size
63749 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1003 rows processed

SQL> select * from unionvsor /*3rd test*/


2 where a = 1003
3 union
4 select * from unionvsor
5 where b = 1;
1003 rows selected.
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

POSS www.poss.cn

35

Oracle SQL

0 SORT (UNIQUE)

UNION-ALL
TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'
INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics
---------------------------------------------------------0 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
63735 bytes sent via SQL*Net to client
7751 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1003 rows processed
UNION consistent gets SQL*NET

3.37 IN OR
:
:
SELECT.
FROM LOCATION
WHERE LOC_ID = 10
OR

LOC_ID = 20

OR

LOC_ID = 30

:
SELECT
FROM LOCATION
WHERE LOC_IN IN (10,20,30);

POSS www.poss.cn

36

Oracle SQL

:
ORACLE8i

3.38 IS NULL IS NOT NULL


ORACLE
.
.

:
A B , A,B (123,null) ,
ORACLE A,B 123,null().
ORACLE . 1000
,!
, WHERE ORACLE
.
:
: ()
SELECT
FROM DEPARTMENT
WHERE DEPT_CODE IS NOT NULL;
: ()
SELECT
FROM DEPARTMENT
WHERE DEPT_CODE >=0;

3.39
, (leading column) where ,
.

:
. .

POSS www.poss.cn

37

Oracle SQL

SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));
Table created.
SQL> create index multindex on multiindexusage(inda,indb);
Index created.
SQL> set autotrace traceonly
SQL> select * from multiindexusage where inda = 1;
Execution Plan
---------------------------------------------------------0

SELECT STATEMENT Optimizer=CHOOSE

0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE'

INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)

SQL> select * from multiindexusage where indb = 1;


Execution Plan
---------------------------------------------------------0
1

SELECT STATEMENT Optimizer=CHOOSE


0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'

, ,

3.40 ORACLE
,ORACLE . .

ORACLE Clause
ORDER BY
UNION
MINUS
INTERSECT
DISTINCT,MINUS,INTERSECT,UNION
MIN,MAX,COUNT
GROUP BY
ROWNUM
Queries involving Joins
CONNECT BY

POSS www.poss.cn

SORT ORDER BY
UNION-ALL
MINUS
INTERSECT
SORT UNIQUE
SORT AGGREGATE
SORT GROUP BY
COUNT or COUNT STOPKEY
SORT JOIN,MERGE JOIN,NESTED
LOOPS
CONNECT BY

38

Oracle SQL

3.41 UNION-ALL UNION ( )


SQL UNION , UNION-ALL
, .
UNION ALL UNION, . .

SELECT ACCT_NUM, BALANCE_AMT


FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = 31-DEC-95
UNION
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = 31-DEC-95
:
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = 31-DEC-95
UNION ALL
SELECT ACCT_NUM, BALANCE_AMT
FROM DEBIT_TRANSACTIONS
WHERE TRAN_DATE = 31-DEC-95
:
UNION ALL .
UNION ALL .
UNION , SORT_AREA_SIZE .
. SQL
Select substr(name,1,25) "Sort Area Name",
substr(value,1,15) "Value"
from v$sysstat
where name like 'sort%'

POSS www.poss.cn

39

Oracle SQL

3.42 (Hints)
, Hints.
FULL ROWID
FULL hint ORACLE .
:
SELECT /*+ FULL(EMP) */ *
FROM EMP
WHERE EMPNO = 7893;
ROWID hint ORACLE TABLE ACCESS BY ROWID .
, TABLE ACCESS BY ROWID ,
, ROIWD .
(CACHED)
SGA , CACHE hint SGA . CACHE hint
FULL hint .
:
SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ *
FROM WORK;
hint ORACLE .
:
SELECT /*+ INDEX(LODGING) */ LODGING
FROM LODGING
WHERE MANAGER = BILL GATES;
hint , ,,
CBO, . , INDEX hint ORACLE
.
ORACLE hints ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE,
USE_HASH .

POSS www.poss.cn

40

Oracle SQL

hint , ORACLE ,.
. , SQL hint .
ORACLE ( CBO)

3.43 WHERE ORDER BY


ORDER BY .
ORDER BY .
ORDER BY .
WHERE ORDER BY .

:
DEPT :
DEPT_CODE

PK NOT NULL

DEPT_DESC

NOT NULL

DEPT_TYPE

NULL

(DEPT_TYPE)

: ()
SELECT DEPT_CODE
FROM DEPT
ORDER BY DEPT_TYPE

EXPLAIN PLAN:
SORT ORDER BY
TABLE ACCESS FULL
: ()
SELECT DEPT_CODE
FROM DEPT
WHERE DEPT_TYPE > 0

EXPLAIN PLAN:
TABLE ACCESS BY ROWID ON EMP

POSS www.poss.cn

41

Oracle SQL

INDEX RANGE SCAN ON DEPT_IDX


:
ORDER BY ! . :
SQL> select * from emp order by empno;
Execution Plan
---------------------------------------------------------0
1
2 1

SELECT STATEMENT Optimizer=CHOOSE


0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE)

3.44 .
, ORACLE .
EMPNO .
SELECT
FROM EMP
WHERE EMPNO = 123
, ORACLE , :
SELECT
FROM EMP
WHERE EMPNO = TO_NUMBER(123)
,,.
, EMP_TYPE .
SELECT
FROM EMP
WHERE EMP_TYPE = 123
ORACLE :
SELECT
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123

POSS www.poss.cn

42

Oracle SQL

, !
:
ORACLE SQL , .
, ORACLE .

3.45 WHERE
SELECT WHERE . .
, != . , ,
.
:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;
, ||. , .
:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE=AMEXA;
:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = AMEX
AND ACCOUNT_TYPE= A;
, +. , .
:

POSS www.poss.cn

43

Oracle SQL

SELECT ACCOUNT_NAME, AMOUNT


FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
,,.
:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,%);
:
, ORACLE : (Function-Based
Index) .
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /**/
SELECT * FROM emp WHERE UPPER(ename) = BLACKSNAIL; /**/

3.46
, .
:
SELECT *
FROM LODGING
WHERE MANAGER IN (BILL GATES,KEN MULLER);

SELECT *

POSS www.poss.cn

44

Edited by Foxit Reader


Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Oracle SQL

FROM LODGING
WHERE MANAGER = BILL GATES
OR MANAGER = KEN MULLER;
, LODGING$MANAGER
. ROWID LODGING ( TABLE ACCESS BY ROWID ).
(CONCATENATION).
Explain Plan :
SELECT STATEMENT Optimizer=CHOOSE
CONCATENATION
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
TABLE ACCESS (BY INDEX ROWID) OF LODGING
INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
:
37 .

3.47 CBO
(CBO, Cost-Based Optimizer)
.
, ,.
, 100 80 . 80/100
= 0.8 . , .
, ROWID
. .

:
:
a. 30%..
b., ,
. ,!

POSS www.poss.cn

45

Edited by Foxit Reader


Copyright(C) by Foxit Software Company,2005-2008
For Evaluation Only.
Oracle SQL

3.48
DISTINCT,UNION,MINUS,INTERSECT,ORDER BY SQL SQL
(SORT). DISTINCT ,
.
, UNION , GROUP BY , GROUP BY
(NESTED SORT) ; , , UNION ,
(SORT UNIQUE).
.
, UNION, MINUS , INTERSECT SQL .

:
SORT_AREA_SIZE , UNION , MINUS, INTERSECT
,

3.49 GROUP BY
GROUP BY , GROUP BY .
.

:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP JOB
HAVING JOB = PRESIDENT
OR JOB = MANAGER
:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = PRESIDENT
OR JOB = MANAGER
GROUP JOB
:

POSS www.poss.cn

46

Oracle SQL

14 . .

3.50
, 5 , !
:
1.
SELECT TO_DATE(01-JAN-93+.99999)
FROM DUAL;

Returns:
01-JAN-93 23:59:59

2.
SELECT TO_DATE(01-JAN-93+.999999)
FROM DUAL;

Returns:
02-JAN-93 00:00:00
:
SQL ,

3.51 (CURSORs)
,. , TOO MANY ROWS
exception . .

3.52 EXPORT IMPORT


BUFFER( 10MB , 10,240,000) EXPORT IMPORT .
ORACLE ,,.
,.

POSS www.poss.cn

47

Oracle SQL

, BUFFER EXPORT , IMPORT . (


CASE, BUFFER ,IMPORT/EXPORT 10 !)
: ,.
.
EXPORT/IMPORT ,CSDN , BUFFER ,
COMMIT , .

3.53
(TABLESPACES). ORACLE
SYSTEM . ,.

:
,. ,
.

POSS www.poss.cn

48

You might also like