Вы находитесь на странице: 1из 26

SQL> cl scr

SQL> SELECT Deptno, Dname, Loc


2 FROM Dept;
DEPTNO
---------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

SQL> cl scr
SQL> ed
Wrote file afiedt.buf
1 SELECT *
2 FROM (SELECT Deptno, Dname, Loc
3*
FROM Dept)
SQL> /
DEPTNO
---------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

SQL> ed
Wrote file afiedt.buf
1 SELECT Ename, Sal, Deptno, AnnSal
2 FROM (SELECT Ename, Sal, Deptno, Sal * 12 AnnSal
3*
FROM Emp)
SQL> /
ENAME
SAL
DEPTNO
ANNSAL
---------- ---------- ---------- ---------KING
5000
10
60000
BLAKE
2850
30
34200
CLARK
2450
10
29400
JONES
2975
20
35700
MARTIN
1250
30
15000
ALLEN
1600
30
19200
TURNER
1500
30
18000
JAMES
950
30
11400
WARD
1250
30
15000
FORD
3000
20
36000
SMITH
800
20
9600
ENAME
SAL
DEPTNO
ANNSAL
---------- ---------- ---------- ---------SCOTT
3000
20
36000
ADAMS
1100
20
13200
MILLER
1300
10
15600
14 rows selected.
SQL> cl scr

SQL> SELECT Ename, Sal, Deptno, SUM(Sal)


2 FROM Emp;
SELECT Ename, Sal, Deptno, SUM(Sal)
*
ERROR at line 1:
ORA-00937: not a single-group group function
SQL> ed
Wrote file afiedt.buf
1
2
3*
SQL>

SELECT Ename, Sal, Deptno, SUM(Sal)


FROM Emp
GROUP BY Ename, Sal, Deptno
/

ENAME
SAL
DEPTNO SUM(SAL)
---------- ---------- ---------- ---------FORD
3000
20
3000
KING
5000
10
5000
WARD
1250
30
1250
ADAMS
1100
20
1100
ALLEN
1600
30
1600
BLAKE
2850
30
2850
CLARK
2450
10
2450
JAMES
950
30
950
JONES
2975
20
2975
SCOTT
3000
20
3000
SMITH
800
20
800
ENAME
SAL
DEPTNO SUM(SAL)
---------- ---------- ---------- ---------MARTIN
1250
30
1250
MILLER
1300
10
1300
TURNER
1500
30
1500
14 rows selected.
SQL> ed
Wrote file afiedt.buf
1 SELECT Ename, Sal, E.Deptno, SalSum
2 FROM Emp E, (SELECT Deptno, SUM(Sal) SalSum
3
FROM Emp
4
GROUP BY Deptno
5
) E1
6* WHERE E.Deptno = E1.Deptno
SQL> ed
Wrote file afiedt.buf
1
2
3*
4

SELECT Deptno, SUM(Sal) SalSum


FROM Emp
GROUP BY Deptno
/

DEPTNO
SALSUM
---------- ---------10
8750
20
10875

30

9400

SQL> SELECT Ename, Sal, E.Deptno, SalSum


2 FROM Emp E, (SELECT Deptno, SUM(Sal) SalSum
3
FROM Emp
4
GROUP BY Deptno
5
) E1
6 WHERE E.Deptno = E1.Deptno;
ENAME
SAL
DEPTNO
SALSUM
---------- ---------- ---------- ---------MILLER
1300
10
8750
CLARK
2450
10
8750
KING
5000
10
8750
ADAMS
1100
20
10875
SCOTT
3000
20
10875
SMITH
800
20
10875
FORD
3000
20
10875
JONES
2975
20
10875
WARD
1250
30
9400
JAMES
950
30
9400
TURNER
1500
30
9400
ENAME
SAL
DEPTNO
SALSUM
---------- ---------- ---------- ---------ALLEN
1600
30
9400
MARTIN
1250
30
9400
BLAKE
2850
30
9400
14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT Ename, Sal, E.Deptno, SalAvg


FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno
) E1
WHERE E.Deptno = E1.Deptno
/

ENAME
SAL
DEPTNO
SALAVG
---------- ---------- ---------- ---------MILLER
1300
10 2916.66667
CLARK
2450
10 2916.66667
KING
5000
10 2916.66667
ADAMS
1100
20
2175
SCOTT
3000
20
2175
SMITH
800
20
2175
FORD
3000
20
2175
JONES
2975
20
2175
WARD
1250
30 1566.66667
JAMES
950
30 1566.66667
TURNER
1500
30 1566.66667
ENAME
SAL
DEPTNO
SALAVG
---------- ---------- ---------- ---------ALLEN
1600
30 1566.66667
MARTIN
1250
30 1566.66667

BLAKE

2850

30 1566.66667

14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10*
SQL>

