Sie sind auf Seite 1von 88

Views

Views are known as logical tables. They represent the data of one of more tables. A view derives
its data from the tables on which it is based. These tables are called base tables. Views can be
based on actual tables or another view also.
Whatever DML operations you performed on a view they actually affect the base table of the
view. You can treat views same as any other table. You can Query, Insert, Update and delete
from views, just as any other table.
Views are very powerful and handy since they can be treated just like any other table but do not
occupy the space of a table.
The following sections explain how to create, replace, and drop views using SQL commands.

Creating Views
Suppose we have EMP and DEPT table. To see the empno, ename, sal, deptno, department name
and location we have to give a join query like this.
select e.empno,e.ename,e.sal,e.deptno,d.dname,d.loc
From emp e, dept d where e.deptno=d.deptno;
So everytime we want to see emp details and department names where they are working we have
to give a long join query. Instead of giving this join query again and again, we can create a view
on these table by using a CREATE VIEW command given below
create view emp_det as select e.empno,
e.ename,e.sal,e.deptno,d.dname,d.loc
from emp e, dept d where e.deptno=d.deptno;
Now to see the employee details and department names we dont have to give a join query, we
can just type the following simple query.
select * from emp_det;
This will show same result as you have type the long join query. Now you can treat this
EMP_DET view same as any other table.
For example, suppose all the employee working in Department No. 10 belongs to accounts
department and most of the time you deal with these people. So every time you have to give a
DML or Select statement you have to give a WHERE condition like .....WHERE
DEPTNO=10. To avoid this, you can create a view as given below

Alter view to recompile

SQL>
SQL>
SQL>
2
3

create table t(
id number,
data varchar2(200) );

Table created.
SQL>
SQL>
SQL>
2
3

create or replace view view_t as


select id view_id, data view_data
from t;

View created.
SQL>
SQL>

alter view view_t compile;

View altered.
SQL>
SQL>
SQL>

drop table t;

Table dropped.

Oracle PL / SQL View Create View


1>

Create or replace a view

SQL>
SQL>
2
3

create table t(
id number,
data varchar2(200) );

Table created.
SQL>
SQL>
SQL>
2
3

create or replace view view_t as


select id view_id, data view_data
from t;

View created.
SQL>
SQL>

select * from view_t;

no rows selected
SQL>
SQL> drop table t;
Table dropped.
SQL>

2>