SELECT Ename, Sal, E.Deptno, SalSum, SalAvg, DCount


FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum,
AVG(Sal) SalAvg,
COUNT(*) DCount
FROM Emp
GROUP BY Deptno
) E1
WHERE E.Deptno = E1.Deptno
/

ENAME
SAL
DEPTNO
SALSUM
SALAVG
DCOUNT
---------- ---------- ---------- ---------- ---------- ---------MILLER
1300
10
8750 2916.66667
3
CLARK
2450
10
8750 2916.66667
3
KING
5000
10
8750 2916.66667
3
ADAMS
1100
20
10875
2175
5
SCOTT
3000
20
10875
2175
5
SMITH
800
20
10875
2175
5
FORD
3000
20
10875
2175
5
JONES
2975
20
10875
2175
5
WARD
1250
30
9400 1566.66667
6
JAMES
950
30
9400 1566.66667
6
TURNER
1500
30
9400 1566.66667
6
ENAME
SAL
DEPTNO
SALSUM
SALAVG
DCOUNT
---------- ---------- ---------- ---------- ---------- ---------ALLEN
1600
30
9400 1566.66667
6
MARTIN
1250
30
9400 1566.66667
6
BLAKE
2850
30
9400 1566.66667
6
14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

SELECT
Ename,
Sal,
E.Deptno,
SalSum,
SalSum - Sal DiffSal,
SalAvg,
ABS(ROUND(SalSum - SalAvg)) DiffSalAvg
DCount
FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum,
AVG(Sal) SalAvg,
COUNT(*) DCount
FROM Emp
GROUP BY Deptno

17
) E1
18* WHERE E.Deptno = E1.Deptno
SQL> /
DCount
*
ERROR at line 9:
ORA-00923: FROM keyword not found where expected
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18*
SQL>

SELECT
Ename,
Sal,
E.Deptno,
SalSum,
SalSum - Sal DiffSal,
SalAvg,
ABS(ROUND(SalSum - SalAvg)) DiffSalAvg,
DCount
FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum,
AVG(Sal) SalAvg,
COUNT(*) DCount
FROM Emp
GROUP BY Deptno
) E1
WHERE E.Deptno = E1.Deptno
/

ENAME
SAL
DEPTNO
SALSUM
DIFFSAL
SALAVG DIFFSALAVG
---------- ---------- ---------- ---------- ---------- ---------- ---------DCOUNT
---------MILLER
1300
10
8750
7450 2916.66667
5833
3
CLARK

2450

10

8750

6300 2916.66667

5833

5000

10

8750

3750 2916.66667

5833

3
KING
3
ENAME
SAL
DEPTNO
SALSUM
DIFFSAL
SALAVG DIFFSALAVG
---------- ---------- ---------- ---------- ---------- ---------- ---------DCOUNT
---------ADAMS
1100
20
10875
9775
2175
8700
5
SCOTT

3000

20

10875

7875

2175

8700

800

20

10875

10075

2175

8700

5
SMITH
5

ENAME
SAL
DEPTNO
SALSUM
DIFFSAL
SALAVG DIFFSALAVG
---------- ---------- ---------- ---------- ---------- ---------- ---------DCOUNT
---------FORD
3000
20
10875
7875
2175
8700
5
JONES

2975

20

10875

1250

30

9400

7900

2175

8700

8150 1566.66667

7833

5
WARD
6
ENAME
SAL
DEPTNO
SALSUM
DIFFSAL
SALAVG DIFFSALAVG
---------- ---------- ---------- ---------- ---------- ---------- ---------DCOUNT
---------JAMES
950
30
9400
8450 1566.66667
7833
6
TURNER

1500

30

9400

7900 1566.66667

7833

1600

30

9400

7800 1566.66667

7833

6
ALLEN
6
ENAME
SAL
DEPTNO
SALSUM
DIFFSAL
SALAVG DIFFSALAVG
---------- ---------- ---------- ---------- ---------- ---------- ---------DCOUNT
---------MARTIN
1250
30
9400
8150 1566.66667
7833
6
BLAKE

2850

30

9400

6
14 rows selected.
SQL> cl scr
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12
13
14

SELECT
Ename,
Sal,
E.Deptno,
Dname,
Loc,
SalSum,
FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum
FROM Emp
GROUP BY Deptno
) E1, Dept D
WHERE E.Deptno = E1.Deptno AND

6550 1566.66667

7833

15* E.Deptno = D.Deptno


SQL> /
FROM Emp E, (SELECT
*
ERROR at line 8:
ORA-00936: missing expression
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15*
SQL>

SELECT
Ename,
Sal,
E.Deptno,
Dname,
Loc,
SalSum
FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum
FROM Emp
GROUP BY Deptno
) E1, Dept D
WHERE E.Deptno = E1.Deptno AND
E.Deptno = D.Deptno
/

ENAME
SAL
DEPTNO DNAME
---------- ---------- ---------- -------------MILLER
1300
10 ACCOUNTING
CLARK
2450
10 ACCOUNTING
KING
5000
10 ACCOUNTING
ADAMS
1100
20 RESEARCH
SCOTT
3000
20 RESEARCH
SMITH
800
20 RESEARCH
FORD
3000
20 RESEARCH
JONES
2975
20 RESEARCH
WARD
1250
30 SALES
JAMES
950
30 SALES
TURNER
1500
30 SALES

LOC
SALSUM
------------- ---------NEW YORK
8750
NEW YORK
8750
NEW YORK
8750
DALLAS
10875
DALLAS
10875
DALLAS
10875
DALLAS
10875
DALLAS
10875
CHICAGO
9400
CHICAGO
9400
CHICAGO
9400

ENAME
SAL
DEPTNO DNAME
---------- ---------- ---------- -------------ALLEN
1600
30 SALES
MARTIN
1250
30 SALES
BLAKE
2850
30 SALES

LOC
SALSUM
------------- ---------CHICAGO
9400
CHICAGO
9400
CHICAGO
9400

14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6
7

SELECT
Ename,
Sal,
Grade,
E.Deptno,
Dname,
Loc,

8
9
10
11
12
13
14
15
16
17*
SQL>

SalSum
FROM Emp E, (SELECT
Deptno,
SUM(Sal) SalSum
FROM Emp
GROUP BY Deptno
) E1, Dept D, SalGrade S
WHERE E.Deptno = E1.Deptno AND
E.Deptno = D.Deptno AND
E.Sal BETWEEN LoSal AND HiSal
/

ENAME
SAL
GRADE
DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------SALSUM
---------MILLER
1300
2
10 ACCOUNTING
NEW YORK
8750
CLARK

2450

10 ACCOUNTING

NEW YORK

5000

10 ACCOUNTING

NEW YORK

8750
KING
8750
ENAME
SAL
GRADE
DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------SALSUM
---------SMITH
800
1
20 RESEARCH
DALLAS
10875
ADAMS

1100

20 RESEARCH

DALLAS

2975

20 RESEARCH

DALLAS

10875
JONES
10875
ENAME
SAL
GRADE
DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------SALSUM
---------FORD
3000
4
20 RESEARCH
DALLAS
10875
SCOTT

3000

20 RESEARCH

DALLAS

950

30 SALES

CHICAGO

10875
JAMES
9400
ENAME
SAL
GRADE
DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------SALSUM
---------MARTIN
1250
2
30 SALES
CHICAGO
9400

WARD

1250

30 SALES

CHICAGO

1600

30 SALES

CHICAGO

9400
ALLEN
9400
ENAME
SAL
GRADE
DEPTNO DNAME
LOC
---------- ---------- ---------- ---------- -------------- ------------SALSUM
---------TURNER
1500
3
30 SALES
CHICAGO
9400
BLAKE

2850

30 SALES

9400
14 rows selected.
SQL> cl scr
SQL> SELECT E.Ename, E.Sal , E.Deptno, E1.SalAvg
2 FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
3
FROM Emp
4
GROUP BY Deptno) E1
5 WHERE E.Deptno = E1.Deptno;
ENAME
SAL
DEPTNO
SALAVG
---------- ---------- ---------- ---------MILLER
1300
10 2916.66667
CLARK
2450
10 2916.66667
KING
5000
10 2916.66667
ADAMS
1100
20
2175
SCOTT
3000
20
2175
SMITH
800
20
2175
FORD
3000
20
2175
JONES
2975
20
2175
WARD
1250
30 1566.66667
JAMES
950
30 1566.66667
TURNER
1500
30 1566.66667
ENAME
SAL
DEPTNO
SALAVG
---------- ---------- ---------- ---------ALLEN
1600
30 1566.66667
MARTIN
1250
30 1566.66667
BLAKE
2850
30 1566.66667
14 rows selected.
SQL>
2
3
4
5
6

SELECT E.Ename, E.Sal , E.Deptno, E1.SalAvg


FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno) E1
WHERE E.Deptno = E1.Deptno AND
E.Sal > E1.SalAvg;

ENAME
SAL
DEPTNO
SALAVG
---------- ---------- ---------- ----------

CHICAGO

KING
SCOTT
FORD
JONES
ALLEN
BLAKE

5000
3000
3000
2975
1600
2850

10 2916.66667
20
2175
20
2175
20
2175
30 1566.66667
30 1566.66667

6 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT E.Ename, E.Sal , E.Job, E.Deptno, E1.SalAvg


FROM Emp E, (SELECT Job, AVG(Sal) SalAvg
FROM Emp
GROUP BY Job) E1
WHERE E.Job = E1.Job
/