Create view without indiating the column name

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.
SQL> insert into Employee(ID,

First_Name, Last_Name, Start_Date,

End_

2
3

values('06','Linda',

'Green',

to_date('19870730','YYYYMMDD'), to_d

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

8 rows selected.
SQL>
SQL>
SQL>
SQL> -- Create View
SQL>
SQL>
SQL>
SQL>
SQL> CREATE VIEW EmployeeView AS
2
select First_Name, Last_Name from Employee;
View created.
SQL>
SQL>
SQL> SELECT * FROM EmployeeView ORDER BY First_Name;
FIRST_NAME LAST_NAME

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

---------Alison
Celia
David
James
James
Jason
Linda
Robert

---------Mathews
Rice
Larry
Smith
Cat
Martin
Green
Black

8 rows selected.
SQL>
SQL> drop view EmployeeView;
View dropped.
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>
SQL>

create force view

SQL>
SQL>
SQL>
2

create view invalid_view as


select * from table_that_does_not_exist;
select * from table_that_does_not_exist
*
ERROR at line 2:
ORA-00942: table or view does not exist
SQL>
SQL>

create force view invalid_view as

select * from table_that_does_not_exist;

Warning: View created with compilation errors.


SQL>
SQL>

drop view invalid_view;

View dropped.
SQL>
SQL>

create materialized view

SQL>
SQL>
SQL> CREATE TABLE employees
2 ( employee_id
3
last_name
4
email
5
hire_date
6
job_id
7
department_id
8
salary
9
manager_id
10 );

number(10)
varchar2(50)
varchar2(30),
date,
varchar2(30),
number(10),
number(6),
number(6)

not null,
not null,

Table created.

SQL>
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values ( 1001, 'Lawson', 'lawson@g.com', '01-JAN-2002','MGR', 3
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values ( 1002, 'Wells', 'wells@g.com', '01-JAN-2002', 'DBA', 20
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1003, 'Bliss', 'bliss@g.com', '01-JAN-2002', 'PROG', 2
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1004, 'Kyte', 'tkyte@a.com', SYSDATE-3650, 'MGR',2500
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1005, 'Viper', 'sdillon@a .com', SYSDATE, 'PROG', 2000
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1006, 'Beck', 'clbeck@g.com', SYSDATE, 'PROG', 20000,
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1007, 'Java', 'java01@g.com', SYSDATE, 'PROG', 20000,
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, sala
2
values( 1008, 'Oracle', 'wvelasq@g.com', SYSDATE, 'DBA', 20000
1 row created.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10

set timing off


create materialized view my_orders_mv
build immediate
refresh on commit
enable query rewrite
as
select employee_id,
count(*) total_orders
from employees
group by employee_id
/
from employees
*

ERROR at line 8:
ORA-00439: feature not enabled: Materialized view rewrite
SQL>
SQL> set timing on
SQL> select * from my_orders_mv;
select * from my_orders_mv
*
ERROR at line 1:
ORA-00942: table or view does not exist
Elapsed: 00:00:00.07
SQL> set timing off
SQL> drop table employees;
Table dropped.
SQL>
SQL>

Create a view with check option

SQL>
SQL>
SQL> CREATE TABLE departments
2 (department_id
number(10)
not null,
3
department_name
varchar2(50)
not null,
4
CONSTRAINT departments_pk PRIMARY KEY (department_id)
5 );
Table created.
SQL>
SQL>
SQL>
SQL> insert into departments ( department_id, department_name )
2
values( 1,
'Data Group' );

1 row created.
SQL>
SQL> insert into departments ( department_id, department_name )
2
values( 2,
'Purchasing' );
1 row created.
SQL>
SQL> insert into departments ( department_id, department_name )
2
values( 3,
'Call Center' );
1 row created.
SQL>
SQL> insert into departments ( department_id, department_name )
2
values( 4,
'Communication' );
1 row created.
SQL>
SQL>
SQL>
SQL> CREATE TABLE employees
2 ( employee_id
3
last_name
4
email
5
hire_date
6
job_id
7
department_id
8
salary
9
manager_id
10
CONSTRAINT
11
CONSTRAINT
12 );

number(10)
not null,
varchar2(50)
not null,
varchar2(30),
date,
varchar2(30),
number(10),
number(6),
number(6),
employees_pk PRIMARY KEY (employee_id),
fk_departments FOREIGN KEY (department_id) REFERENCES d

Table created.

SQL>
SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values ( 1001, 'Lawson', 'lawson@g.com', '01-JAN-2002','MGR', 30
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values ( 1002, 'Wells', 'wells@g.com', '01-JAN-2002', 'DBA', 200
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar

values( 1003, 'Bliss', 'bliss@g.com', '01-JAN-2002', 'PROG', 24

1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values( 1004, 'Kyte', 'tkyte@a.com', SYSDATE-3650, 'MGR',25000
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values( 1005, 'Viper', 'sdillon@a .com', SYSDATE, 'PROG', 20000
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values( 1006, 'Beck', 'clbeck@g.com', SYSDATE, 'PROG', 20000, 2
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values( 1007, 'Java', 'java01@g.com', SYSDATE, 'PROG', 20000, 3
1 row created.

SQL>
SQL> insert into employees( employee_id, last_name, email, hire_date, job_id, salar
2
values( 1008, 'Oracle', 'wvelasq@g.com', SYSDATE, 'DBA', 20000,
1 row created.
SQL>
SQL>
SQL>
SQL>
2
3
4
5

create or
select
from
where
with

replace view department_10 as


*
employees
department_id = 10
check option;

View created.
SQL>
SQL>
SQL> drop table employees cascade constraints;
Table dropped.
SQL> drop table departments cascade constraints;
Table dropped.

SQL>

Create view by join three tables

SQL>
2
3
4
5
6
7
8
9
10
11

create table
( empno
, ename
, init
, job
, mgr
, bdate
, sal
, comm
, deptno
) ;

emp
NUMBER(4)
VARCHAR2(8)
VARCHAR2(5)
VARCHAR2(8)
NUMBER(4)
DATE
NUMBER(6,2)
NUMBER(6,2)
NUMBER(2)

constraint E_PK primary key

default 10

Table created.
SQL> insert into emp values(1,'Tom','N',

'TRAINER', 13,date '1965-12-17',

800 , NU

1 row created.
SQL> insert into emp values(2,'Jack','JAM', 'Tester',6,date '1961-02-20',

1600, 300,

1 row created.
SQL> insert into emp values(3,'Wil','TF' ,

'Tester',6,date '1962-02-22',

1250, 500,

1 row created.
SQL> insert into emp values(4,'Jane','JM',

'Designer', 9,date '1967-04-02',

2975, N

1 row created.
SQL> insert into emp values(5,'Mary','P',
1 row created.

'Tester',6,date '1956-09-28',

1250, 1400,

SQL> insert into emp values(6,'Black','R',

'Designer', 9,date '1963-11-01',

2850,

'Designer', 9,date '1965-06-09',

2450,

1 row created.
SQL> insert into emp values(7,'Chris','AB',
1 row created.
SQL> insert into emp values(8,'Smart','SCJ', 'TRAINER', 4,date '1959-11-26',

3000, N

1 row created.
SQL> insert into emp values(9,'Peter','CC',

'Designer',NULL,date '1952-11-17',

500

1 row created.
SQL> insert into emp values(10,'Take','JJ', 'Tester',6,date '1968-09-28',

1500, 0,

1 row created.
SQL> insert into emp values(11,'Ana','AA',

'TRAINER', 8,date '1966-12-30',

1100, NU

1 row created.
SQL> insert into emp values(12,'Jane','R',

'Manager',

6,date '1969-12-03',

800 ,

1 row created.
SQL> insert into emp values(13,'Fake','MG',

'TRAINER', 4,date '1959-02-13',

3000,

1 row created.
SQL> insert into emp values(14,'Mike','TJA','Manager',

7,date '1962-01-23',

1 row created.
SQL>
SQL>
2
3
4
5
6

create table departments


( deptno NUMBER(2)
constraint D_PK primary key
, dname VARCHAR2(10)
, location VARCHAR2(8)
, mgr
NUMBER(4)
) ;

Table created.
SQL>
SQL> insert into departments values (10,'ACCOUNTING','NEW YORK',7);
1 row created.
SQL> insert into departments values (20,'TRAINING',
1 row created.

'DALLAS',

4);

1300,

SQL> insert into departments values (30,'SALES',

'CHICAGO', 6);

1 row created.
SQL> insert into departments values (40,'HR',
1 row created.
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11
12

create
select
,
,
,
,
,
from

view empdept_v as
e.empno
e.ENAME
e.init
d.dname
d.location
m.ENAME
as Designer
emp
e
join
departments d using (deptno)
join
emp
m on (m.empno = d.mgr);

SQL> drop table emp;


Table dropped.
SQL> drop table departments;
Table dropped.

Create view on single field of a type

SQL> create type addressType as object


2 (Street
VARCHAR2(50),

'BOSTON',

9);

3
4
5
6
SQL>
SQL>
2
3
4
SQL>
SQL>
SQL>
2
3
4
SQL>
SQL>
SQL>
2
3
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>

City
State
Zip
/

VARCHAR2(25),
CHAR(2),
NUMBER);

create type personType as object


(Name
VARCHAR2(25),
Address addressType);
/
create or replace type personType as object
(Name
VARCHAR2(25),
Address addressType);
/
create table myemp
(cid
NUMBER,
Person
personType);

insert into myemp values(1,personType('SomeName',addressType('StreetValue','CityV


create index empview
on myemp(Person.Address.City);
drop table myemp;
drop type personType;
drop type addressType;

CREATE MATERIALIZED VIEW with


TABLESPACE

SQL> create table emp(


2
ID
VARCHAR2(4 BYTE)
,
3
fname
VARCHAR2(10 BYTE),
4
lname
VARCHAR2(10 BYTE),
5
Start_Date
DATE,
6
End_Date
DATE,
7
Salary
Number(8,2),
8
City
VARCHAR2(10 BYTE),
9
Description
VARCHAR2(15 BYTE)
10 )
11 /

NOT NULL

Table created.
SQL>
SQL> CREATE MATERIALIZED VIEW LOG ON emp
2
PCTFREE 5
3
TABLESPACE mv_logs
4
STORAGE (INITIAL 1M NEXT 1M) WITH ROWID;
SQL>
SQL>
SQL> drop view log;
SQL>
SQL> drop table emp;
Table dropped.

create materialized view emp_dept build immediate refresh on demand e

SQL> CREATE TABLE EMP(


2
EMPNO NUMBER(4) NOT NULL,
3
ENAME VARCHAR2(10),

4
5
6
7
8
9
10
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10

JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2)
);
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP
EMP

VALUES(7369,
VALUES(7499,
VALUES(7521,
VALUES(7566,
VALUES(7654,
VALUES(7698,
VALUES(7782,
VALUES(7788,
VALUES(7839,
VALUES(7844,
VALUES(7876,
VALUES(7900,
VALUES(7902,
VALUES(7934,

'SMITH', 'CLERK', 7902,TO_DATE('17-DEC-1980', 'DD-MON


'ALLEN', 'SALESMAN', 7698,TO_DATE('20-FEB-1981', 'DD'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-M
'JONES', 'MANAGER', 7839,TO_DATE('2-APR-1981', 'DD-MO
'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD
'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MO
'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MO
'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-M
'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON
'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON
'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MO

CREATE TABLE DEPT(


DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13)
);
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO

DEPT
DEPT
DEPT
DEPT

VALUES
VALUES
VALUES
VALUES

(10,
(20,
(30,
(40,

'ACCOUNTING', 'NEW YORK');


'RESEARCH', 'DALLAS');
'SALES', 'CHICAGO');
'OPERATIONS', 'BOSTON');

create materialized view emp_dept


build immediate
refresh on demand
enable query rewrite
as
select dept.deptno, dept.dname, count (*)
from emp, dept
where emp.deptno = dept.deptno
group by dept.deptno, dept.dname
/

SQL>
SQL> begin
2
dbms_stats.set_table_stats( user, 'EMP', numrows => 100000 );
3
dbms_stats.set_table_stats( user, 'DEPT', numrows => 1000 );
4 end;
5 /
SQL>

SQL>
SQL> drop table emp;
SQL>
SQL> drop table dept;

Add a comment on a table

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
En
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> --Add a comment on a table, you can issue the following command:
SQL>
SQL> COMMENT ON TABLE Employee IS 'This is a table for Employee.';
Comment created.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /

Table dropped.
SQL>
SQL>

Remove a comment from table

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
En
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


En
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- Remove a comment from table:
SQL>
SQL> COMMENT ON COLUMN Employee.First_Name IS '';
Comment created.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.

SQL>
SQL>

Comment on table column

COMMENT ON COLUMN jobs.job_id


IS 'Primary key of jobs table.';

Print out comment for a given table

set linesize 78
set verify off
variable tname varchar2(200)
begin
:tname := upper('&1');
end;
/
prompt
select
from
where
/

Table comments for table &1


comments
user_tab_comments
table_name = :tname

prompt
select
from
where
order
/

Column comments for table &1


column_name, comments
user_col_comments
table_name = :tname
by column_name

Comment table and check user_col_comments

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

create table emp


( empno
NUMBER(4)
, ename
VARCHAR2(8)
, init
VARCHAR2(5)
, job
VARCHAR2(8)
, mgr
NUMBER(4)
, bdate
DATE
, sal
NUMBER(6,2)
, comm
NUMBER(6,2)
, deptno
NUMBER(2)
) ;

constraint E_PK primary key

default 10

Table created.
SQL>
SQL>
2
3
4
5
6
7

create table
( grade
, lowerlimit
, upperlimit
, bonus
, constraint
) ;

salary
NUMBER(2)
constraint S_PK primary key
NUMBER(6,2)
NUMBER(6,2)
NUMBER(6,2)
S_LO_UP_CHK check (lowerlimit <= upperlimit)

Table created.
SQL>
SQL> comment on table salary
2 is
'Salary grades and net bonuses';
Comment created.
SQL>
SQL> comment on column emp.comm

is

'For sales reps only';

Comment created.
SQL>
SQL> select comments
2 from
user_tab_comments
3 where table_name = 'SALARY';
SQL>
SQL>
2
3
4

select
from
where
and

comments
user_col_comments
table_name = 'EMP'
column_name = 'COMM';

no rows selected
SQL>
SQL> drop table emp;
Table dropped.
SQL> drop table salary;
Table dropped.

Create and drop SYNONYM

SQL>
SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL>

SQL> CREATE SYNONYM ShorterNameForEmployee FOR Employee;


Synonym created.
SQL>
SQL>
SQL> select * from ShorterNameForEmployee;
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

8 rows selected.
SQL>
SQL>
SQL> DROP SYNONYM ShorterNameForEmployee;
Synonym dropped.
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>

Create external table with data path specified

SQL> -- external table


SQL>
SQL> create directory ext_data_files
2
as 'D:\ORACLE\ORA90\EXTERNAL';
Directory created.

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

SQL>

To create an index on the LastName column of the Employee table

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

8 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> --To create an index on the LastName column of the Employee table
SQL>
SQL> CREATE INDEX LastNameIndex
2
ON Employee (Last_Name);
Index created.
SQL>
SQL>
SQL>

drop index LastNameIndex;

Index dropped.
SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>
SQL>

Created an index based on the uppercase evaluation of the employe's first name field

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

8 rows selected.

SQL>
SQL>
SQL> -- Created an index based on the uppercase evaluation of the employe's first name fie
SQL>
SQL> CREATE INDEX employee_idx
2
ON employee (UPPER(first_name));
Index created.
SQL>
SQL>

drop index employee_idx;

Index dropped.
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>

Create a fully indexed table named myCode

SQL>
SQL> create table myCode(
2
codeValue VARCHAR2(1) primary key,
3
Description VARCHAR2(25)
4 );
Table created.
SQL>
SQL> create index i1 on myCode (codeValue, Description);
Index created.
SQL>
SQL>
SQL> drop index i1;
Index dropped.
SQL>
SQL> drop table myCode;

Table dropped.

Create Non-Unique index


SQL>
SQL>
SQL> CREATE TABLE myTable (
2
myTableID INT PRIMARY KEY NOT NULL,
3
Name
VARCHAR(50),
4
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone');
Table created.
SQL>
SQL>
SQL> CREATE INDEX NameIndex ON myTable (Name);
Index created.

SQL>

create unique index with case ... when statement


SQL>
2
3
4
5
6
7

create table registrations


( attendee
NUMBER(4)
, course
VARCHAR2(6)
, begindate
DATE
, evaluation NUMBER(1)
, constraint R_PK
primary key(attendee,course,begindate)
) ;

Table created.
SQL>
SQL> insert into registrations values (8,'JAV',date '2009-12-13',5

);

1 row created.
SQL> insert into registrations values (9,'JAV',date '2009-12-13',4

);

1 row created.
SQL> insert into registrations values (4,'JAV',date '2000-02-01',3

);

1 row created.
SQL> insert into registrations values (8,'JAV',date '2000-02-01',4

);

1 row created.
SQL> insert into registrations values (6,'JAV',date '2000-02-01',5

);

1 row created.
SQL> insert into registrations values (12,'XML',date '2000-02-03',4

);

1 row created.
SQL> insert into registrations values (2,'XML',date '2000-02-03',5

);

1 row created.
SQL> insert into registrations values (4,'PLS',date '2000-09-11',NULL);
1 row created.
SQL> insert into registrations values (2,'PLS',date '2000-09-11',NULL);
1 row created.
SQL> insert into registrations values (11,'PLS',date '2000-09-11',NULL);
1 row created.
SQL>
SQL> create unique index oau_reg on registrations
2 ( case course when 'OAU' then attendee else null end
3 , case course when 'OAU' then course
else null end );
Index created.
SQL>
SQL> insert into registrations values (12,'OAU',sysdate,null);
1 row created.
SQL>
SQL> drop index oau_reg;
Index dropped.
SQL> drop table registrations;

Table dropped.

Demonstrate a bitmap join index.


SQL>
SQL>
SQL> CREATE TABLE EMP(
2
EMPNO NUMBER(4) NOT NULL,
3
ENAME VARCHAR2(10),
4
JOB VARCHAR2(9),
5
MGR NUMBER(4),
6
startDate DATE,
7
SAL NUMBER(7, 2),
8
COMM NUMBER(7, 2),
9
DEPTNO NUMBER(2)
10 );
Table created.

SQL>
SQL> INSERT INTO EMP VALUES(7369, 'SMITH', 'CLERK', 7902,TO_DATE('17-DEC-1980', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES(7499, 'ALLEN', 'SALESMAN', 7698,TO_DATE('20-FEB-1981', 'DD-MON


1 row created.

SQL> INSERT INTO EMP VALUES(7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES(7566, 'JONES', 'MANAGER', 7839,TO_DATE('2-APR-1981', 'DD-MON-Y


1 row created.

SQL> INSERT INTO EMP VALUES(7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-MO


1 row created.

SQL> INSERT INTO EMP VALUES(7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON-Y


1 row created.

SQL> INSERT INTO EMP VALUES(7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON-Y


1 row created.

SQL> INSERT INTO EMP VALUES(7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES(7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MON


1 row created.

SQL> INSERT INTO EMP VALUES(7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MON


1 row created.

SQL> INSERT INTO EMP VALUES(7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-YY


1 row created.

SQL> INSERT INTO EMP VALUES(7900, 'E', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YYYY'),


1 row created.

SQL> INSERT INTO EMP VALUES(7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-YY


1 row created.

SQL> INSERT INTO EMP VALUES(7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON-Y


1 row created.
SQL>
SQL> CREATE TABLE DEPT(
2
DEPTNO NUMBER(2),
3
DNAME VARCHAR2(14),
4
LOC VARCHAR2(13)
5 );
Table created.
SQL>
SQL> INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
1 row created.
SQL> INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
1 row created.
SQL> INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
1 row created.
SQL> INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

1 row created.
SQL>
SQL> select count(*) from emp, dept where emp.deptno = dept.deptno and dept.dname = 'SALES

COUNT(*)
---------6
1 row selected.
Execution Plan
---------------------------------------------------------Plan hash value: 2157540364
------------------------------------| Id | Operation
| Name |
------------------------------------|
0 | SELECT STATEMENT
|
|
|
1 | SORT AGGREGATE
|
|
|
2 |
MERGE JOIN
|
|
|
3 |
SORT JOIN
|
|
|* 4 |
TABLE ACCESS FULL| DEPT |
|* 5 |
SORT JOIN
|
|
|
6 |
TABLE ACCESS FULL| EMP |
------------------------------------Predicate Information (identified by operation id):
--------------------------------------------------4 - filter("DEPT"."DNAME"='SALES')
5 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
filter("EMP"."DEPTNO"="DEPT"."DEPTNO")
Note
----- rule based optimizer used (consider using cbo)
Statistics
---------------------------------------------------------1 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
411 bytes sent via SQL*Net to client
380 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
SQL> set autotrace off;
SQL>
SQL> drop table emp;
Table dropped.

SQL> drop table dept;


Table dropped.
SQL>
SQL>

Create two indexes for one single table

create table indextest as


select * from dba_objects where owner in ('OUTLN','PUBLIC','SCOTT','SYS','SYSTEM');
create index indxtest_objname_idx on indextest (object_name) pctfree 10;
create index indxtest_objname_fidx on indextest(upper(object_name));
select object_name,owner from indextest
where upper(object_name) ='DBA_INDEXES';
select upper(object_name) from indextest;
alter table indextest modify object_name NOT NULL;
select upper(object_name) from indextest;
drop table indextest;

Create an index reverse

SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),

7
8

COMM NUMBER(7, 2),


DEPTNO NUMBER(2));

Table created.
SQL>
SQL> create index emp_empno_pk
2 on emp(empno) reverse;
Index created.
SQL>
SQL> drop table emp;
Table dropped.
SQL>

Function-based Indexes
SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> create index upper_name_idx on emp(upper(ename));
Index created.
SQL>
SQL>
SQL> drop table EMP;
Table dropped.
SQL>
SQL>

Create index for combined columns


SQL>
SQL> create table emp(
2
emp_id
3
,lastname
4
,firstname
5
,midinit
6
,street
7
,city
8
,state
9
,zip
10
,shortZipCode
11
,area_code
12
,phone
13
,company_name

integer
primary key
varchar2(20)
not null
varchar2(15)
not null
varchar2(1)
varchar2(30)
varchar2(20)
varchar2(2)
varchar2(5)
varchar2(4)
varchar2(3)
varchar2(8)
varchar2(50));

Table created.
SQL>
SQL> create index fullname on emp(lastname, firstname);
Index created.
SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>

Create index for upper case last name


SQL>
SQL> create table emp(
2
emp_id
3
,lastname
4
,firstname
5
,midinit
6
,street

integer
varchar2(20)
varchar2(15)
varchar2(1)
varchar2(30)

primary key
not null
not null

7
8
9
10
11
12
13

,city
,state
,zip
,shortZipCode
,area_code
,phone
,company_name

varchar2(20)
varchar2(2)
varchar2(5)
varchar2(4)
varchar2(3)
varchar2(8)
varchar2(50));

Table created.
SQL>
SQL> create index upper_emp_idx on emp upper(lastname);
Index created.
SQL>
SQL>
SQL> drop table emp;
Table dropped.

CREATE UNIQUE INDEX

SQL>
SQL> CREATE TABLE myTable (
2
myTableID INT PRIMARY KEY NOT NULL,
3
Name
VARCHAR(50),
4
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone');
Table created.
SQL>
SQL> CREATE UNIQUE INDEX NameIndex ON myTable (Name);
Index created.
SQL>
SQL> drop table myTable;
Table dropped.

ALTER INDEX to COMPUTE STATISTICS

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

8 rows selected.
SQL>
SQL>
SQL> CREATE INDEX employee_idx
2
ON employee (first_name, city)
3
COMPUTE STATISTICS;
Index created.
SQL>
SQL>
SQL> -- Collect Statistics on an Index
SQL>
SQL> ALTER INDEX employee_idx
2
REBUILD COMPUTE STATISTICS;
Index altered.
SQL>
SQL> select first_name, city from employee;
FIRST_NAME CITY
---------- ----------

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

Jason
Alison
James
Celia
Robert
Linda
David
James

Toronto
Vancouver
Vancouver
Vancouver
Vancouver
New York
New York
Vancouver

8 rows selected.
SQL>
SQL> drop index employee_idx;
Index dropped.
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>

Drop an index demo

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04

Employee's Fi
------------Jason
Alison
James
Celia

LAST_NAME
---------Martin
Mathews
Smith
Rice

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06 $1,234.56 Toronto
21-FEB-86 $6,661.78 Vancouver
15-MAR-90 $6,544.78 Vancouver
21-APR-99 $2,344.78 Vancouver

DESCRIPTION
--------------Programmer
Tester
Tester
Manager

05
06
07
08

Robert
Linda
David
James

Black
Green
Larry
Cat

15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

08-AUG-98
04-JAN-96
12-FEB-98
15-APR-02

$2,334.78
$4,322.78
$7,897.78
$1,232.78

8 rows selected.
SQL>
SQL>
SQL>
SQL> CREATE INDEX employee_idx
2
ON employee (first_name);
Index created.
SQL>
SQL>
SQL> drop index employee_idx;
Index dropped.
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>

Alter index: rename an index

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

Table created.
SQL>

NOT NULL,

Vancouver
New York
New York
Vancouver

Tester
Tester
Manager
Tester

SQL> -- prepare data


SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /

ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
6661.78 Vancouver
15-MAR-90
6544.78 Vancouver
21-APR-99
2344.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
4322.78 New York
12-FEB-98
7897.78 New York
15-APR-02
1232.78 Vancouver

8 rows selected.
SQL>
SQL>
SQL> CREATE INDEX employee_idx
2
ON employee (first_name, city)
3
COMPUTE STATISTICS;
Index created.
SQL>
SQL>
SQL>
SQL> ALTER INDEX employee_idx
2
RENAME TO employee_index_Newname;
Index altered.
SQL>
SQL>
SQL> drop index employee_index_Newname;
Index dropped.
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>

Create a SEQUENCE and retrieve the value

SQL>
SQL> CREATE SEQUENCE supplier_seq

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

2
3
4
5
6

MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;

Sequence created.
SQL>
SQL> select supplier_seq.nextval from dual;
NEXTVAL
---------1
SQL> select supplier_seq.nextval from dual;
NEXTVAL
---------2
SQL> select supplier_seq.nextval from dual;
NEXTVAL
---------3
SQL> select supplier_seq.nextval from dual;
NEXTVAL
---------4
SQL>
SQL> drop sequence supplier_seq;
Sequence dropped.
SQL>
SQL>

If id is null, use the value from sequence


SQL>
SQL> create table myTable(
2
id
number primary key,
3
blob_content blob
4 )
5 /

Table created.
SQL>
SQL> create sequence myTable_seq
2 /
Sequence created.
SQL>
SQL>
2
3
4
5
6
7
8
9

create or replace trigger biu_myTable


before insert or update on myTable
for each row
begin
if :new.id is null then
select myTable_seq.nextval into :new.id from dual;
end if;
end;
/

Trigger created.
SQL> drop table myTable;
Table dropped.
SQL> drop sequence myTable_seq;
Sequence dropped.

CREATE SEQUENCE myTableIDSeq INCREMENT BY 1 START WITH


SQL>
SQL>
SQL>
SQL> CREATE SEQUENCE myTableIDSeq INCREMENT BY 1 START WITH 1000;
Sequence created.

Use dual table to check sequence

SQL>
SQL> create sequence deptno_seq
2 start with 50 increment by 10;

Sequence created.
SQL>
SQL> select deptno_seq.nextval, deptno_seq.currval
2 from
dual;
NEXTVAL
CURRVAL
---------- ---------50
50
SQL>
SQL> select deptno_seq.currval
2 from
dual;
CURRVAL
---------50
SQL>
SQL> select deptno_seq.currval, deptno_seq.nextval
2 from
dual;
CURRVAL
NEXTVAL
---------- ---------60
60
SQL>
SQL>
SQL> drop sequence deptno_seq;
Sequence dropped.

create sequence emps_seq start with 501 increment by 10

SQL>
SQL> create sequence emps_seq
2
start with 501
3
increment by 10;
Sequence created.
SQL>
SQL> drop sequence emps_seq;
Sequence dropped.
SQL>
SQL>

Use a Cartesian product/virtual table like this:

SQL>
SQL>
2
3
4
5
6
7
8
9

-- create demo table


create table Employee(
empno
Number(3) NOT NULL, -- Employee ID
ename
VARCHAR2(10 BYTE),
-- Employee Name
hireDate
DATE,
-- Date Employee Hired
orig_salary
Number(8,2),
-- Orignal Salary
curr_salary
Number(8,2),
-- Current Salary
region
VARCHAR2(1 BYTE)
-- Region where employeed
)
/

Table created.
SQL>
SQL> create table job(
2
empno
3
jobtitle
4 )
5 /

Number(3) NOT NULL, -- Employee ID


VARCHAR2(10 BYTE)
-- Employee job title

SQL> -- prepare data for employee table

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(122,'Alison',to_date('19960321','YYYYMMDD'), 45000,
48000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(123, 'James',to_date('19781212','YYYYMMDD'), 23000,
32000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(104,'Celia',to_date('19821024','YYYYMMDD'), 53000,
58000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(105,'Robert',to_date('19840115','YYYYMMDD'), 31000,
36000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(116,'Linda', to_date('19870730','YYYYMMDD'), 43000,
53000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(117,'David', to_date('19901231','YYYYMMDD'), 78000,
85000,
3 /
1 row created.

SQL> insert into Employee(empno, ename, hireDate,


orig_salary, cur
2
values(108,'Jode', to_date('19960917','YYYYMMDD'), 21000,
29000,
3 /
1 row created.
SQL>
SQL>
SQL> select * from employee;
EMPNO
---------122
123
104
105
116
117
108

ENAME
---------Alison
James
Celia
Robert
Linda
David
Jode

HIREDATE ORIG_SALARY CURR_SALARY R


--------- ----------- ----------- 21-MAR-96
45000
48000 E
12-DEC-78
23000
32000 W
24-OCT-82
53000
58000 E
15-JAN-84
31000
36000 W
30-JUL-87
43000
53000 E
31-DEC-90
78000
85000 W
17-SEP-96
21000
29000 E

7 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5

-- The Use of Aggregate Functions in SQL


-- Use a Cartesian product/virtual table like this:
SELECT e.empno, e.ename, e.orig_salary,
x.aos "Avg. salary"
FROM employee e,
(SELECT AVG(orig_salary) aos FROM employee) x
ORDER BY ename;

EMPNO
---------122
104
117
123
108
116
105

ENAME
ORIG_SALARY Avg. salary
---------- ----------- ----------Alison
45000
42000
Celia
53000
42000
David
78000
42000
James
23000
42000
Jode
21000
42000
Linda
43000
42000
Robert
31000
42000

7 rows selected.
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>
SQL>

Cross joins Demo

SQL> CREATE TABLE Employee(Employee_ID NUMBER(4) NOT NULL,


2
Employee_Name VARCHAR2(10),
3
JOB VARCHAR2(9),
4
Manager_ID NUMBER(4),
5
Start_Date DATE,
6
Salary NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
Deparment_ID NUMBER(2)
9 );
Table created.
SQL>
SQL> INSERT INTO Employee VALUES (7369, 'SMITH',

'CLERK',

7902, TO_DATE('17-DEC-1980'

'SALESMAN',

7698, TO_DATE('20-FEB-1981'

'SALESMAN',

7698, TO_DATE('22-FEB-1981'

'MANAGER',

7839, TO_DATE('2-APR-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7499, 'ALLEN',
1 row created.
SQL> INSERT INTO Employee VALUES (7521, 'WARD',
1 row created.
SQL> INSERT INTO Employee VALUES (7566, 'JONES',
1 row created.
SQL> INSERT INTO Employee VALUES (7654, 'MARTIN', 'SALESMAN',

7698, TO_DATE('28-SEP-1981'

1 row created.
SQL> INSERT INTO Employee VALUES (7698, 'BLAKE',

'MANAGER',

7839, TO_DATE('1-MAY-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7782, 'CLARK',

'MANAGER',

7839, TO_DATE('9-JUN-1981',

'ANALYST',

7566, TO_DATE('09-DEC-1982'

1 row created.
SQL> INSERT INTO Employee VALUES (7788, 'SCOTT',
1 row created.
SQL> INSERT INTO Employee VALUES (7839, 'KING',

'PRESIDENT', NULL, TO_DATE('17-NOV-1981'

1 row created.
SQL> INSERT INTO Employee VALUES (7844, 'TURNER', 'SALESMAN',

7698, TO_DATE('8-SEP-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7876, 'ADAMS',

'CLERK',

7788, TO_DATE('12-JAN-1983'

'CLERK',

7698, TO_DATE('3-DEC-1981',

'ANALYST',

7566, TO_DATE('3-DEC-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7900, 'JAMES',
1 row created.
SQL> INSERT INTO Employee VALUES (7902, 'FORD',
1 row created.
SQL> INSERT INTO Employee VALUES (7934, 'MILLER', 'CLERK',

7782, TO_DATE('23-JAN-1982'

1 row created.
SQL>
SQL> CREATE TABLE Department(Department_ID NUMBER(2),
2
Department_Name VARCHAR2(14),
3
Location VARCHAR2(13)
4 );
Table created.
SQL>
SQL> INSERT INTO Department VALUES (10, 'ACCOUNTING', 'NEW YORK');
1 row created.
SQL> INSERT INTO Department VALUES (20, 'RESEARCH',

'DALLAS');

1 row created.
SQL> INSERT INTO Department VALUES (30, 'SALES',
1 row created.

'CHICAGO');

SQL> INSERT INTO Department VALUES (40, 'OPERATIONS', 'BOSTON');


1 row created.
SQL>
SQL> select * from Employee;
EMPLOYEE_ID
----------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876

EMPLOYEE_N
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

JOB
MANAGER_ID START_DAT
SALARY
COMM DEPARMENT_ID
--------- ---------- --------- ---------- ---------- -----------CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 09-DEC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 12-JAN-83
1100
20

EMPLOYEE_ID
----------7900
7902
7934

EMPLOYEE_N
---------JAMES
FORD
MILLER

JOB
MANAGER_ID START_DAT
SALARY
COMM DEPARMENT_ID
--------- ---------- --------- ---------- ---------- -----------CLERK
7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10

14 rows selected.
SQL> select * from Department;
DEPARTMENT_ID
------------10
20
30
40

DEPARTMENT_NAM
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOCATION
------------NEW YORK
DALLAS
CHICAGO
BOSTON

SQL>
SQL>
SQL> -- Cross-joins
SQL>
SQL> SELECT e.Employee_ID, d.Department_ID
2 FROM Employee e, Department d;
EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7369
10
7499
10
7521
10
7566
10
7654
10
7698
10
7782
10
7788
10
7839
10

7844
7876

10
10

EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7900
10
7902
10
7934
10
7369
20
7499
20
7521
20
7566
20
7654
20
7698
20
7782
20
7788
20
EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7839
20
7844
20
7876
20
7900
20
7902
20
7934
20
7369
30
7499
30
7521
30
7566
30
7654
30
EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7698
30
7782
30
7788
30
7839
30
7844
30
7876
30
7900
30
7902
30
7934
30
7369
40
7499
40
EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7521
40
7566
40
7654
40
7698
40
7782
40
7788
40
7839
40
7844
40
7876
40

7900
7902

40
40

EMPLOYEE_ID DEPARTMENT_ID
----------- ------------7934
40
56 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> drop table Department cascade constraints;
Table dropped.
SQL> drop table Employee cascade constraints;
Table dropped.
SQL>
SQL>

Working with equijoins

SQL> CREATE TABLE Employee(Employee_ID NUMBER(4) NOT NULL,


2
Employee_Name VARCHAR2(10),
3
JOB VARCHAR2(9),
4
Manager_ID NUMBER(4),
5
Start_Date DATE,
6
Salary NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
Deparment_ID NUMBER(2)
9 );
Table created.
SQL>
SQL> INSERT INTO Employee VALUES (7369, 'SMITH',
1 row created.

'CLERK',

7902, TO_DATE('17-DEC-1980'

SQL> INSERT INTO Employee VALUES (7499, 'ALLEN',

'SALESMAN',

7698, TO_DATE('20-FEB-1981'

'SALESMAN',

7698, TO_DATE('22-FEB-1981'

'MANAGER',

7839, TO_DATE('2-APR-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7521, 'WARD',
1 row created.
SQL> INSERT INTO Employee VALUES (7566, 'JONES',
1 row created.
SQL> INSERT INTO Employee VALUES (7654, 'MARTIN', 'SALESMAN',

7698, TO_DATE('28-SEP-1981'

1 row created.
SQL> INSERT INTO Employee VALUES (7698, 'BLAKE',

'MANAGER',

7839, TO_DATE('1-MAY-1981',

'MANAGER',

7839, TO_DATE('9-JUN-1981',

'ANALYST',

7566, TO_DATE('09-DEC-1982'

1 row created.
SQL> INSERT INTO Employee VALUES (7782, 'CLARK',
1 row created.
SQL> INSERT INTO Employee VALUES (7788, 'SCOTT',
1 row created.
SQL> INSERT INTO Employee VALUES (7839, 'KING',

'PRESIDENT', NULL, TO_DATE('17-NOV-1981'

1 row created.
SQL> INSERT INTO Employee VALUES (7844, 'TURNER', 'SALESMAN',

7698, TO_DATE('8-SEP-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7876, 'ADAMS',

'CLERK',

7788, TO_DATE('12-JAN-1983'

'CLERK',

7698, TO_DATE('3-DEC-1981',

'ANALYST',

7566, TO_DATE('3-DEC-1981',

1 row created.
SQL> INSERT INTO Employee VALUES (7900, 'JAMES',
1 row created.
SQL> INSERT INTO Employee VALUES (7902, 'FORD',
1 row created.
SQL> INSERT INTO Employee VALUES (7934, 'MILLER', 'CLERK',
1 row created.
SQL>
SQL> CREATE TABLE Department(Deparment_ID NUMBER(2),
2
Department_Name VARCHAR2(14),
3
Location VARCHAR2(13)

7782, TO_DATE('23-JAN-1982'

);

Table created.
SQL>
SQL> INSERT INTO Department VALUES (10, 'ACCOUNTING', 'NEW YORK');
1 row created.
SQL> INSERT INTO Department VALUES (20, 'RESEARCH',

'DALLAS');

1 row created.
SQL> INSERT INTO Department VALUES (30, 'SALES',

'CHICAGO');

1 row created.
SQL> INSERT INTO Department VALUES (40, 'OPERATIONS', 'BOSTON');
1 row created.
SQL>
SQL> alter table Employee add constraint Employee_pk primary key(Employee_ID);
Table altered.
SQL> alter table Department add constraint Department_pk primary key(Deparment_ID);
Table altered.
SQL> alter table Employee add constraint Employee_fk_Department foreign key(Deparment_ID)
Table altered.

SQL> alter table Employee add constraint Employee_fk_Employee foreign key(Manager_ID) refe
Table altered.
SQL>
SQL> select * from Employee;
EMPLOYEE_ID
----------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876

EMPLOYEE_N
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

JOB
MANAGER_ID START_DAT
SALARY
COMM DEPARMENT_ID
--------- ---------- --------- ---------- ---------- -----------CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 09-DEC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 12-JAN-83
1100
20

EMPLOYEE_ID EMPLOYEE_N JOB

MANAGER_ID START_DAT

SALARY

COMM DEPARMENT_ID

----------7900
7902
7934

---------JAMES
FORD
MILLER

--------- ---------- --------- ---------- ---------- -----------CLERK


7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10

14 rows selected.
SQL> select * from Department;
DEPARMENT_ID
-----------10
20
30
40
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4

DEPARTMENT_NAM
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

LOCATION
------------NEW YORK
DALLAS
CHICAGO
BOSTON

-- Working with equijoins


SELECT Employee.Employee_ID, Employee.Start_Date,
Employee.Employee_Name, Department.Department_Name, Department.Location
FROM Employee, Department
WHERE Department.Deparment_ID = Employee.Deparment_ID;

EMPLOYEE_ID
----------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876

START_DAT
--------17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
09-DEC-82
17-NOV-81
08-SEP-81
12-JAN-83

EMPLOYEE_N
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

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

LOCATION
------------DALLAS
CHICAGO
CHICAGO
DALLAS
CHICAGO
CHICAGO
NEW YORK
DALLAS
NEW YORK
CHICAGO
DALLAS

EMPLOYEE_ID
----------7900
7902
7934

START_DAT
--------03-DEC-81
03-DEC-81
23-JAN-82

EMPLOYEE_N
---------JAMES
FORD
MILLER

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

LOCATION
------------CHICAGO
DALLAS
NEW YORK

14 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>

SQL>
SQL> drop table Department cascade constraints;
Table dropped.
SQL> drop table Employee cascade constraints;
Table dropped.
SQL>
SQL>

Two Table Equi-Joins with where clause and order by clause

SQL>
SQL> CREATE TABLE emp (
2
empID INT NOT NULL PRIMARY KEY,
3
Name
VARCHAR(50) NOT NULL);
Table created.
SQL>
SQL>
SQL> INSERT INTO emp (empID,Name) VALUES (1,'Tom');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (2,'Jack');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (3,'Mary');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (4,'Bill');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (5,'Cat');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (6,'Victor');
1 row created.
SQL>
SQL> CREATE TABLE empExam (
2
empID INT NOT NULL,

3
4
5
6
7

ExamID
INT NOT NULL,
Mark
INT,
Taken
SMALLINT,
Comments
VARCHAR(255),
CONSTRAINT PK_empExam PRIMARY KEY (empID, ExamID));

Table created.

SQL>
SQL>
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (1,1,55,1,'Satisfactory
1 row created.

SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (1,2,73,1,'Good result'


1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (2,3,44,1,'Hard');
1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (2,5,39,0,'Simple');
1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken) VALUES (2,6,63,1);
1 row created.
SQL>
SQL>
SQL>
2
3
4
5
6
7

SELECT empExam.ExamID,
empExam.Mark,
emp.Name AS empName
FROM empExam JOIN emp
ON empExam.empID = emp.empID
WHERE empExam.Mark >= 80
ORDER BY ExamID;

no rows selected
SQL>
SQL>
SQL>
SQL> drop table empExam;
Table dropped.
SQL> drop table emp;
Table dropped.

Two Table Equi-Joins for ids


SQL>
SQL>
SQL>
SQL> CREATE TABLE emp (
2
empID INT NOT NULL PRIMARY KEY,
3
Name
VARCHAR(50) NOT NULL);
Table created.
SQL> INSERT INTO emp (empID,Name) VALUES (1,'Tom');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (2,'Jack');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (3,'Mary');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (4,'Bill');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (5,'Cat');
1 row created.
SQL> INSERT INTO emp (empID,Name) VALUES (6,'Victor');
1 row created.
SQL>
SQL>
SQL> CREATE TABLE empExam (
2
empID INT NOT NULL,
3
ExamID
INT NOT NULL,
4
Mark
INT,
5
Taken
SMALLINT,
6
Comments
VARCHAR(255),
7
CONSTRAINT PK_empExam PRIMARY KEY (empID, ExamID));
Table created.

SQL>
SQL>
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (1,1,55,1,'Satisfactory
1 row created.

SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (1,2,73,1,'Good result'


1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (2,3,44,1,'Hard');
1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken,Comments) VALUES (2,5,39,0,'Simple');
1 row created.
SQL> INSERT INTO empExam (empID,ExamID,Mark,Taken) VALUES (2,6,63,1);
1 row created.
SQL>
SQL>
SQL> SELECT empExam.ExamID,
2
empExam.Mark,
3
emp.Name AS empName
4 FROM empExam
5
JOIN emp
6
ON empExam.empID = emp.empID
7 ORDER BY ExamID;
EXAMID
MARK EMPNAME
---------- ---------- -------------------------------------------------1
55 Tom
2
73 Tom
3
44 Jack
5
39 Jack
6
63 Jack
5 rows selected.
SQL>
SQL>
SQL> drop table empExam;
Table dropped.
SQL> drop table emp;
Table dropped.
SQL>

A correlated subquery references one or more columns in the outer query

SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,


2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M
1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL> select * from emp;
EMPNO
---------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- ----------- ---------- ---------- ---------CLERK
7902 1980-DEC-17
800
20
SALESMAN
7698 1981-FEB-20
1600
300
30
SALESMAN
7698 1981-FEB-22
1250
500
30
MANAGER
7839 1981-APR-02
2975
20
SALESMAN
7698 1981-SEP-28
1250
1400
30
MANAGER
7839 1981-MAY-01
2850
30
MANAGER
7839 1981-JUN-09
2450
10
ANALYST
7566 1982-DEC-09
3000
20
PRESIDENT
1981-NOV-17
5000
10
SALESMAN
7698 1981-SEP-08
1500
0
30
CLERK
7788 1983-JAN-12
1100
20
CLERK
7698 1981-DEC-03
950
30
ANALYST
7566 1981-DEC-03
3000
20
CLERK
7782 1982-JAN-23
1300
10

14 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6

--Writing Correlated Subqueries

--A correlated subquery references one or more columns in the outer query.
--The subquery is known as a correlated subquery because the subquery is related to t
SELECT empno, mgr,ename, sal
FROM emp outer
WHERE sal >
(SELECT AVG(sal)
FROM emp inner
WHERE inner.empno = outer.mgr);

EMPNO
MGR ENAME
SAL
---------- ---------- ---------- ---------7788
7566 SCOTT
3000
7902
7566 FORD
3000

SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>

Using EXISTS with a Correlated Subquery

SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,


2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M
1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL> select * from emp;
EMPNO
---------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- ----------- ---------- ---------- ---------CLERK
7902 1980-DEC-17
800
20
SALESMAN
7698 1981-FEB-20
1600
300
30
SALESMAN
7698 1981-FEB-22
1250
500
30
MANAGER
7839 1981-APR-02
2975
20
SALESMAN
7698 1981-SEP-28
1250
1400
30
MANAGER
7839 1981-MAY-01
2850
30
MANAGER
7839 1981-JUN-09
2450
10
ANALYST
7566 1982-DEC-09
3000
20
PRESIDENT
1981-NOV-17
5000
10
SALESMAN
7698 1981-SEP-08
1500
0
30
CLERK
7788 1983-JAN-12
1100
20
CLERK
7698 1981-DEC-03
950
30
ANALYST
7566 1981-DEC-03
3000
20
CLERK
7782 1982-JAN-23
1300
10

14 rows selected.
SQL>
SQL> --Using EXISTS with a Correlated Subquery

SQL>
SQL> SELECT empno, ename
2 FROM emp outer
3 WHERE EXISTS
4
(SELECT empno
5
FROM emp inner
6
WHERE inner.mgr = outer.empno);
EMPNO
---------7902
7698
7839
7566
7788
7782

ENAME
---------FORD
BLAKE
KING
JONES
SCOTT
CLARK

6 rows selected.
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>

Using NOT EXISTS with a Correlated Subquery

SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,


2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL> select * from emp;
EMPNO ENAME
JOB
MGR HIREDATE
SAL
COMM
DEPTNO
---------- ---------- --------- ---------- ----------- ---------- ---------- ---------7369 SMITH
CLERK
7902 1980-DEC-17
800
20

7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK

7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782

1981-FEB-20
1981-FEB-22
1981-APR-02
1981-SEP-28
1981-MAY-01
1981-JUN-09
1982-DEC-09
1981-NOV-17
1981-SEP-08
1983-JAN-12
1981-DEC-03
1981-DEC-03
1982-JAN-23

1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300

300
500
1400

30
30
20
30
30
10
20
10
30
20
30
20
10

14 rows selected.
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6

--Using NOT EXISTS with a Correlated Subquery


SELECT empno, ename
FROM emp outer
WHERE NOT EXISTS
(SELECT 1
FROM emp inner
WHERE inner.mgr = outer.empno);

EMPNO
---------7844
7521
7654
7499
7934
7369
7876
7900

ENAME
---------TURNER
WARD
MARTIN
ALLEN
MILLER
SMITH
ADAMS
JAMES

8 rows selected.
SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>

To delete the records of emps whose salary is below the average salary in th

SQL>
SQL>
SQL>
SQL> CREATE TABLE EMP(
2
EMPNO NUMBER(4) NOT NULL,
3
ENAME VARCHAR2(10),
4
JOB VARCHAR2(9),
5
MGR NUMBER(4),
6
HIREDATE DATE,
7
SAL NUMBER(7, 2),
8
COMM NUMBER(7, 2),
9
DEPTNO NUMBER(2)
10 );
Table created.

SQL> INSERT INTO EMP VALUES(2, 'Jack', 'Tester', 6,TO_DATE('20-FEB-1981', 'DD-MON-YYYY'),


1 row created.

SQL> INSERT INTO EMP VALUES(3, 'Wil', 'Tester', 6,TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1


1 row created.

SQL> INSERT INTO EMP VALUES(4, 'Jane', 'Designer', 9,TO_DATE('2-APR-1981', 'DD-MON-YYYY'),


1 row created.
SQL> INSERT INTO EMP VALUES(5, 'Mary', 'Tester', 6,TO_DATE('28-SEP-1981', 'DD-MON-YYYY'),
1 row created.

SQL> INSERT INTO EMP VALUES(6, 'Black', 'Designer', 9,TO_DATE('1-MAY-1981', 'DD-MON-YYYY')


1 row created.

SQL> INSERT INTO EMP VALUES(7, 'Chris', 'Designer', 9,TO_DATE('9-JUN-1981', 'DD-MON-YYYY')


1 row created.

SQL> INSERT INTO EMP VALUES(8, 'Smart', 'Helper', 4,TO_DATE('09-DEC-1982', 'DD-MON-YYYY'),


1 row created.

SQL> INSERT INTO EMP VALUES(9, 'Peter', 'Manager', NULL,TO_DATE('17-NOV-1981', 'DD-MON-YYY


1 row created.
SQL> INSERT INTO EMP VALUES(10, 'Take', 'Tester', 6,TO_DATE('8-SEP-1981', 'DD-MON-YYYY'),
1 row created.

SQL> INSERT INTO EMP VALUES(13, 'Fake', 'Helper', 4,TO_DATE('3-DEC-1981', 'DD-MON-YYYY'),


1 row created.
SQL>
SQL> DELETE FROM emp e
2
WHERE sal < (SELECT AVG(sal) FROM emp
3
WHERE deptno = e.deptno);
6 rows deleted.
SQL>
SQL> drop table emp;
Table dropped.

To update the salary of all emps to the maximum salary in the correspondin
SQL>
SQL>
SQL> CREATE TABLE EMP(
2
EMPNO NUMBER(4) NOT NULL,
3
ENAME VARCHAR2(10),
4
JOB VARCHAR2(9),
5
MGR NUMBER(4),
6
HIREDATE DATE,
7
SAL NUMBER(7, 2),
8
COMM NUMBER(7, 2),
9
DEPTNO NUMBER(2)
10 );
Table created.

SQL> INSERT INTO EMP VALUES(2, 'Jack', 'Tester', 6,TO_DATE('20-FEB-1981', 'DD-MON-YYYY'),


1 row created.

SQL> INSERT INTO EMP VALUES(3, 'Wil', 'Tester', 6,TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1


1 row created.

SQL> INSERT INTO EMP VALUES(4, 'Jane', 'Designer', 9,TO_DATE('2-APR-1981', 'DD-MON-YYYY'),


1 row created.
SQL> INSERT INTO EMP VALUES(5, 'Mary', 'Tester', 6,TO_DATE('28-SEP-1981', 'DD-MON-YYYY'),

1 row created.

SQL> INSERT INTO EMP VALUES(6, 'Black', 'Designer', 9,TO_DATE('1-MAY-1981', 'DD-MON-YYYY')


1 row created.

SQL> INSERT INTO EMP VALUES(7, 'Chris', 'Designer', 9,TO_DATE('9-JUN-1981', 'DD-MON-YYYY')


1 row created.

SQL> INSERT INTO EMP VALUES(8, 'Smart', 'Helper', 4,TO_DATE('09-DEC-1982', 'DD-MON-YYYY'),


1 row created.

SQL> INSERT INTO EMP VALUES(9, 'Peter', 'Manager', NULL,TO_DATE('17-NOV-1981', 'DD-MON-YYY


1 row created.
SQL> INSERT INTO EMP VALUES(10, 'Take', 'Tester', 6,TO_DATE('8-SEP-1981', 'DD-MON-YYYY'),
1 row created.

SQL> INSERT INTO EMP VALUES(13, 'Fake', 'Helper', 4,TO_DATE('3-DEC-1981', 'DD-MON-YYYY'),


1 row created.
SQL>
SQL>
SQL> UPDATE emp
2
SET
sal = (SELECT MAX(sal)
3
FROM
emp e
4
WHERE e.deptno = emp.deptno);
10 rows updated.
SQL>
SQL> drop table emp;
Table dropped.

Use sub query as a virtual table

SQL>
SQL>
SQL> -- create demo table

SQL> create table Employee(


2
ID
VARCHAR2(4 BYTE)
3
First_Name
VARCHAR2(10 BYTE),
4
Last_Name
VARCHAR2(10 BYTE),
5
Start_Date
DATE,
6
End_Date
DATE,
7
Salary
Number(8,2),
8
City
VARCHAR2(10 BYTE),
9
Description
VARCHAR2(15 BYTE)
10 )
11 /

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /

1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DAT
--------25-JUL-96
21-MAR-76
12-DEC-78
24-OCT-82
15-JAN-84
30-JUL-87
31-DEC-90
17-SEP-96

END_DATE
SALARY CITY
--------- ---------- ---------25-JUL-06
1234.56 Toronto
21-FEB-86
2334.78 Vancouver
15-MAR-90
2334.78 Vancouver
21-APR-99
2334.78 Vancouver
08-AUG-98
2334.78 Vancouver
04-JAN-96
2334.78 New York
12-FEB-98
2334.78 New York
15-APR-02
2334.78 Vancouver

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

8 rows selected.
SQL>
SQL>
SQL>
SQL> -- set into a virtual table. Such a solution could look like this:
SQL>
SQL> SELECT id "Emp #", First_name "Name", salary "Salary", ROWNUM rank
2 FROM
3
(SELECT id, first_name, salary FROM employee ORDER BY salary);
Emp
---01
03
08
05
06
07
02
04

Name
Salary
RANK
---------- ---------- ---------Jason
1234.56
1
James
2334.78
2
James
2334.78
3
Robert
2334.78
4
Linda
2334.78
5
David
2334.78
6
Alison
2334.78
7
Celia
2334.78
8

8 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>

SQL>
SQL> -- clean the table
SQL> drop table Employee;
Table dropped.
SQL>

Compare with data from subquery

SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M
1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL> CREATE TABLE DEPT (DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13) );
Table created.
SQL>
SQL> INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
1 row created.
SQL> INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
1 row created.
SQL> INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
1 row created.
SQL> INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
1 row created.
SQL>

SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5

-- Working with Subqueries


SELECT eName
FROM Emp
WHERE sal > (SELECT min(e.sal)
FROM Emp e, dept d
WHERE d.deptno = e.deptno);

ENAME
---------ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
ENAME
---------FORD
MILLER
13 rows selected.
SQL>
SQL>
SQL>
SQL> drop table dept;
Table dropped.
SQL> drop table emp;
Table dropped.
SQL>
SQL>
SQL>

An example of a nested three-level subquery

SQL>
SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M
1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO

1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL> CREATE TABLE DEPT (DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13) );
Table created.
SQL>
SQL> INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
1 row created.
SQL> INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
1 row created.
SQL> INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
1 row created.
SQL> INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
1 row created.
SQL>
SQL> select * from emp;
EMPNO
---------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- ---------- ---------- ---------CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 09-DEC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 12-JAN-83
1100
20

EMPNO
---------7900
7902
7934

ENAME
---------JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- ---------- ---------- ---------CLERK
7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10

14 rows selected.
SQL>
SQL> select * from dept;
DEPTNO
---------10
20
30
40
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7

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

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

-- An example of a nested subquery


SELECT eName
FROM Emp
WHERE sal >(SELECT min(sal)
FROM Emp
WHERE deptno = (SELECT deptno
FROM dept
WHERE loc = 'NEW YORK'));

ENAME
---------ALLEN
JONES
BLAKE
CLARK
SCOTT
KING
TURNER
FORD
8 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL> drop table dept;
Table dropped.
SQL> drop table emp;
Table dropped.

SQL>
SQL>
SQL>

Use aggregate function in sub query

SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,


2
ENAME VARCHAR2(10),
3
JOB VARCHAR2(9),
4
MGR NUMBER(4),
5
HIREDATE DATE,
6
SAL NUMBER(7, 2),
7
COMM NUMBER(7, 2),
8
DEPTNO NUMBER(2));
Table created.
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',

7902, TO_DATE('17-DEC-1980', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'DD-M
1 row created.
SQL> INSERT INTO EMP VALUES (7521, 'WARD',

'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'DD-M

1 row created.
SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',

7839, TO_DATE('2-APR-1981',

'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'DD-M
1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON
1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD-MO
1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON-YY
1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MON-Y
1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-MON1 row created.
SQL>
SQL>
SQL> select * from emp;
EMPNO
---------7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876

ENAME
---------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- ---------- ---------- ---------CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 09-DEC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 12-JAN-83
1100
20

EMPNO
---------7900
7902
7934

ENAME
---------JAMES
FORD
MILLER

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- ---------- ---------- ---------CLERK
7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10

14 rows selected.
SQL>
SQL>

SQL>
2
3
4
5
6
7
8

SELECT *
FROM Emp
WHERE sal =(SELECT min(sal) FROM Emp
WHERE job = 'SALESMAN')
or
deptno = (SELECT distinct deptno
FROM Emp
WHERE job = 'SALESMAN');

EMPNO
---------7499
7521
7654
7698
7844
7900

ENAME
---------ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES

JOB
MGR HIREDATE
SAL
COMM
DEPTNO
--------- ---------- --------- ---------- ---------- ---------SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7698 03-DEC-81
950
30

6 rows selected.
SQL>
SQL>
SQL> drop table emp;
Table dropped.
SQL>
SQL>
SQL>

Subqueries in a HAVING Clause: Uses a subquery in the HAVING clause of the outer query

SQL>
SQL>
2
3
4
5
6
7
8
9
10
11

-- create demo table


create table Employee(
ID
VARCHAR2(4 BYTE)
First_Name
VARCHAR2(10 BYTE),
Last_Name
VARCHAR2(10 BYTE),
Start_Date
DATE,
End_Date
DATE,
Salary
Number(8,2),
City
VARCHAR2(10 BYTE),
Description
VARCHAR2(15 BYTE)
)
/

NOT NULL,

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,
End_
2
values ('01','Jason',
'Martin', to_date('19960725','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('02','Alison',
'Mathews', to_date('19760321','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('03','James',
'Smith',
to_date('19781212','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('04','Celia',
'Rice',
to_date('19821024','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('05','Robert',
'Black',
to_date('19840115','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('06','Linda',
'Green',
to_date('19870730','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('07','David',
'Larry',
to_date('19901231','YYYYMMDD'), to_d
3 /
1 row created.

SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date,


End_
2
values('08','James',
'Cat',
to_date('19960917','YYYYMMDD'), to_d
3 /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table

SQL> select * from Employee


2 /
ID
---01
02
03
04
05
06
07
08

FIRST_NAME
---------Jason
Alison
James
Celia
Robert
Linda
David
James

LAST_NAME
---------Martin
Mathews
Smith
Rice
Black
Green
Larry
Cat

START_DATE
----------1996-JUL-25
1976-MAR-21
1978-DEC-12
1982-OCT-24
1984-JAN-15
1987-JUL-30
1990-DEC-31
1996-SEP-17

END_DATE
SALARY CITY
----------- ---------- ---------2006-JUL-25
1234.56 Toronto
1986-FEB-21
6661.78 Vancouver
1990-MAR-15
6544.78 Vancouver
1999-APR-21
2344.78 Vancouver
1998-AUG-08
2334.78 Vancouver
1996-JAN-04
4322.78 New York
1998-FEB-12
7897.78 New York
2002-APR-15
1232.78 Vancouver

DESCRIPTION
--------------Programmer
Tester
Tester
Manager
Tester
Tester
Manager
Tester

8 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
2
3
4
5
6
7

--Subqueries in a HAVING Clause: Uses a subquery in the HAVING clause of the outer qu
SELECT city, AVG(salary)
FROM employee
GROUP BY city
HAVING AVG(salary) <
(SELECT MAX(AVG(salary))
FROM employee
GROUP BY city);

CITY
AVG(SALARY)
---------- ----------Toronto
1234.56
Vancouver
3823.78
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
2 /
Table dropped.
SQL>
SQL>
SQL>

Das könnte Ihnen auch gefallen