ENAME
SAL JOB
DEPTNO
SALAVG
---------- ---------- --------- ---------- ---------SCOTT
3000 ANALYST
20
3000
FORD
3000 ANALYST
20
3000
MILLER
1300 CLERK
10
1037.5
ADAMS
1100 CLERK
20
1037.5
SMITH
800 CLERK
20
1037.5
JAMES
950 CLERK
30
1037.5
JONES
2975 MANAGER
20 2758.33333
CLARK
2450 MANAGER
10 2758.33333
BLAKE
2850 MANAGER
30 2758.33333
KING
5000 PRESIDENT
10
5000
WARD
1250 SALESMAN
30
1400
ENAME
SAL JOB
DEPTNO
SALAVG
---------- ---------- --------- ---------- ---------TURNER
1500 SALESMAN
30
1400
ALLEN
1600 SALESMAN
30
1400
MARTIN
1250 SALESMAN
30
1400
14 rows selected.
SQL> ed
Wrote file afiedt.buf
1 SELECT E.Ename, E.Sal , E.Job, E.Deptno, E1.SalAvg
2 FROM Emp E, (SELECT Job, AVG(Sal) SalAvg
3
FROM Emp
4
GROUP BY Job) E1
5 WHERE E.Job = E1.Job AND
6* E1.Sal = SalAvg
SQL> /
E1.Sal = SalAvg
*
ERROR at line 6:
ORA-00904: "E1"."SAL": invalid identifier
SQL> ed
Wrote file afiedt.buf

1
2
3
4
5
6*
SQL>

SELECT E.Ename, E.Sal , E.Job, E.Deptno, E1.SalAvg


FROM Emp E, (SELECT Job, AVG(Sal) SalAvg
FROM Emp
GROUP BY Job) E1
WHERE E.Job = E1.Job AND
E.Sal = SalAvg
/

ENAME
SAL JOB
DEPTNO
SALAVG
---------- ---------- --------- ---------- ---------SCOTT
3000 ANALYST
20
3000
FORD
3000 ANALYST
20
3000
KING
5000 PRESIDENT
10
5000
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT E.Ename, E.Sal , E.Job, E.Deptno, E1.SalAvg


FROM Emp E, (SELECT Job, AVG(Sal) SalAvg
FROM Emp
GROUP BY Job) E1
WHERE E.Job = E1.Job AND
E.Sal = SalAvg
cl scr

SQL>
2
3
4
5
6
7
8
9

SELECT E.Ename, E.Sal, E.Deptno,


ROUND(E1.SalAvg, 2) DeptAvgSal,
ROUND(E.Sal - E1.SalAvg) DiffSalAvg
FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno) E1
WHERE E.Deptno = E1.Deptno
ORDER BY Deptno
/

ENAME
SAL
DEPTNO DEPTAVGSAL DIFFSALAVG
---------- ---------- ---------- ---------- ---------KING
5000
10
2916.67
2083
CLARK
2450
10
2916.67
-467
MILLER
1300
10
2916.67
-1617
JONES
2975
20
2175
800
FORD
3000
20
2175
825
SMITH
800
20
2175
-1375
SCOTT
3000
20
2175
825
ADAMS
1100
20
2175
-1075
BLAKE
2850
30
1566.67
1283
MARTIN
1250
30
1566.67
-317
ALLEN
1600
30
1566.67
33
ENAME
SAL
DEPTNO DEPTAVGSAL DIFFSALAVG
---------- ---------- ---------- ---------- ---------TURNER
1500
30
1566.67
-67
JAMES
950
30
1566.67
-617
WARD
1250
30
1566.67
-317
14 rows selected.
SQL> cl scr
SQL> SET AUTOTRACE ON EXPLAIN

SQL>
2
3
4
5
6
7

SELECT T1.Deptno, Dname, Staff


FROM Dept T1,
(SELECT Deptno, COUNT(*) AS Staff
FROM Emp
GROUP BY Deptno) T2
WHERE T1.Deptno = T2.Deptno
AND Staff >= 5;

DEPTNO
---------20
30

DNAME
STAFF
-------------- ---------RESEARCH
5
SALES
6

Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=14 Bytes=67
2)
1
2

0
1

HASH JOIN (Cost=8 Card=14 Bytes=672)


TABLE ACCESS (FULL) OF 'DEPT' (TABLE) (Cost=3 Card=4 Byt
es=88)

3
4
5
6

1
3
4
5

VIEW (Cost=4 Card=14 Bytes=364)


FILTER
SORT (GROUP BY) (Cost=4 Card=14 Bytes=182)
TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=
14 Bytes=182)

SQL>
2
3
4
5

SELECT E.Deptno, Dname, COUNT(*) Staff


FROM Emp E, Dept D
WHERE E.Deptno = D.Deptno
GROUP BY E.Deptno, Dname
HAVING COUNT(*) > 5;

DEPTNO DNAME
STAFF
---------- -------------- ---------30 SALES
6
Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=14 Bytes=49
0)
1
2
3
4

0
1
2
3

FILTER
SORT (GROUP BY) (Cost=8 Card=14 Bytes=490)
HASH JOIN (Cost=7 Card=14 Bytes=490)
TABLE ACCESS (FULL) OF 'DEPT' (TABLE) (Cost=3 Card=4
Bytes=88)

TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14


Bytes=182)

SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT E.Deptno, Dname, COUNT(*) Staff


FROM Emp E, Dept D
WHERE E.Deptno = D.Deptno
GROUP BY E.Deptno, Dname
HAVING COUNT(*) >= 5
/

DEPTNO
---------20
30

DNAME
STAFF
-------------- ---------RESEARCH
5
SALES
6

Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=14 Bytes=49
0)
1
2
3
4

0
1
2
3

FILTER
SORT (GROUP BY) (Cost=8 Card=14 Bytes=490)
HASH JOIN (Cost=7 Card=14 Bytes=490)
TABLE ACCESS (FULL) OF 'DEPT' (TABLE) (Cost=3 Card=4
Bytes=88)

TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14


Bytes=182)

SQL> cl scr
SQL> SET AUTOTRACE ON EXPLAIN
SQL> SET AUTOTRACE OFF EXPLAIN
SQL> cl scr
SQL> SELECT Deptno, SUM(Sal)
2 FROM Emp
3 GROUP BY Deptno;
DEPTNO SUM(SAL)
---------- ---------10
8750
20
10875
30
9400
SQL>
2
3
4
5
6

SELECT Deptno, SUM(Sal),


SUM(Sal)/Tot_Sal * 100 "Salary%"
FROM Emp,
(SELECT SUM(Sal) Tot_Sal
FROM Emp)
GROUP BY Deptno, Tot_Sal;

DEPTNO SUM(SAL)
Salary%
---------- ---------- ---------10
8750 30.1464255
20
10875 37.4677003

30

9400 32.3858742

SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT Deptno, SUM(Sal),


SUM(Sal)/Tot_Sal * 100 "Salary%"
FROM Emp, (SELECT SUM(Sal) Tot_Sal
FROM Emp)
GROUP BY Deptno, Tot_Sal
cl scr

SQL>
2
3
4
5
6

SELECT TO_CHAR(HireDate, 'YYYY') Year,


SUM(Sal),
ROUND(SUM(Sal)/Tot_Sal * 100, 2) "Salary%"
FROM Emp, (SELECT SUM(Sal) Tot_Sal
FROM Emp)
GROUP BY TO_CHAR(HireDate, 'YYYY'), Tot_Sal;

YEAR SUM(SAL)
Salary%
---- ---------- ---------1980
800
2.76
1981
22825
78.64
1982
4300
14.81
1983
1100
3.79
SQL> cl scr
SQL> SELECT COUNT(*) FROM Emp;
COUNT(*)
---------14
SQL> SELECT COUNT(*) FROM Dept;
COUNT(*)
---------4
SQL> SELECT COUNT(*) FROM SalGrade;
COUNT(*)
---------5
SQL>
2
3
4
5
6
7
8

SELECT E.EmpCount, D.DeptCount, S.GradeCnt


FROM
(SELECT COUNT(*) EmpCount
FROM Emp) E,
(SELECT COUNT(*) DeptCount
FROM Dept) D,
(SELECT COUNT(*) GradeCnt FROM
SalGrade) S;

EMPCOUNT DEPTCOUNT GRADECNT


---------- ---------- ---------14
4
5
SQL> SELECT

2
3
4
5
6
7
8
9
10
11
12

E.EmpCount,
D.DeptCount,
S.GradeCnt,
E.EmpCount + D.DeptCount + S.GradeCnt TotalRecCnt
FROM
(SELECT COUNT(*) EmpCount
FROM Emp) E,
(SELECT COUNT(*) DeptCount
FROM Dept) D,
(SELECT COUNT(*) GradeCnt
FROM SalGrade) S;

EMPCOUNT DEPTCOUNT GRADECNT TOTALRECCNT


---------- ---------- ---------- ----------14
4
5
23
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14

SELECT
E.EmpCount,
D.DeptCount,
S.GradeCnt,
E.EmpCount + D.DeptCount + S.GradeCnt TotalRecCnt,
GREATEST(E.EmpCount, D.DeptCount, S.GradeCnt) HighRecinTab,
LEAST(E.EmpCount, D.DeptCount, S.GradeCnt) LowRecinTab
FROM
(SELECT COUNT(*) EmpCount
FROM Emp) E,
(SELECT COUNT(*) DeptCount
FROM Dept) D,
(SELECT COUNT(*) GradeCnt
FROM SalGrade) S;

EMPCOUNT DEPTCOUNT GRADECNT TOTALRECCNT HIGHRECINTAB LOWRECINTAB


---------- ---------- ---------- ----------- ------------ ----------14
4
5
23
14
4
SQL> cl scr
SQL>
2
3
4
5
6
7
8
9
10
11

SELECT A.Deptno "Department Number",


(A.NumEmp / B.TotalCount ) * 100 "%Employees",
(A.SalSum / B.TotalSal ) * 100 "%Salary"
FROM
(SELECT Deptno, COUNT(*) NumEmp,
SUM(Sal) SalSum
FROM Emp
GROUP BY Deptno) A,
(SELECT COUNT(*) TotalCount,
SUM(Sal) TotalSal
FROM Emp) B;

Department Number
----------------10
20
30

%Employees
---------21.4285714
35.7142857
42.8571429

%Salary
---------30.1464255
37.4677003
32.3858742

SQL> cl scr
SQL> SELECT
2 Ename, Deptno, Sal,
3 (SELECT SUM(Sal) FROM Emp) OrgSalSum

4 FROM Emp;
ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------KING
10
5000
29025
BLAKE
30
2850
29025
CLARK
10
2450
29025
JONES
20
2975
29025
MARTIN
30
1250
29025
ALLEN
30
1600
29025
TURNER
30
1500
29025
JAMES
30
950
29025
WARD
30
1250
29025
FORD
20
3000
29025
SMITH
20
800
29025
ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------SCOTT
20
3000
29025
ADAMS
20
1100
29025
MILLER
10
1300
29025
14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT
Ename, Deptno, Sal,
(SELECT SUM(Sal) FROM Emp) OrgSalSum,
(SELECT MAX(Sal) FROM Emp) OrgSalMax,
(SELECT MIN(Sal) FROM Emp) OrgSalMin
FROM Emp
/

ENAME
DEPTNO
SAL ORGSALSUM ORGSALMAX ORGSALMIN
---------- ---------- ---------- ---------- ---------- ---------KING
10
5000
29025
5000
800
BLAKE
30
2850
29025
5000
800
CLARK
10
2450
29025
5000
800
JONES
20
2975
29025
5000
800
MARTIN
30
1250
29025
5000
800
ALLEN
30
1600
29025
5000
800
TURNER
30
1500
29025
5000
800
JAMES
30
950
29025
5000
800
WARD
30
1250
29025
5000
800
FORD
20
3000
29025
5000
800
SMITH
20
800
29025
5000
800
ENAME
DEPTNO
SAL ORGSALSUM ORGSALMAX ORGSALMIN
---------- ---------- ---------- ---------- ---------- ---------SCOTT
20
3000
29025
5000
800
ADAMS
20
1100
29025
5000
800
MILLER
10
1300
29025
5000
800
14 rows selected.
SQL> ed
Wrote file afiedt.buf

1 SELECT
2 Ename, Deptno, Sal,
3 (SELECT SUM(Sal) FROM Emp) OrgSalSum,
4 (SELECT MAX(Sal), MIN(Sal) FROM Emp) OrgSalMax
5* FROM Emp
SQL> /
(SELECT MAX(Sal), MIN(Sal) FROM Emp) OrgSalMax
*
ERROR at line 4:
ORA-00913: too many values
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT
Ename, Deptno, Sal,
(SELECT SUM(Sal) FROM Emp) OrgSalSum,
(SELECT MAX(Sal)||' '||MIN(Sal) FROM Emp) OrgSalMax
FROM Emp
/

ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------ORGSALMAX
-------------------------------------------------------------------------------KING
10
5000
29025
5000 800
BLAKE
5000 800

30

2850

29025

CLARK
5000 800

10

2450

29025

ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------ORGSALMAX
-------------------------------------------------------------------------------JONES
20
2975
29025
5000 800
MARTIN
5000 800

30

1250

29025

ALLEN
5000 800

30

1600

29025

ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------ORGSALMAX
-------------------------------------------------------------------------------TURNER
30
1500
29025
5000 800
JAMES
5000 800

30

950

29025

WARD
5000 800

30

1250

29025

ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------ORGSALMAX
-------------------------------------------------------------------------------FORD
20
3000
29025
5000 800
SMITH
5000 800

20

800

29025

SCOTT
5000 800

20

3000

29025

ENAME
DEPTNO
SAL ORGSALSUM
---------- ---------- ---------- ---------ORGSALMAX
-------------------------------------------------------------------------------ADAMS
20
1100
29025
5000 800
MILLER
5000 800

10

1300

29025

14 rows selected.
SQL> cl scr
SQL> SELECT Ename, E.Deptno, Sal
2 FROM Emp E
3 WHERE E.Sal > (SELECT AVG(Sal)
4
FROM Emp
5
WHERE E1.Deptno = E.Deptno)
6
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT Ename, E.Deptno, Sal


FROM Emp E
WHERE E.Sal > (SELECT AVG(Sal)
FROM Emp E1
WHERE E1.Deptno = E.Deptno)
/

ENAME
DEPTNO
SAL
---------- ---------- ---------KING
10
5000
BLAKE
30
2850
JONES
20
2975
ALLEN
30
1600
FORD
20
3000
SCOTT
20
3000
6 rows selected.

SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT Ename, E.Deptno, Sal


FROM Emp E
WHERE E.Sal > (SELECT AVG(Sal)
FROM Emp E1
WHERE E1.Deptno = E.Deptno)
/

ENAME
DEPTNO
SAL
---------- ---------- ---------KING
10
5000
BLAKE
30
2850
JONES
20
2975
ALLEN
30
1600
FORD
20
3000
SCOTT
20
3000
6 rows selected.
SQL> SELECT Ename, E.Deptno, Sal
2 FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
3
FROM Emp E1
4
GROUP BY Deptno) E1
5
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT Ename, E.Deptno, Sal


FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno) E1
WHERE E.Deptno = E1.Deptno AND
E.Sal > E1.SalAvg
/

ENAME
DEPTNO
SAL
---------- ---------- ---------KING
10
5000
SCOTT
20
3000
FORD
20
3000
JONES
20
2975
ALLEN
30
1600
BLAKE
30
2850
6 rows selected.
SQL>
2
3
4
5
6
SQL>
2
3
4
5
6

SELECT Ename, E.Deptno, Sal


FROM Emp E
WHERE E.Sal > (SELECT AVG(Sal)
FROM Emp E1
WHERE E1.Deptno = E.Deptno)
SELECT Ename, E.Deptno, Sal
FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno) E1
WHERE E.Deptno = E1.Deptno AND
E.Sal > E1.SalAvg

7
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT Ename, E.Deptno, Sal, SalAvg


FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
FROM Emp
GROUP BY Deptno) E1
WHERE E.Deptno = E1.Deptno AND
E.Sal > E1.SalAvg
/

ENAME
DEPTNO
SAL
SALAVG
---------- ---------- ---------- ---------KING
10
5000 2916.66667
SCOTT
20
3000
2175
FORD
20
3000
2175
JONES
20
2975
2175
ALLEN
30
1600 1566.66667
BLAKE
30
2850 1566.66667
6 rows selected.
SQL>
SQL>
2
3
4
5

SET AUTOTRACE ON EXPLAIN


SELECT Ename, E.Deptno, Sal
FROM Emp E
WHERE E.Sal > (SELECT AVG(Sal)
FROM Emp E1
WHERE E1.Deptno = E.Deptno);

ENAME
DEPTNO
SAL
---------- ---------- ---------KING
10
5000
BLAKE
30
2850
JONES
20
2975
ALLEN
30
1600
FORD
20
3000
SCOTT
20
3000
6 rows selected.
Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=6 Card=3 Bytes=99)
1
0 FILTER
2
1
TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=1 Byte
s=33)
3
4

1
3

SORT (AGGREGATE)
TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=1 By
tes=26)

SQL> SELECT Ename, E.Deptno, Sal


2 FROM Emp E, (SELECT Deptno, AVG(Sal) SalAvg
3
FROM Emp
4
GROUP BY Deptno) E1

5 WHERE E.Deptno = E1.Deptno AND


6 E.Sal > E1.SalAvg;
ENAME
DEPTNO
SAL
---------- ---------- ---------KING
10
5000
SCOTT
20
3000
FORD
20
3000
JONES
20
2975
ALLEN
30
1600
BLAKE
30
2850
6 rows selected.
Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=8 Card=3 Bytes=177
)
1
2

0
1

HASH JOIN (Cost=8 Card=3 Bytes=177)


TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14 Byt
es=462)

3
4
5

1
3
4

VIEW (Cost=4 Card=14 Bytes=364)


SORT (GROUP BY) (Cost=4 Card=14 Bytes=364)
TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=14
Bytes=364)

SQL> cl scr
SQL> SELECT Empno, Ename, E.Deptno, Sal, MGR
2 FROM Emp E
3 WHERE E.Sal > (SELECT M.Sal
4
FROM Emp M
5
WHERE M.Empno = E.MGR);
EMPNO
---------7902
7788

ENAME
DEPTNO
SAL
MGR
---------- ---------- ---------- ---------FORD
20
3000
7566
SCOTT
20
3000
7566

Execution Plan
---------------------------------------------------------0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=0 Bytes=3)
1
0 FILTER
2
1
TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=1 Byte
s=59)
3

TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE) (Cost=1 C


ard=1 Bytes=26)

INDEX (UNIQUE SCAN) OF 'EMP_PRIMARY_KEY' (INDEX (UNIQU


E)) (Cost=1 Card=1)

SQL> SET AUTOTRACE ON EXPLAIN


SQL> SET AUTOTRACE OFF EXPLAIN
SQL> cl scr
SQL> SELECT Empno, Ename, E.Deptno, Sal, MGR
2 FROM Emp E
3 WHERE E.Sal > (SELECT M.Sal
4
FROM Emp M
5
WHERE M.Empno = E.MGR);
EMPNO
---------7902
7788

ENAME
DEPTNO
SAL
MGR
---------- ---------- ---------- ---------FORD
20
3000
7566
SCOTT
20
3000
7566

SQL> SELECT Ename, Sal


2 FROM Emp
3 WHERE Empno = 7566;
ENAME
SAL
---------- ---------JONES
2975
SQL> cl scr
SQL>
2
3
4
5
6

SELECT Deptno, Dname


FROM Dept D
Where EXISTS
(SELECT *
FROM Emp E
WHERE D.Deptno = E.Deptno );

DEPTNO
---------10
30
20
SQL>
2
3
4

DNAME
-------------ACCOUNTING
SALES
RESEARCH

SELECT D.Deptno, Dname


FROM Emp E, Dept D
WHERE E.Deptno = D.Deptno
GROUP BY D.Deptno, Dname;

DEPTNO
---------10
20
30

DNAME
-------------ACCOUNTING
RESEARCH
SALES

SQL> ed
Wrote file afiedt.buf
1
2
3*
SQL>

SELECT D.Deptno, Dname


FROM Emp E, Dept D
WHERE E.Deptno = D.Deptno
/
DEPTNO DNAME

---------10
30
10
20
30
30
30
30
30
20
20

-------------ACCOUNTING
SALES
ACCOUNTING
RESEARCH
SALES
SALES
SALES
SALES
SALES
RESEARCH
RESEARCH

DEPTNO
---------20
20
10

DNAME
-------------RESEARCH
RESEARCH
ACCOUNTING

14 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3*
SQL>

SELECT DISTINCT D.Deptno, Dname


FROM Emp E, Dept D
WHERE E.Deptno = D.Deptno
/

DEPTNO
---------10
20
30

DNAME
-------------ACCOUNTING
RESEARCH
SALES

SQL> ed
Wrote file afiedt.buf
1
2
3
4
5*
SQL>

SELECT Deptno, Dname


FROM Dept D
WHERE D.Deptno IN ( SELECT Deptno
FROM Emp E
WHERE D.Deptno = E.Deptno )
/

DEPTNO
---------10
30
20

DNAME
-------------ACCOUNTING
SALES
RESEARCH

SQL> cl scr
SQL>
2
3
4
5
6

SELECT Deptno, Dname


FROM Dept D
WHERE NOT EXISTS
(SELECT *
FROM Emp E
WHERE D.Deptno = E.Deptno);

DEPTNO DNAME
---------- -------------40 OPERATIONS
SQL> cl scr
SQL>
2
3
4
5
6

SELECT E.Ename
FROM Emp E
WHERE EXISTS
(SELECT *
FROM Emp E1
WHERE E1.Empno = E.Mgr);

ENAME
---------BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
SCOTT
ENAME
---------ADAMS
MILLER
13 rows selected.
SQL> SELECT Ename
2 FROM Emp
3 WHERE MGR IS NOT NULL;
ENAME
---------BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
SCOTT
ENAME
---------ADAMS
MILLER
13 rows selected.
SQL> ed

Wrote file afiedt.buf


1
2
3
4
5
6*
SQL>

SELECT E.Ename
FROM Emp E
WHERE NOT EXISTS
(SELECT *
FROM Emp E1
WHERE E1.Empno = E.Mgr)
/

ENAME
---------KING
SQL>
2
3
4
5
6

SELECT E.Ename
FROM Emp E
WHERE EXISTS
(SELECT *
FROM Emp E1
WHERE E1.Mgr = E.Empno);

ENAME
---------KING
BLAKE
JONES
FORD
SCOTT
CLARK
6 rows selected.
SQL> ed
Wrote file afiedt.buf
1
2
3
4
5
6*
SQL>

SELECT E.Ename
FROM Emp E
WHERE NOT EXISTS
(SELECT *
FROM Emp E1
WHERE E1.Mgr = E.Empno)
/

ENAME
---------TURNER
WARD
MARTIN
ALLEN
MILLER
SMITH
ADAMS
JAMES
8 rows selected.
SQL> SELECT Ename
2 FROM Emp;
ENAME

---------KING
BLAKE
CLARK
JONES
MARTIN
ALLEN
TURNER
JAMES
WARD
FORD
SMITH
ENAME
---------SCOTT
ADAMS
MILLER
14 rows selected.
SQL> SPOOL OFF

Вам также может понравиться