0% found this document useful (0 votes)
22 views209 pages

BATCH40

The document provides an overview of Oracle and its database management systems, including SQL, PL/SQL, and various types of databases such as OLTP and OLAP. It explains the evolution of DBMS, the features of RDBMS and ORDBMS, and details on Oracle's architecture, versions, and user management. Additionally, it covers data types, creating tables, inserting data, and displaying data using SQL commands.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views209 pages

BATCH40

The document provides an overview of Oracle and its database management systems, including SQL, PL/SQL, and various types of databases such as OLTP and OLAP. It explains the evolution of DBMS, the features of RDBMS and ORDBMS, and details on Oracle's architecture, versions, and user management. Additionally, it covers data types, creating tables, inserting data, and displaying data using SQL commands.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 209

oracle

---------

1 SQL (structured query language)


2 PL/SQL (procedural language/sql)

Database :-
--------------

=> a db is a organized collection of interrelated data. For ex


a bank db stores data related to customers,accounts and trans
etc and a univ db stores data related to students,courses
and faculty etc.

Types of Databases :-
-----------------------------

1 OLTP DB (online transaction processing)


2 OLAP DB (online analytical processing)

=> organzations uses OLTP db for storing day-to-day transactions


and OLAP for analysis.

=> OLTP is for running business and OLAP is for to analyze business

=> day-to-day operations on db

C create
R read
U update
D delete

DBMS :-
-------------

=> DBMS stands for Database Management System


=> DBMS is a software used to create and to manage database.
=> DBMS is an interface between user and database.

USER----------------DBMS-----------------------DB

Evolution of DBMS :-
-----------------------------
1960 FMS (file mgmt system)

1970 HDBMS (hierarchical dbms)


NDBMS (network dbms)

1980 RDBMS (relational dbms)

1990 ORDBMS (object relational dbms)

RDBMS :-
----------------

=> Relational Database Management System


=> rdbms concepts introduced by E.F.CODD (Edgar Frank)
=> E.F.CODD introduced 12 rules called codd rules
=> a dbms that supports all 12 rules called perfect rdbms

Information rule :-
------------------------

=> according to information rule data must be organized in tables i.e. rows and columns

cust
cid name addr
10 sachin mum
11 rahul del
12 vijay hyd

DB = collection of tables
TABLE = collection of rows & cols
ROW = collection of field values
COLUMN = collection of same field values

=> every table must contain a primary key to uniquely identify the records.

ex :- accno,empid,aadharno,panno,voterid

RDBMS features :-
-------------------------

1 easy to access and manipulate data


2 less redundency (duplication of data)
3 more security
4 gurantees data quality
5 supports data sharing
6 supports transactions

emp
empid ename job sal projid pname duration cost client
1 A SE 40K 100 AAA 5 600 TATA MOTORS
2 B SSE 60K 100 AAA 5 600 TATA MOTORS

10 100 AAA 5 600 TATA MOTORS

projects
projid name duration cost client
100 AAA 5 600 TATA MOTORS
101 KLM 4 300 KLM Airlines

emp
empid ename job sal projid
1 A SE 40 100
2 B SSE 60 100

RDBMS softwares :-
---------------------------

SQL Databases :-
---------------------------

ORACLE oracle corp


MYSQL oracle corp
SQL SERVER microsoft
POSTGRESQL postgresql forum
RDS amazon

NoSQL Databases :-
------------------------------

mongoDB
cassandra

ORDBMS :-
----------------
=> Object Relational DBMS
=> It is the combination of RDBMS & OOPS

ORDBMS = RDBMS + OOPS (reusability)

=> rdbms doesn't support reusability but ordbms supports reusability


=> ordbms supports reusability by using UDT (user define types).

RDBMS :-
--------------

cust
cid name hno street city state pin

emp
empid ename sal hno street city state pin

ORDBMS :-
--------------

UDT :- address(hno,street,city,state,pin)

CUST
cid cname address

EMP
empid ename address

ORDBMS softwares :-
------------------------------

ORACLE
SQL SERVER
POSTGRESQL

summary :-

what is db ?
what is dbms ?
what is rdbms ?
what is ordbms ?

========================================================================
===

ORACLE
=======

=> oracle is basically a rdbms software and also supports the features of ordbms and
used to create and to manage database.

versions or oracle :-
---------------------------

2,3,4,5,6,7,8i,9i,10g,11g,12c,18c,19c,21c

i => internet
g => grid
c => cloud

=> In version 8 suffix "i" is added because oracle supports web applications.

=> GRID means collection of server , from 10g onwards oracle db can
be accessed through multiple servers , if one server is down then
we can access db through another server , so grid improves availability

=> from 12c onwards db can deployed in

1 on premises server
2 on cloud server

=> in " on premises " db is deployed in the server managed by client.

=> in " on cloud " db is deployed in the server managed by cloud service provider
like amazon.

20-nov-24

CLIENT / SERVER Architecture :-


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

1 server
2 client
server :-
------------

=> server is a system where oracle is installed and running


=> inside the server oracle manages

1 DB
2 INSTANCE

=> DB is created in hard disk and acts as permanent storage


=> INSTANCE is created in ram and acts as temporary storage
=> data temporarly stored in instance and permanently saved in db.

CLIENT :-
--------------

=> client is also a system from where users can

1 connects to server
2 submit requests to server
3 receive response from server

client tool :-
--------------

sqlplus (cui )
sql developer (gui)

user-------sqlplus--------------------------------oracle-----------db

SQL :-
----------

=> sql stands for structured query language


=> a language used to communicate with oracle
=> user communicates with oracle by sending commands called queries
=> a query is a command / instruction / question submitted to oracle
to perform operation on db.
=> sql is originally introduced by IBM and initial name of this language
was sequel and later it is renamed to sql.
=> sql is common to all relational db softwares
user-----sqlplus-------------------sql---------------------oracle-------------db

user------mysqlworkbench------sql------------------mysql----------db

user--------ssms---------------------sql-----------------sql server------db

=> based on operations over db sql is categorized into 5 sublanguages

DDL (Data Definition Lang)


DML (Data Manipulation Lang)
DQL (Data Query Lang)
TCL (Transaction Control Lang)
DCL (Data Control Lang)

SQL

DDL DML DQL TCL DCL

create insert select commit grant


alter update rollback revoke
drop delete savepoint
truncate merge
rename insert all
flashback
purge

Data & Data Definition :-


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

empid ename sal => data definition / metadata


1 A 5000 => data

schema :-
-------------

=> a user in oracle db called schema


=> objects created by user are called schema objects

server
database
user
table
data
server
orcl
sys / MANAGER (dba)
system / MANAGER (dba)

How to connect to oracle :-


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

=> to connect to oracle open sqlplus enter username and password

username :- SYSTEM
password :- MANAGER

OR

username :- SYSTEM / MANAGER

21-nov-24

creating new user in db :-


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

=> only DBAs can create new user

step 1 :- connect as SYSTEM

USERNAME :- SYSTEM / MANAGER

step 2 :- create user

syn :-
--------

CREATE USER <name> IDENTIFIED BY <pwd>


DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS ;

Ex :-

SQL>CREATE USER BATCH40 IDENTIFIED BY ORACLE


DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS ;
step 3 :- granting permissions to user

SQL>GRANT CONNECT,RESOURCE TO BATCH40 ;

connect => to connect to db


resource => to create tables

changing password :-
-------------------------------

=> both user & dba can change password

by user :- (BATCH40/ORACLE)
-------------

SQL>PASSWORD
Changing password for BATCH40
Old password : ORACLE
New password: NARESH
Retype new password: NARESH

Password changed

by DBA :-
------------

SQL>ALTER USER BATCH40 IDENTIFIED BY ORACLE ;

Datatypes in oracle :-
-----------------------------

=> a datatype specifies

1 type of the data allowed in a column


2 amount of memory allocated for column

DATATYPES

CHAR NUMERIC DATE BINARY

ASCII UNICODE number(p) date bfile


number(p,s) timestamp blob
char nchar
varchar2 nvarchar2
long nclob
clob

char(size) :-
----------------

=> allows character data upto 2000 chars


=> recommended for fixed length char columns

ex :- NAME CHAR(10)

sachin - - - -
wasted

ravi - - - - - -
wasted

=> In char datatype extra bytes are wasted , so don't use char datatype for
variable length fields user char datatype for fixed length fields

ex :- gender char(1)

M
F

state_code char(2)

AP
TG
MH

country_code char(3)

ind
usa

varchar2(size) :-
------------------------

=> allows character data upto 4000 chars


=> recommended for variable length fields
ex :- NAME VARCHAR2(10)

SACHIN - - - -
released

=> char/varchar2 allows ascii chars (256 chars) that includes a-z,A-Z,0-9,special chars
i.e. allows alphanumeric data.

ex :- PANNO CHAR(10)
IFSC CHAR(11)
VEHNO CHAR(10)
EMAILID VARCHAR2(20)

LONG :-
-------------

=> allows character data upto 2GB

CLOB :- (character large object)


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

=> allows character data upto 4GB.

NCHAR/NVARCHAR2/NCLOB :- ( N => National)


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

=> allows unicode chars (65536) that includes all ascii chars and chars
belongs to different languages.

Number(p) :-
-----------------

=> allows numbers without decimal i.e. integer


=> number can be upto 38 digits

ex :- empid NUMBER(4)

10
100
1000
10000 => not allowed
aadharno NUMBER(12)
phone NUMBER(10)
accno NUMBER(12)

Number(p,s) :-
--------------------

=> allows numbers with decimal i.e. float

P => precision => total no of digits allowed


S => scale => no of digits allowed after decimal

ex :- SALARY NUMBER(7,2)

5000
5000.55
50000.55
500000.55 => not allowed

5000.5678 => allowed => 5000.57


5000.5648 => allowed => 5000.56

SAVG NUMBER(5,2)

DATE :-
-------------

=> date datatype allows date & time


=> time is optional , if not entered oracle stores 12:00AM
=> default date format in oracle is DD-MON-YY / YYYY

Ex :- DOB DATE

10-MAR-03 => 10-MAR-2003


5-OCT-98 => 5-OCT-2098
5-OCT-1998 => 5-OCT-1998

TIMESTAMP :-
---------------------

=> allows date,time and also milliseconds

ex :- T TIMESTAMP
22-NOV-24 16:30:20.123
---------------- ---------- ------
DATE TIME MS

Binary Types :-
--------------------

=> binary types are used for storing multimedia objects like audio,video,images

1 BFILE (Binary File)


2 BLOB (Binary Large Object)

=> BFILE is called external lob because lob stored outside db but db stores path
=> BLOB is called internal lob because lob stored inside db.

========================================================================

CREATING TABLES IN DB :-
--------------------------------------

CREATE TABLE <tabname>


(
colname datatype(size),
colname datatype(size),
-------------------------
);

Rules ;-
----------

1 name should start with alphabets


2 name should not contain spaces & special chars but allows _ $ #
3 name can be upto 128 chars
4 table can have max 1000 cols
5 no of rows unlimited

123emp invalid
emp 123 invalid
emp*123 invalid
emp_123 valid

Ex :-
=> create table with following structure ?

EMP
EMPID ENAME JOB SAL HIREDATE DNO

CREATE TABLE emp


(
empid NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(10),
sal NUMBER(7,2),
hiredate DATE,
dno NUMBER(2)
);

=> above command created table structure / definition / metadata that includes
columns,datatype and size.

DESC :- (DESCRIBE)
------------

=> command used to see the structure of the table

DESC <tabname>

ex :- SQL>DESC emp

EMPID NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(10)
SAL NUMBER(7,2)
HIREDATE DATE
DNO NUMBER(2)

inserting data into table :-


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

=> "insert" command is used to insert data into table.


=> insert command creates row
=> we can insert

1 single row
2 multiple rows

single row :-
----------------

INSERT INTO <tabname> VALUES(v1,v2,v3,-----);

ex :-

SQL>INSERT INTO emp VALUES(100,'sachin','clerk',3000,'22-NOV-24',10);


SQL>INSERT INTO emp VALUES(101,'arvind','manager',8000,sysdate,20);

multiple rows :-
---------------------

=> insert command can be executed multiple times with different values by using
variables prefixed with "&".

SQL>INSERT INTO emp


VALUES(&empid,&ename,&job,&sal,&hiredate,&dno);

Enter value for empid: 102


Enter value for ename: 'kumar'
Enter value for job: 'analyst'
Enter value for sal: 9000
Enter value for hiredate: '10-MAY-20'
Enter value for dno: 30

1 row created.

SQL> /
Enter value for empid: 103
Enter value for ename: 'rahul'
Enter value for job: 'clerk'
Enter value for sal: 5000
Enter value for hiredate: '05-OCT-18'
Enter value for dno: 30

1 row created.

inserting nulls :-
----------------------
=> a null means blank or empty
=> it is not equal to 0 or space
=> nulls can be inserted in two ways

method 1 :-
----------------

SQL>INSERT INTO emp VALUES(104,'ajay','',null,'14-APR-19',20);

method 2 :-
----------------

SQL>INSERT INTO emp(empid,ename,hiredate,dno)


VALUES(105,'satish','18-FEB-21',10);

remaining fields job,sal are filled with nulls.

NOTE :-

=> above insert commands inserted data into instance which is temporary
to save this data execute commit.

SQL>COMMIT;

NOTE :-

=> in normal exit operations are saved


=> in abnormal exit operations are not saved

SQL> EXIT ; normal exit

closing sqlplus window abnormal exit

Operators in oracle :-
------------------------------

1 Arithmetic operators => + - * /


2 Relational operators => > >= < <= = <> !=
3 Logical operators => AND OR NOT
4 Special operators => BETWEEN
IN
LIKE
IS
ANY
ALL
EXISTS
PIVOT
5 set operators => UNION
UNION ALL
INTERSECT
MINUS

23-nov-24

Displaying Data :-
--------------------------

=> "SELECT" command is used to display data from table.


=> we can display all rows and all columns
=> we can display specific rows and specific columns

SELECT columns / *
FROM tabname
[WHERE cond] ;

sql = english
queries = sentences
clauses = words

=> display employee names and salaries ?

SELECT ename,sal FROM emp ;

=> employee names,jobs and hiredates ?

SELECT ename,job,hiredate FROM emp ;

=> display all the data from emp table ?

SELECT * FROM emp ;

* => all columns

WHERE clause :-
------------------------
=> where clause is used to get specific row/rows from table

WHERE colname OP value

=> OP must be any relational operator like > >= < <= = <>
=> if cond = true row is selected
=> if cond = false row is not selected

Ex ;-

=> display employee details whose id = 103 ?

SELECT * FROM emp WHERE empid = 103 ;

=> employee details whose name = rahul ?

SELECT * FROM emp WHERE ename = 'rahul' ;

note :-

=> In oracle string comparision is case sensitive i.e. uppercase and lowercase
strings not same.

=> employee details earning more than 5000 ?

SELECT * FROM emp WHERE sal > 5000 ;

=> employees joined after 2020 ?

SELECT * FROM emp WHERE hiredate > 2020 ; => error

SELECT * FROM emp WHERE hiredate > '31-DEC-2020' ;

=> joined before 2020 ?

SELECT * FROM emp WHERE hiredate < '01-JAN-2020' ;

=> employees not working for dept 20 ?

SELECT * FROM emp WHERE dno <> 20;

compound condition :-
------------------------------

=> multiple conditions combined with AND / OR operators is called


compound condition.

WHERE cond1 AND cond2 result


T T T
T F F
F T F
F F F

WHERE cond1 OR cond2 result


T T T
T F T
F T T
F F F

Ex :-

=> employees whose id = 100,103,105 ?

SELECT *
FROM emp
WHERE empid = 100 OR empid = 103 OR empid = 105 ;

=> employees working as clerk,manager ?

SELECT *
FROM emp
WHERE job='clerk' OR job='manager' ;

=> employees working as clerk and earning more than 3000 ?

SELECT *
FROM emp
WHERE job='clerk' AND sal > 3000 ;

=> employees earning more than 5000 and 10000 ?

SELECT *
FROM emp
WHERE sal > 5000 AND sal < 10000 ;
=> who are joined in 2020 ?

SELECT *
FROM emp
WHERE hiredate >= '01-JAN-2020' AND hiredate <= '31-DEC-2020' ;

=> employees working as clerk,manager and earning more than 4000 ?

SELECT *
FROM emp
WHERE job='clerk' OR job='manager' AND sal > 4000 ;
------------- ---------------------------------------------

=> In the above query sal > 4000 applied only to manager but not to clerk
because operator AND has more priority than operator OR , to overcome this
use ( ).

SELECT *
FROM emp
WHERE (job='clerk' OR job='manager') AND sal > 4000 ;

=> who are joined in 2020 or earning between 5000 and 10000 ?

SELECT *
FROM emp
WHERE ( hiredate >= '01-JAN-2020' AND hiredate <= '31-DEC-2020')
OR
(sal >= 5000 AND sal < = 10000) ;

=>

STUDENT
sno sname s1 s2 s3
1 A 80 90 70
2 B 30 60 50

CREATE TABLE STUDENT


(
SNO NUMBER(2),
SNAME VARCHAR2(10),
S1 NUMBER(3),
S2 NUMBER(3),
S3 NUMBER(3)
);

SQL> INSERT INTO STUDENT VALUES(1,'A',80,90,70);

SQL> INSERT INTO STUDENT VALUES(2,'B',30,60,50);

=> list of students who are passed ?

SELECT *
FROM student
WHERE s1>=35 AND s2>=35 AND s3>=35 ;

=> list of students who are failed ?

SELECT *
FROM student
WHERE s1<35 OR s2<35 OR s3<35 ;

25-nov-24

IN operator :-
------------------

=> use IN operator for list comparision


=> use IN operator for "=" comparision with multiple values

WHERE colname = V1,V2,V3,--- invalid

WHERE colname IN (v1,v2,v3,---) valid

=> employees whose id = 100,103,105 ?

SELECT *
FROM emp
WHERE empid IN (100,103,105) ;

=> employees working as clerk,manager and analyst ?

SELECT *
FROM emp
WHERE job IN ('clerk','manager','analyst') ;

=> employees not working for dept 10,20 ?


SELECT *
FROM emp
WHERE dno NOT IN (10,20) ;

BETWEEN operator :-
------------------------------

=> use between operator for range comparision

WHERE COLNAME BETWEEN V1 AND V2 (>= AND <=)

=> employees earning between 5000 and 10000 ?

SELECT *
FROM emp
WHERE sal BETWEEN 5000 AND 10000 ;

=> who are not joined in 2020 ?

SELECT *
FROM emp
WHERE hiredate NOT BETWEEN '01-jan-2020' AND '31-dec-2020' ;

COL = V1
OR
COL = V2 ======================> COL IN (V1,V2,V3)
OR
COL = V3

COL >= V1
AND ====================> COL BETWEEN V1 AND V2
COL <= V2

=> employees working as clerk,manager and earning between 5000 and 10000
and working for dept 10,20 and not joined in 2020 ?

SELECT *
FROM emp
WHERE job IN ('clerk','manager')
AND
sal BETWEEN 5000 AND 10000
AND
dno IN (10,20)
AND
hiredate NOT BETWEEN '01-JAN-20' AND '31-DEC-20' ;

=> list of samsung,redmi,realme mobile phones price between 10000 and 20000 ?

products
prodid pname price category brand

SELECT *
FROM products
WHERE brand IN ('samsung','redmi','relame')
AND
price BETWEEN 10000 AND 20000
AND
category='mobiles' ;

=>

SELECT *
FROM emp
WHERE sal BETWEEN 10000 AND 5000 ;

A ERROR
B RETURNS NO ROWS
C RETURNS ROWS
D NONE

ANS :- B

WHERE SAL BETWEEN 5000 AND 10000 ( SAL>=5000 AND SAL<=10000)

WHERE SAL BETWEEN 10000 AND 5000 ( SAL >= 10000 AND SAL<=5000)

LIKE operator :-
------------------------

=> use LIKE operator for pattern comparision

WHERE COLNAME LIKE 'PATTERN'

=> pattern consists of alphabets,digits and wildcard chars


wildcard chars :-
------------------------

% => 0 or many chars

_ => exactly 1 char

ex :-

=> name starts with 's' ?

SELECT *
FROM emp
WHERE ename LIKE 's%' ;

=> name ends with 'd' ?

SELECT *
FROM emp
WHERE ename LIKE '%d' ;

=> name contains 'a' ?

SELECT *
FROM emp
WHERE ename LIKE '%a%' ;

=> 'a' is the 4th char in their name ?

SELECT *
FROM emp
WHERE ename LIKE '___a%' ;

=> 'a' is the 4th char from last ?

SELECT *
FROM emp
WHERE ename LIKE '%a___' ;

=> employees joined in OCT ? DD-MON-YY

SELECT *
FROM emp
WHERE hiredate LIKE '___OCT___' ;

=> joined in 2020 year ?

SELECT *
FROM emp
WHERE hiredate LIKE '%20' ;

=>

CUST
CID CNAME
10 sachin_tendulkar
11 virat%kohli
12 mahendra_singh_dhoni

list of cust name contains "_" ?

SELECT *
FROM CUST
WHERE CNAME LIKE '%\_%' ESCAPE '\' ;

lilst name contains "%" ?

SELECT *
FROM CUST
WHERE CNAME LIKE '%\%%' ESCAPE '\' ;

=> name contains 2 "_" ?

SELECT *
FROM CUST
WHERE CNAME LIKE '%\_%\_%' ESCAPE '\' ;

IS operator :-
-----------------

=> use IS operator for NULL comparision

WHERE COLNAME IS NULL

=> employees not earning salary ?


SELECT * FROM emp WHERE sal IS NULL ;

=> employees earning salary ?

SELECT * FROM emp WHERE sal IS NOT NULL ;

summary :-

WHERE COLNAME IN (V1,V2,V3)


WHERE COLNAME BETWEEN V1 AND V2
WHERE COLNAME LIKE 'PATTERN'
WHERE COLNAME IS NULL

26-nov-24

ALIAS :-
-------------

=> alias means another name or alternative name


=> used to change column heading

COLNAME / EXPR [AS] ALIAS

Ex :-

=> display ENAME ANNUAL SAL ?

SELECT ENAME,SAL*12 AS ANNSAL


FROM EMP ;

SELECT ENAME,SAL*12 AS "ANNUAL SAL"


FROM EMP ;

=> display ENAME EXPERIENCE in years ?

SELECT ENAME,
FLOOR((SYSDATE-HIREDATE)/365) AS EXPR
FROM EMP ;

=> display ENAME SAL HRA DA TAX TOTSAL ?

HRA = house rent allowance = 20% on sal


DA = dearness allowance = 30% on sal
TAX = 10% on sal
TOTSAL = SAL + HRA + DA - TAX

SELECT ENAME,SAL,
SAL*0.2 AS HRA,
SAL*0.3 AS DA,
SAL*0.1 AS TAX,
SAL+(SAL*0.2)+(SAL*0.3)-(SAL*0.1) AS TOTSAL
FROM EMP ;

ORDER BY clause :-
-----------------------------

=> order by clause is used to sort table data


=> we can sort based on one or more fields either in ascending or in descending order
=> default order is ascending

SELECT columns / *
FROM tabname
[WHERE cond]
ORDER BY colname ASC/DESC , ----

Ex :-

=> arrange employee list name wise asc order ?

SELECT *
FROM emp
ORDER BY ename ASC ;

=> arrange emp list sal wise desc order ?

SELECT *
FROM emp
ORDER BY sal DESC ;

SELECT *
FROM emp
ORDER BY 6 DESC ; => sorting based on 6th column in emp table i.e. sal

SELECT empno,ename,job,sal
FROM emp
ORDER BY 6 DESC ; => error

NOTE :- order by number is not based on table and it is based on select list.

SELECT empno,ename,job,sal
FROM emp
ORDER BY 4 DESC ; => sorting based on 4th column in select list

=> arrange employee list dept wise asc and with in dept sal wise desc ?

SELECT empno,ename,sal,deptno
FROM emp
ORDER BY 4 ASC , 3 DESC ;

1 A 3000 20 5
E 5000 10
2 B 1000 30 3 C 4000 10
3 C 4000 10 =============> 6 F 7000 20
4 D 6000 30 1 A 3000 20
5 E 5000 10 4 D 6000 30
6 F 7000 20 2 B 1000 30

=> arrange employee list dept wise asc and with in dept hiredate wise asc ?

SELECT empno,ename,hiredate,deptno
FROM emp
ORDER BY 4 ASC,3 ASC ;

=> arrange student list avg wise , m desc , p desc ?

STUDENT
SNO SNAME M P C
1 A 80 90 70
2 B 60 70 50
3 C 90 70 80
4 D 90 80 70

SELECT sno,sname,m,p,c,(m+p+c)/3 AS AVG


FROM student
ORDER BY (m+p+c)/3 DESC ,m DESC, p DESC ;

4 D 90 80 70
3 C 90 70 80
1 A 80 90 70
2 B 60 70 50

=> employees working as clerk,manager and arrange output sal wise desc order ?

SELECT *
FROM emp
WHERE job IN ('CLERK','MANAGER')
ORDER BY sal DESC ;

DISTINCT clause :-
-----------------------------

=> distinct clause eliminates duplicates from select stmt output

SELECT DISTINCT col


SELECT DISTINCT col1,col2
SELECT DISTINCT *

Ex :-

SQL>SELECT DISTINCT JOB FROM EMP ;

JOB
---------
CLERK
SALESMAN
ANALYST
MANAGER
PRESIDENT

SQL>SELECT DISTINCT DEPTNO FROM EMP ;

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

FETCH clause :-
------------------------

=> used to display top n rows


SELECT columns
FROM tabname
[WHERE cond]
[ORDER BY col ]
[OFFSET <n> ROWS] FETCH FIRST/NEXT <n> ROWS ONLY ;

Ex :-

=> display first 5 rows from emp ?

SELECT empno,ename,sal
FROM emp
FETCH FIRST 5 ROWS ONLY ;

=> display 5th record to 10th record ?

SELECT empno,ename,sal
FROM emp
OFFSET 4 ROWS FETCH NEXT 6 ROWS ONLY ;

=> display 5th record ?

SELECT empno,ename,sal
FROM emp
OFFSET 4 ROWS FETCH NEXT 1 ROW ONLY ;

=> display top 5 highest paid employees ?

SELECT empno,ename,sal
FROM emp
ORDER BY sal DESC
FETCH FIRST 5 ROWS ONLY ;

=> display top 5 max salaries ?

SELECT DISTINCT sal


FROM emp
ORDER BY sal DESC
FETCH FIRST 5 ROWS ONLY ;

=> display 5th max salary ?

SELECT DISTINCT sal


FROM emp
ORDER BY sal DESC
OFFSET 4 ROWS FETCH NEXT 1 ROW ONLY ;

=> display top 5 employees based on experience ?

SELECT empno,ename,hiredate
FROM emp
ORDER BY hiredate ASC
FETCH FIRST 5 ROWS ONLY ;

summary :-

WHERE => used to get specific row/rows


ORDER BY => used to sort
DISTINCT => used to eliminate duplicates
FETCH => used to select top n rows

DML commands :- (Data Manipulation Lang)


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

INSERT
UPDATE
DELETE
INSERT ALL
MERGE

TABLE = STRUCTURE (COLS) + DATA (ROWS)

DDL DML

=> all DML commands acts on table data.


=> all DML commands acts on instance which is temporary memory.
=> to save the operations execute commit.
=> to cancel the operation execute rollback.

UPDATE command :-
------------------------------

=> command used to modify table data.


=> we can update all rows or specific rows
=> we can update single column or multiple columns
UPDATE tabname
SET colname = value , colname = value ,----
[WHERE cond] ;

Ex :-

=> update all employees comm with 500 ?

SQL>UPDATE emp SET comm = 500 ;

=> update employees comm with 500 whose comm = null ?

SQL>UPDATE emp SET comm = 500 WHERE comm IS NULL ;

=> update comm with null whose comm <> null ?

SQL>UPDATE emp SET comm = NULL WHERE comm IS NOT NULL ;

NULL assignment =
NULL comparisioN IS

=> update salary with 1000 and comm with 500 whose empno = 7369 ?

SQL>UPDATE emp
SET sal = 1000 , comm = 500
WHERE empno = 7369 ;

=> increment sal by 20% and comm by 10% those working as salesman
and joined in 1981 year ?

SQL>UPDATE emp
SET sal = sal + (sal*0.2) , comm = comm + (comm*0.1)
WHERE job='SALESMAN'
AND
hiredate LIKE '%81' ;

=> increase samsung,realme mobile phones price by 10% ?

products
prodid pname price category brand

SQL>UPDATE products
SET price = price + (price * 0.1)
WHERE brand IN ('samsung','realme')
AND
category='mobiles' ;

=> transfer employees from 10th dept to 20th dept ?

SQL>UPDATE emp
SET deptno = 20
WHERE deptno = 10 ;

DELETE command :-
----------------------------

=> command used to delete row / rows from table


=> we can delete all rows or specific rows

DELETE FROM <tabname> [WHERE cond] ;

ex :-

=> delete all rows from emp ?

SQL>DELETE FROM emp ;

=> delete employees having more than 40 years of expr ?

SQL>DELETE FROM emp WHERE (SYSDATE-hiredate)/365 > 40 ;

28-nov-24

FLASHBACK :-
----------------------

=> using this flashback we can view the data that exists some time back.
=> a query that returns past data is called flashback query.
=> using flashback we can recover data after commit.

SELECT *
FROM tabname
AS OF TIMESTAMP (SYSDATE - INTERVAL );

Ex :-
=> the following query returns 5 mins back data in emp table ?

SELECT *
FROM emp
AS OF TIMESTAMP (SYSDATE - INTERVAL '5' MINUTE) ;

=> by default we can flashback upto 15 mins

How to recover data after commit :-


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

STEP 1 :- delete the data

SQL>DELETE FROM emp ;

STEP 2 :- save the delete operation

SQL>COMMIT;

STEP 3 :- get the data that exists 2 mins back and insert that data into current emp table

SQL>INSERT INTO emp


SELECT *
FROM emp
AS OF TIMESTAMP(SYSDATE - INTERVAL '2' MINUTE);

How to change flashback time :-


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

SYSTEM :-
---------------

SQL>ALTER SYSTEM SET UNDO_RENTENTION = 1800 ;

1800 secs = 30 minutes

DDL commands :- (Data Definition Lang)


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

CREATE
ALTER
DROP
TRUNCATE
RENAME
FLASHBACK
PURGE

=> DDL commands acts on table structure (columns,datatype and size).


=> all DDL commands are auto committed.

DDL command = DDL command + commit

Ex 1 :-

create table a(a number(2));


insert into a values(10);
insert into a values(20);
insert into a values(30);
insert into a values(40);
rollback;

which are saved & cancelled ?

create table => saved


inserts => cancelled

Ex 2 :-

create table a(a number(2));


insert into a values(10);
insert into a values(20);
create table b(b number(2));
insert into a values(30);
insert into a values(40);
rollback;

create table a => saved


insert 10,20 => saved
create table b => saved
insert 30,40 => cancelled

ALTER command :-
-----------------------

=> command used to modify table structure


=> using alter command
1 we can add columns
2 we can drop columns
3 we can rename a column
4 modify a column
changing datatype
changing size

Adding columns :-
-------------------------

ALTER TABLE <tabname>


ADD ( colname datatype(size) , colname datatype(size),---) ;

Ex :-

=> add column gender to emp table ?

ALTER TABLE emp


ADD (gender CHAR(1));

after adding by default the new column is filled with nulls , to insert
data into the new column use update command.

1 UPDATE emp SET gender='m' WHERE empno = 7369 ;

2 UPDATE emp SET gender = &gender WHERE empno = &empno ;

Droping columns :-
----------------------------

ALTER TABLE <tabname>


DROP (col1,col2,------) ;

Ex :-

=> drop column gender from emp ?

ALTER TABLE emp


DROP (gender) ;

Renaming a column :-
----------------------------
ALTER TABLE <tabname>
RENAME COLUMN <oldname> TO <newname> ;

ex :-

=> rename column comm to bonus ?

ALTER TABLE emp


RENAME COLUMN comm TO bonus ;

Modifying a column :-
----------------------------

1 changing datatype
2 changing size

ALTER TABLE <tabname>


MODIFY (colname datatype(size) );

Ex :-

=> increase the size of ename to 20 ?

ALTER TABLE emp


MODIFY (ename VARCHAR2(20)):

ALTER TABLE emp


MODIFY (ename VARCHAR2(5)); => error => some names contains
more than 5 chars

NOTE :-

=> numeric field must be empty to decrease precision or scale

ALTER TALBLE emp


MODIFY (sal NUMBER(6,2)); => ERROR

=> column must be empty to change datatype

ALTER TABLE emp


MODIFY (empno VARCHAR2(10)); => ERROR
How to change datatype if column is not empty :-
-----------------------------------------------------------------

step 1 :- add a column

SQL>ALTER TABLE emp


ADD (empid VARCHAR2(10));

step 2 :- copy data from empno to empid

SQL> UPDATE emp SET empid = 'TCS'||empno ;

step 3 :- drop empno column

SQL>ALTER TABLE emp


DROP (empno) ;

step 4 :- rename column empid to empno

SQL>ALTER TABLE emp


RENAME COLUMN empid TO empno ;

DROP command :-
--------------------------

=> drops table from db


=> drops table structure along with data.

DROP TABLE <tabname> ;

Ex :-

SQL>DROP TABLE emp ;

=> when table is dropped then it is moved to recyclebin , to see the


recyclebin execute following command

SQL>SHOW RECYCLEBIN ;

EMP TABLE 2024-11-29 17:01:32

FLASHBACK command :-
------------------------------------
=> command used to restore the table from recyclebin.

FLASHBACK TABLE <tabname> TO BEFORE DROP ;

Ex :-

SQL>FLASHBACK TABLE emp TO BEFORE DROP ;

=> table is restored with no of columns and rows that exists before drop
i.e. (8 cols and 14 rows)

PURGE command :-
---------------------------

=> command used to delete table from recyclebin.


=> after deleting table from recyclebin we cannot flashback.

PURGE TABLE <tabname> ;

Ex :-

SQL>PURGE TABLE emp ;

DROP & PURGE :-


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

SQL>DROP TABLE student PURGE ;

TRUNCATE command :-
---------------------------------

=> deletes all the data from table but keeps structure
=> will empty the table.
=> will release memory allocated for table.

TRUNCATE TABLE <tabname>

Ex :-

SQL>TRUNCATE TABLE emp ;

=> oracle goes to memory and releases all the blocks allocated for table
when blocks are released then data stored in block also deleted.

DELETE VS TRUNCATE :-
--------------------------------------

DELETE TRUNCATE

1 DML DDL

2 can delete all rows can delete only all rows


and specific rows but cannot delete specific rows

3 where cond can be where cond cannot be


used with delete used with truncate

4 can be rolledback cannot be rolledback

5 we can flashback we cannot flashback


deleted data truncated data

6 deletes row-by-row deletes all rows at a time

7 slower faster

8 will not release memory releases memory

RENAME command :-
------------------------------

=> command used to change tablename

RENAME <oldname> TO <newname>

Ex :-

=> rename table emp to employees ?

SQL>RENAME emp TO employees ;

Data Dictionary / System Tables :-


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

=> oracle not only stores data and it also stores metadata
=> metadata includes information about users,tables,columns etc
=> metadata stored in some tables called data dictionary tables or system tables.

ALL_USERS :-
--------------------

=> stores users information

sql>DESC ALL_USERS

USERNAME
USER_ID
CREATED

=> display list of users in db ?

sql>SELECT USERNAME FROM ALL_USERS ;

=> on which day batch40 is created ?

sql>SELECT CREATED FROM ALL_USERS WHERE USERNAME='BATCH40' ;

USER_TABLES :-
------------------------

=> stores tables created by user

sql>DESC USER_TABLES

TABLE_NAME
TABLESPACE_NAME

=> list of tables created by user ?

sql> SELECT TABLE_NAME FROM USER_TABLES ;

=> display name of the db ?

system :-
------------

sql>SELECT NAME FROM V$DATABASE; => ORCL


=================================================================

Built-in functions :-
--------------------------

=> a function accepts some input performs some calculation and returns one value

Types of Functions :-
-----------------------------

1 Single Row Functions


character
numeric
date
conversion
special
analytical
2 Multi row Functions

character functions :-
----------------------------

UPPER() :-
---------------

=> converts string to uppercase

UPPER(string/colname)

Ex :-

sql>SELECT UPPER('hello') FROM DUAL ; => HELLO

DUAL is a dummy table provided by oracle used to select non db values

LOWER() :-
----------------

=> converts string to lowercase

LOWER(string/colname)

Ex :-
sql>SELECT LOWER('HELLO') FROM DUAL ; => hello

=> display EMPNO ENAME SAL ? display names in lowercase ?

sql> SELECT empno,LOWER(ename) as ename,sal FROM emp ;

=> convert names to lowercase in table ?

sql>UPDATE emp SET ename = LOWER(ename) ;

INITCAP() :-
----------------

=> convers initials into capitals

INITCAP(string/colname)

Ex :-

sql>SELECT INITCAP('sachin tendulkar') FROM DUAL ;

O/P :- Sachin Tendulkar

LENGTH() :-
----------------

=> returns no of chars

LENGTH(string/colname)

Ex :-

sql>SELECT LENGTH('HELLO WELCOME') FROM DUAL ; => 13

=> employees name contains more than 4 chars ?

sql>SELECT empno,ename,sal
FROM emp
WHERE LENGTH(ename) > 4 ;

=> arrange employee list based on length of ename ?


sql>SELECT empno,ename,sal
FROM emp
ORDER BY LENGTH(ename) ASC ;

SUBSTR() :-
-----------------

=> used to get part of the string

SUBSTR(string,start,[no of chars])

Ex :-

SUBSTR('HELLO WELCOME',1,5) => HELLO


SUBSTR('HELLO WELCOME',10,3) => COM
SUBSTR('HELLO WELCOME',7) => WELCOME

SUBSTR('HELLO WELCOME',-4,3) => COM


SUBSTR('HELLO WELCOME',-4) => COME

=> employees name starts with 's' ?

SELECT * FROM emp WHERE SUBSTR(ename,1,1) = 's' ;

=> name ends with 's' ?

SELECT * FROM emp WHERE SUBSTR(ename,-1,1) = 's' ;

=> name starts and ends with same char ?

WHERE ename LIKE 'a%a'


OR
ename LIKE 'b%b'

SELECT * FROM emp WHERE SUBSTR(ename,1,1) = SUBSTR(ename,-1,1) ;

=> generate emailids for employees as follows ?

empno ename emailid


7369 smith [email protected]

'a'||'b' => ab
SELECT empno,ename,
SUBSTR(ename,1,3)||SUBSTR(empno,1,3)||'@tcs.com' as emailid
FROM emp ;

=> store emailids in db ?

step 1 :- add emailid column to emp table

sql>ALTER TABLE emp


ADD (emailid VARCHAR2(20));

step 2 :- update the column with emailids

sql>UPDATE emp
SET emailid = SUBSTR(ename,1,3)||SUBSTR(empno,1,3)||'@tcs.com' ;

INSTR() :-
---------------

=> returns character position in a string.

INSTR(string,char,[start,occurance])

Ex :-

INSTR('HELLO WELCOME','O') => 5


INSTR('HELLO WELCOME','K') => 0
INSTR('HELLO WELCOME','O',1,2) => 11
INSTR('HELLO WELCOME','E',7,2) => 13

INSTR('HELLO WELCOME','O',-1,2) => 5


INSTR('HELLO WELCOME','E',-7,2) => 0

ex :-

=> display CID FNAME LNAME ?

CUST
CID CNAME
10 sachin tendulkar
11 virat kohli
SUBSTR(string,start,[ no of chars])

fname = SUBSTR(cname,1,INSTR(cname,' ')-1)

lname = SUBSTR(cname,INSTR(cname,' ')+1)

SELECT cid,
SUBSTR(cname,1,INSTR(cname,' ')-1) as fname,
SUBSTR(cname,INSTR(cname,' ')+1) as lname
FROM cust ;

=>

CUST
CID CNAME
10 sachin ramesh tendulkar
11 virat anushka kohli

display CID FNAME MNAME LNAME ?

RPAD & LPAD :-


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

=> used to fill string with a character

LPAD(string,length,char) => fills on left side


RPAD(string,length,char) => fills on right side

Ex :-

LPAD('HELLO',10,'*') => *****HELLO


RPAD('HELLO',10,'*') => HELLO*****
RPAD('*',10,'*') => **********

display ENAME SAL ?


XXX

SELECT ENAME, RPAD('X',LENGTH(SAL),'X') AS SAL FROM EMP ;

=>

ACCOUNTS
accno bal
123456789531 10000

your a/c no XXXX9531 debited ------ ?

1 LPAD(SUBSTR(ACCNO,-4) ,8,'X')

2 LPAD('X',4,'X')||SUBSTR(ACCNO,-4)

=>

credit_cards
card_no
1234567890123456

display 12xxxx456 ?

REPLACE() :-
-------------------

=> used to replace one string with another string

REPLACE(str1,str2,str3)

Ex :-

REPLACE('HELLO','ELL','ABC') => HABCO


REPLACE('HELLO','L','ABC') => HEABCABCO
REPLACE('HELLO','ELO','ABC') => HELLO

REPLACE('@@@HE@@LL@@O@@','@','') => HELLO

TRANSLATE() :-
-----------------------

=> used to translate one char to another char

TRANSLATE(str1,str2,str3)

Ex :-

TRANSLATE('HELLO','ELO','ABC') => HABBC

E => A
L => B
O => C

TRANSLATE('HELLO','ELO','') => NULL

=> translate function can be used to encrypt data i.e. converting plain text to cipher text.

display ENAME SAL ? encrypt salaries ?

SELECT ename,
TRANSLATE(sal,'0123456789','$bT*@r^%#!') as sal
FROM emp ;

jones 2975 T!%r

=> remove all special chars from '!@HE#$LL%^O*@' ?

o/p :- HELLO

SELECT
REPLACE(TRANSLATE('!@HE#$LL%^O*@' ,'!@#$%^*','*******') , '*','') FROM DUAL ;
-----------------------------------------------------------------------
**HE**LL**O**

Numeric functions :-
----------------------------

Rounding numbers :-
----------------------------

ROUND
TRUNC
CEIL
FLOOR

ROUND() :-
----------------

=> rounds number to integer or to decimal places based on avg.

ROUND(number,[decimal places])

Ex :-
ROUND(38.456789) => 38

38--------------------------38.5-----------------------------39

number < avg => rounded to lowest


number >= avg => rounded to highest

ROUND(38.556789) => 39

ROUND(38.4567,2) => 38.46

ROUND(38.4537,2) => 38.45

ROUND(38.4537,3) => 38.454

ROUND(38.4537,1) => 38.5

ROUND(386,-2) => 400

300-------------------------350-----------------------------400

ROUND(386,-1) => 390

380---------------------------385--------------------------------390

ROUND(386,-3) => 0

0-------------------------------500--------------------------------1000

=>

sql>SELECT ROUND(4567,-1) , ROUND(4567,-2) , ROUND(4567,-3) FROM DUAL ;

o/p :- 4570 4600 5000

=> display ENAME EXPERIENCE ? round the experience to integer ?

sql>SELECT ENAME, ROUND((SYSDATE-HIREDATE)/365) AS EXPR FROM EMP ;

=> round the salaries to hundreds in table ?


sql>UPDATE emp SET sal = ROUND(sal,-2) ;

TRUNC() :-
----------------

=> rounds number always to lowest

TRUNC(number,[decimal places])

Ex :-

TRUNC(38.9) => 38

TRUNC(38.4567,2) => 38.45

TRUNC(38.4567,3) => 38.456

TRUNC(386,-2) => 300

TRUNC(999,-3) => 0

FLOOR() :-
---------------

=> rounds number always to lowest

FLOOR(number)

Ex :-

FLOOR(3.9) => 3

CEIL() :-
----------

=> rounds number always to highest

CEIL(number)

Ex :-

CEIL(3.1) => 4
MOD() :-
--------------

=> returns remainder

MOD(num1,num2)

Ex :-

MOD(10,2) => 0

=> employees earning multiples of 50 ?

SELECT *
FROM emp
WHERE MOD(sal,50) = 0 ;

4-DEC-24

Date functions :-
-----------------------

SYSDATE + 10 => 10 days added to system date

SYSDATE - 10 => 10 days subtracted from system date

SYSDATE - HIREDATE => returns difference in days

SYSDATE + HIREDATE => invalid

ADD_MONTHS() :-
---------------------------

=> function used to add / subtract months to / from a date

ADD_MONTHS(DATE , NUMBER)

Ex :-

ADD_MONTHS(SYSDATE,2) => 4-FEB-25


ADD_MONTHS(SYSDATE,-2) => 4-OCT-24

=>
GOLD_RATES
DATEID RATE
01-JAN-20 ?
02-JAN-20 ?

04-DEC-24 ?

1 display today's gold rate ?


2 display yesterday's gold rate ?
3 display last month same day gold rate ?
4 display last year same day gold rate ?
5 display last 1 month gold rates ?

1 SELECT * FROM GOLD_RATES WHERE DATEID = SYSDATE ;

2 SELECT * FROM GOLD_RATES WHERE DATEID = SYSDATE -1 ;

3 SELECT * FROM GOLD_RATES WHERE DATEID = ADD_MONTHS(SYSDATE,-1);

4 SELECT * FROM GOLD_RATES WHERE DATEID = ADD_MONTHS(SYSDATE,-12);

5 SELECT *
FROM GOLD_RATES
WHERE DATEID BETWEEN ADD_MONTHS(SYSDATE,-1) AND SYSDATE ;

WHERE DATEID >= ADD_MONTHS(SYSDATE,-1)

MONTHS_BETWEEN() :-
----------------------------------

=> returns difference between two dates in months

MONTHS_BETWEEN(DATE1,DATE2)

Ex :-

MONTHS_BETWEEN(SYSDATE,'04-DEC-23') => 12

=> display ENAME EXPERIENCE in months ?

SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) AS EXPR
FROM EMP ;

=> display ENAME EXPERIENCE ?


M YEARS N MONTHS

experience = 40 months = 3 YEARS 4 MONTHS

years = months/12 = FLOOR(40/12) = 3

months = MOD(months,12) = MOD(40,12) = 4

SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) AS YEARS ,
MOD(FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) ,12) AS
MONTHS
FROM EMP

smith 17-DEC-1980 17-DEC-2023 43

17-FEB-2024 11

Conversion functions :-
-------------------------------

=> conversion means converting from one datatype to another datatype

=> conversion is 2 types

1 implicit conversion
2 explicit conversion

implicit conversion :-
---------------------------

=> if conversion performed by oracle then it is called implicit conversion

Ex 1 :-

SQL>SELECT 5000 + '1000' FROM DUAL ; => 6000

string '1000' converted to number by oracle


Ex 2 :-

CREATE TABLE D(D DATE);

INSERT INTO D VALUES('04-DEC-24') ;

=> string '04-DEC-24' converted to date by oracle

note :-

=> implicit conversion is not recommended because it degrades performance

Explicit conversion :-
-----------------------------

=> if conversion performed by user then it is called explicit conversion

=> the following functions provided by oracle for explicit conversion

1 TO_CHAR => used to convert date/number to char type


2 TO_DATE => used to convert string to date type
3 TO_NUMBER => used to convert string to number type

converting date to char type :-


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

=> dates converted to char type to display dates in different formats

TO_CHAR(DATE , 'format') date = sysdate

formats :-
-------------

yyyy 2024
yy 24

mm 12
mon dec
month december

dd 04 (day of the month)


ddd 339 (day of the year)
d 4 (day of the week)
dy wed
day wednesday

hh hour
hh24 hour part in 24 hrs format
mi minutes
ss seconds
AM/PM AM time or PM t ime

q quarter (1-4)

jan-mar 1
apr-jun 2
jul-sep 3
oct-dec 4

5-dec-24

=> display ENAME YEAR_OF_JOIN ?

sql>SELECT ename,TO_CHAR(hiredate,'yyyy') as year FROM emp ;

=> employee list joined in 1980,1983,1985 years ?

sql>SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') IN (1980,1983,1985) ;

WHERE hiredate LIKE '%80'


OR
hiredate LIKE '%83'
OR
hiredate LIKE '%85'

=> employees joined in leap year ?

sql>SELECT *
FROM emp
WHERE MOD(TO_CHAR(hiredate,'yyyy'),4) = 0 ;

=> display ENAME DAY_OF_JOIN ?

sql>SELECT ename , TO_CHAR(hiredate,'day') as day FROM emp ;


=> display employees joined on sunday ?

sql>SELECT * FROM emp WHERE TO_CHAR(hiredate,'dy') = 'sun' ;

d = 1

day = 'sunday'
=> employees joined in jan,apr,dec months ?

sql> SELECT * FROM emp WHERE TO_CHAR(hiredate,'mm') IN ( 1,4,12) ;

=> employees joined in 2nd quarter of 1981 year ?

sql>SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') = 1981 AND TO_CHAR(hiredate,'q') = 2;

WHERE TO_CHAR(hiredate,'yyyy-q') = '1981-2' ;

=> display ENAME HIREDATE ? display hiredates in YYYY-MM-DD format ?

sql>SELECT ename,TO_CHAR(hiredate,'yyyy-mm-dd') as hiredate FROM emp ;

ex :-

sql>INSERT INTO emp(empno,ename,sal,hiredate) VALUES(444,'ABC',4000,sysdate);

=> list of employees joined today ?

sql>SELECT *
FROM emp
WHERE hiredate = SYSDATE ; => no rows

05-DEC-24 4:57:17 = 05-DEC-24 5:00;00

note :- "=" comparision with sysdate always fails , to overcome this problem use
TO_CHAR function

sql>SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'dd-mon-yyyy') = TO_CHAR(sysdate,'dd-mon-yyyy') ;
converting number to char type :-
----------------------------------------------

=> numbers converted to char type to display numbers in different formats

TO_CHAR(number,'format')

formats :-
-------------

9 => represents a digit


0 => represents a digit
G => thousand seperator
D => decimal seperator
L => currency symbol
C => currency

ex :-

TO_CHAR(1234 , '99999') => 1234


TO_CHAR(1234,'00000') => 01234
TO_CHAR(1234,'000000') => 001234
TO_CHAR(1234,'9G999') => 1,234
TO_CHAR(1234,'9G999D99') => 1,234.00
TO_CHAR(1234,'L9G999') => $1,234
TO_CHAR(1234,'C9G999') => USD1,234

=> display ENAME SAL ?


display salaries with thousand seperator and currency symbol ?

sql>SELECT ENAME,
TO_CHAR(SAL,'L99G999') AS SAL
FROM EMP ;

How to change currency :-


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

sql>ALTER SESSION SET NLS_TERRITORY='INDIA' ;

10-DEC-24

converting string to date :-


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

string => '05-DEC-24' '12/5/2024' '2024-12-05'

TO_DATE(string,'format')

Ex :-

sql>SELECT SYSDATE + 10 FROM DUAL ; => 15-DEC-24

sql>SELECT '01-JAN-25' + 100 FROM DUAL ; => error

number + number => valid


date + number => valid
string + number => invalid

sql>SELECT TO_DATE('01-JAN-25','DD-MON-YY') + 100 FROM DUAL ; => 11-APR-25

=> calculate '12/10/2024' + 50 ?

sql>SELECT TO_DATE('12/10/2024','MM/DD/YYYY') + 50 FROM DUAL ; => 29-JAN-25

=> waq to display on which day india got independence ?

sql>SELECT
TO_CHAR(TO_DATE('15-AUG-1947','DD-MON-YYYY'),'DAY')
FROM DUAL ;

converting string to number :-


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

string => '1000' '$1,000' 'USD1,000'

TO_NUMBER(string , 'format')

Ex :-

sql> SELECT 5000 + '1,000' FROM DUAL ; => ERROR

sql>SELECT 5000 + TO_NUMBER('1,000','9G999') FROM DUAL ; => 6000


=> calculate '$5,000' + 'USD3,000' ?

sql>SELECT TO_NUMBER('$5,000' ,'L9G999') +


TO_NUMBER('USD3,000','C9G999')
FROM DUAL ;

o/p :- 8000

input output function

5000 $5,000 TO_CHAR


$5,000 5000 TO_NUMBER

dd-mon-yy mm/dd/yy TO_CHAR


mm/dd/yy dd-mon-yy TO_DATE

default other TO_CHAR


other default TO_DATE

Special functions :-
---------------------------

NVL() :-
------------

=> used to convert null values

NVL(arg1,arg2)

=> if arg1 = null returns arg2


=> if arg1 <> null returns arg1 only

ex :-

NVL(100,200) => 100


NVL(NULL,200) => 200

=> display ENAME SAL COMM TOTSAL ?

TOTSAL = SAL + COMM


sql>SELECT ename,sal,comm , sal+comm as totsal FROM emp ;

smith 800 null null


allen 1600 300 1900

sql>SELECT ename,sal,comm , sal + NVL(comm,0) as totsal FROM emp ;

smith 800 null 800


allen 1600 300 1900

=> display ENAME SAL COMM ?

if comm = null display N/A

sql>SELECT ename,sal,NVL(TO_CHAR(comm),'N/A') as comm FROM emp ;

ASCII() :-
------------

=> returns ascii value of a character

ASCII('char')

sql>SELECT ASCII('A') FROM DUAL ; => 65

CHR() :-
------------

=> returns character for given ascii value

sql>SELECT CHR(65) FROM DUAL ; => A

sql> SELECT 'A'||CHR(10)||'B' FROM DUAL ; => A


B

=>

cust
cid name hno street city state pin
10 A 100 ampt hyd tg 5000036

o/p :-
cname
hno
street
city
state
pin

How to implement a loop in sql :-


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

SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 20 ;

LEVEL = 1 ;
CONNECT BY (LEVEL<=10)
{
PRINT LEVEL
LEVEL = LEVEL + 1
}

=> level is a system variable and initialized with 1


=> by default level is incremented by 1

=> waq to print even numbers upto 20 ?

SELECT LEVEL
FROM DUAL
WHERE MOD(LEVEL,2) = 0
CONNECT BY LEVEL <= 20 ;

LEVEL=1
CONNECT BY (LEVEL<=20)
{
IF MOD(LEVEL,2) = 0
PRINT LEVEL
LEVEL = LEVEL + 1
}

11-dec-24

=> waq to print all ascii characters ?


ASCII VALUE CHAR

65 A
66 B

SELECT LEVEL , CHR(LEVEL)


FROM DUAL
CONNECT BY LEVEL < = 255 ;

=> waq to display 2025 calendar ?

date day

01-JAN-25 ?
02-JAN-25 ?

31-DEC-25 ?

SELECT LEVEL + TO_DATE('31-DEC-2024' ,'DD-MON-YYYY') AS DT,


TO_CHAR( LEVEL + TO_DATE('31-DEC-2024' ,'DD-MON-YYYY') ,'DAY') AS DY
FROM DUAL
CONNECT BY LEVEL < = 365 ;

=> wap to print following pattern ?

SELECT LPAD('*',LEVEL,'*')
FROM DUAL
CONNECT BY LEVEL<=10 ;

*
**
***

***********

=> waq to print following pattern ?

SELECT LPAD(' ',10-LEVEL,' ')||


LPAD('*',LEVEL-1,'*')||
LPAD('*',LEVEL,'*')
FROM DUAL
CONNECT BY LEVEL<=10 ;

*
***
*****

Analytical Functions :-
-------------------------------

RANK & DENSE_RANK :-


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

=> both functions are used to find ranks


=> ranking is always based on some column
=> for rank functions data must be sorted

RANK() OVER (ORDER BY COLNAME ASC/DESC ,---)

Ex :-

=> find ranks of the employees based on sal and highest paid should get 1st rank ?

SELECT empno,ename,sal,
RANK() OVER (ORDER BY sal DESC) as rnk
FROM emp ;

SELECT empno,ename,sal,
DENSE_RANK() OVER (ORDER BY sal DESC) as rnk
FROM emp ;

difference between rank & dense_rank functions ?

1 rank function generates gaps but dense_rank will not generate gaps.
2 in rank function ranks may not be in sequence but in dense_rank ranks are always in
sequence

SAL RNK DRNK


5000 1 1
4000 2 2
3000 3 3
3000 3 3
3000 3 3
2000 6 4
2000 6 4
1000 8 5

=> find ranks of the employees based on sal if salaries are same then ranking should be
based on experience ?

SELECT empno,ename,hiredate,sal,
DENSE_RANK() OVER (ORDER BY sal DESC,hiredate ASC) as rnk
FROM emp ;

=> find ranks of the students based on total marks , m , p ?

student
sno sname m p c

Multi-row / Group / Aggregate Functions :-


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

=> these functions process multiple rows and returns one value

MAX
MIN
SUM
AVG
COUNT
COUNT(*)

MAX() :-
------------

=> returns maximum value

MAX(colname)

Ex :-

SELECT MAX(sal) FROM emp ; => 5000


SELECT MAX(hiredate) FROM emp ; => 12-JAN-83
SELECT MAX(ename) FROM emp ; => WARD

MIN() :-
-----------

=> returns minimum value

MIN(colname)

Ex :-

SELECT MIN(sal) FROM emp ; => 800

SUM() :-
-------------

=> returns total

SUM(colname)

Ex :-

SELECT SUM(sal) FROM emp ; => 29025

=> round the total sal to hundreds ?

SELECT ROUND(SUM(sal) , -2) FROM emp ; => 29000

29000-------------29050---------------------29100

=> after rounding display total sal with thousand seperator and currency symbol ?

SELECT TO_CHAR ( ROUND(SUM(sal) , -2) , 'L99G999')


FROM emp ;

=> calculate total sal including comm ?

SELECT SUM(sal + comm) FROM emp ; => 7800

SELECT SUM(sal + NVL(comm,0)) FROM emp ; => 31225

=> display total sal to managers ?

SELECT SUM(sal)
FROM emp
WHERE job='MANAGER' ;

12-DEC-24

AVG() :-
-----------

=> returns average value

AVG(colname)

Ex :-

SELECT AVG(sal) FROM emp ; => 2073.21429

=> round the avg sal to highest integer ?

SELECT CEIL(AVG(sal)) FROM emp ; => 2074

2073----------------------------------------------2074

COUNT() :-
---------------

=> returns no of values present in a column

COUNT(colname)

Ex :-

SELECT COUNT(empno) FROM emp ; => 14

SELECT COUNT(comm) FROM emp ; => 4 => NULLs are not counted

COUNT(*) :-
----------------

=> returns no of rows in a table

SELECT COUNT(*) FROM emp ; => 14

difference between COUNT & COUNT(*) ?


=> COUNT function ignores null i.e. nulls are not counted
=> COUNT(*) counts nulls

T1
F1
10
NULL
20
NULL
30

COUNT(F1) => 3

COUNT(*) => 5

=> count no of employees joined in 1981 year ?

SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate,'YYYY') = 1981 ;

=> find no of employees joined on sunday ?

SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate, 'dy') = 'sun' ;

d
dy
day

SELECT col1,col2 FROM tabname ;

no of values return by col1 = no of values return by col2

Ex :-

1 SELECT ename,max(sal) FROM emp ; => ERROR


14 1

2 SELECT ename,ROUND(sal) FROM emp ; => EXECUTED


14 14

3 SELECT min(sal) , max(sal) FROM emp ; => EXECUTED


1 1

4 SELECT min(sal) , ROUND(sal) FROM emp ; => ERROR


1 14

SUMMARY :-

CHAR :- upper,lower,initcap,length,substr,instr,lpad,rpad,replace,translate
NUMERIC :- mod,round,trunc,ceil,floor
DATE :- add_months,months_between
CONVERSION :- to_char , to_date ,to_number
SPECIAL :- nvl,ascii,chr
ANALYTICAL :- rank,dense_rank
GROUP :- min,max,sum,avg,count,count(*)

==================================================================

CASE statement :-
---------------------------

=> used to implement if-then-else in sql queries


=> used to return values based on condition
=> case statements are 2 types

1 simple case
2 searched case

simple case :-
--------------------

=> use simple case when conditions based on "=" operator

CASE colname
WHEN value1 THEN return expr1
WHEN value2 THEN return expr2
----------------------
ELSE return expr
END

=> display ENAME DNAME ?


if deptno = 10 display HR
20 IT
30 SALES
others UNKNOWN

SELECT ename,
CASE deptno
WHEN 10 THEN 'HR'
WHEN 20 THEN 'IT'
WHEN 30 THEN 'SALES'
ELSE 'UNKNOWN'
END AS dname
FROM emp ;

=> display ENAME JOB ?

if job=CLERK display WORKER


MANAGER BOSS
PRESIDENT BIG BOSS
others EMPLOYEE

=> increment employee salaries as follows ?

if job=CLERK incr by 10%


SALESMAN 15%
MANAGER 20%
others 5%

UPDATE emp
SET sal = CASE job
WHEN 'CLERK' THEN sal + (sal*0.1)
WHEN 'SALESMAN' THEN sal + (sal*0.15)
WHEN 'MANAGER' THEN sal + (sal*0.2)
ELSE sal + (sal*0.05)
END ;

searched case :-
-------------------------

=> use searched case when conditions not based on "=" operator.

CASE
WHEN cond1 THEN return expr1
WHEN cond2 THEN return expr2
-------------------------
ELSE return expr
END

ex :-

display ENAME SAL SALRANGE ?

if sal>3000 display Hisal


sal<3000 display Losal
otherwise Avgsal

SELECT ename,sal,
CASE
WHEN sal>3000 THEN 'Hisal'
WHEN sal<3000 THEN 'Losal'
ELSE 'Avgsal'
END as salrange
FROM emp ;

=> display SNO TOTAL AVG RESULT ?

STUDENT
sno sname s1 s2 s3
1 A 80 90 70
2 B 30 60 50

SELECT sno ,
s1+s2+s3 as total,
ROUND((s1+s2+s3)/3 , 1) as avg,
CASE
WHEN s1>=35 AND s2>=35 AND s3>=35 THEN 'pass'
ELSE 'fail'
END as result
FROM student ;

========================================================================
==

13-DEC-24
GROUP BY clause :-
-----------------------------

=> GROUP BY clause is used to group rows based on one or more columns to calculate
min,max,sum,avg,count for each group. For ex to calculate dept wise no of employees
first group the rows based on dept and apply count(*) on each dept.

emp
empno ename sal deptno
1 A 3000 10
2 B 4000 20 group by 10 2
3 C 5000 30 =================> 20 3
4 D 6000 10 30 1
5 E 4000 20
6 F 3000 20

detailed data summarized data

=> GROUP BY clause converts detailed data to summarized data which is useful for analysis.

SELECT columns
FROM tabname
[WHERE cond]
GROUP BY col1 , col2,---
[HAVING cond]
[ORDER BY col ASC/DESC[ ;

Execution :-

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

Ex :-

=> display dept wise no of employees ?

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno ;

DEPTNO COUNT(*)
---------- ----------
30 6
10 3
20 5

FROM emp :-
------------------

emp
empno ename sal deptno
1 A 3000 10
2 B 4000 20
3 C 5000 30
4 D 6000 10
5 E 4000 20
6 F 3000 20

GROUP BY deptno :-
-------------------------------

10 1 A 3000
4 D 6000

20 2 B 4000
5 E 4000
6 F 3000

30 3 C 5000

SELECT deptno,COUNT(*) :-
-------------------------------------------

10 2
20 3
30 1

=> display job wise summary ?


SELECT job,MIN(sal),
MAX(sal),
SUM(sal),
COUNT(*)
FROM emp
GROUP BY job ;

JOB MIN(SAL) MAX(SAL) SUM(SAL) COUNT(*)


--------- - --------- ---------- ---------- ----------
CLERK 800 1300 4150 4
SALESMAN 1250 1600 5600 4
ANALYST 3000 3000 6000 2
MANAGER 2450 2975 8275 3
PRESIDENT 5000 5000 5000 1

=> display year wise no of employees joined ?

SELECT TO_CHAR(hiredate,'yyyy') as year,


COUNT(*)
FROM emp
GROUP BY TO_CHAR(hiredate,'yyyy') ;

=> day wise no of employees joined ?

SELECT TO_CHAR(hiredate,'day') as day ,


COUNT(*)
FROM emp
GROUP BY TO_CHAR(hiredate,'day') ;

=> month wise no of employees joined in the year 1981 ?

SELECT TO_CHAR(hiredate,'month') as month ,


COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') = 1981
GROUP BY TO_CHAR(hiredate,'month') ;

=> find the departments having more than 3 employees ?

SELECT deptno,COUNT(*)
FROM emp
WHERE COUNT(*) > 3
GROUP BY deptno ; => ERROR
oracle cannot calculate dept wise count before group by and it can calculate only after
group by , so apply the condition COUNT(*) > 3 after group by using HAVING clause.

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno
HAVING COUNT(*) > 3 ;

20 5
30 6

WHERE VS HAVING :-
----------------------------------

WHERE HAVING

1 select specific rows select specific groups

2 conditions applied before group by conditions applied after group by

3 use where clause if cond use having clause if


doesn't contain group function cond contains group function

=> find southern states having more than 5cr persons ?

PERSONS
AADHAARNO NAME GENDER DOB ADDR CITY STATE

SELECT state,COUNT(*)
FROM persons
WHERE state IN ('AP','TG','TN','KA','KL')
GROUP BY state
HAVING COUNT(*) > 50000000

AP 6CR
TG 4CR
TN 8CR
KA 7CR
KL 4CR
=> display job wise no of employees where job=clerk,manager and no of employees > 3 ?

SELECT job,COUNT(*)
FROM emp
WHERE job IN ('CLERK','MANAGER')
GROUP BY job
HAVING COUNT(*) > 3 ;

========================================================================
==

14-DEC-24 INTEGRITY CONSTRAINTS


=======================

=> Integrity constraints are rules to maintain data integrity i.e. data quality or data consistency
=> used to prevent users from entering invalid data.
=> used to enfroce rules like min bal must be 1000

Types of constraints :-
-------------------------------

1 NOT NULL
2 UNIQUE
3 PRIMARY KEY
4 CHECK
5 FOREIGN KEY
6 DEFAULT

=> above constraints can be declared in two ways

1 column level
2 table level

column level :-
-------------------

=> if constraints are declared immediately after declaring column then it is called
column level

CREATE TABLE <tabname>


(
colname datatype(size) constraint ,
colname datatype(size) constraint ,
----------------------
);

NOT NULL :-
-------------------

=> NOT NULL constraint doesn't accept null values


=> a column declared with NOT NULL is called mandatory column

ex :-
create table emp11
(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL
);

INSERT INTO emp11 VALUES(100,'') ; => ERROR


INSERT INTO emp11 VALUES(101,'A') ;

UNIQUE :-
-----------------

=> unique constraint doesn't accept duplicates

ex :-

create table cust


(
custid NUMBER(2) ,
cname VARCHAR2(10) ,
emailid VARCHAR2(20) UNIQUE
);

INSERT INTO cust VALUES(10,'A','[email protected]') ;


INSERT INTO cust VALUES(11,'B','[email protected]') ; => ERROR
INSERT INTO cust VALUES(12,'C','') ;
INSERT INTO cust VALUES(13,'D','') ;

NOTE :- unique constraint allows nulls

PRIMARY KEY :-
--------------------------

=> primary key doesn't accept duplicates and nulls.

=> it is the combination of unique & not null.

=> In tables one column must be there to uniquely identify and into that column
duplicates are nulls not allowed , so declare that column with primary key.

ex :-

CREATE TABLE emp12


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL
);

INSERT INTO emp12 VALUES(100,'A') ;


INSERT INTO emp12 VALUES(100,'B') ; => ERROR
INSERT INTO emp12 VALUES(NULL,'C'); => ERROR

=> a table can have only one primary key , if we want multiple primary keys then
declare one column with primary key and other columns with UNIQUE NOT NULL.

ex ;-

CREATE TABLE cust


(
custid NUMBER(4) PRIMARY KEY,
cname VARCHAR2(10) NOT NULL,
aadhaarno NUMBER(12) UNIQUE NOT NULL,
panno CHAR(10) UNIQUE NOT NULL
);

difference between UNIQUE & PRIMARY KEY ?

UNIQUE PRIMARY KEY

1 allows null doesn't allow nulls

2 table can have multiple table can have only one


unique constraints primary key.
candidate key :-
---------------------

=> a field eligible for primary key is called candidate key

ex :-

VEHICLES
VEHNO NAME MODEL COST CHASSISNO

candidate keys :- VEHNO,CHASSISNO


primary key :- VEHNO
secondary key :- CHASSISNO
or
alternate key

=> while creating table secondary keys are declared as UNIQUE NOT NULL.

CHECK :-
--------------

=> use check constraint when rule based on condition.

CHECK(condition)

Ex 1 :- sal must be min 3000

CREATE TABLE emp13


(
empno NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL,
sal NUMBER(7) CHECK(sal>=3000)
);

INSERT INTO emp13 VALUES(100,'A',1000); => ERROR


INSERT INTO emp13 VALUES(101,'B',5000);
INSERT INTO emp13 VALUES(102,'C',NULL);

NOTE :- check constraint allows nulls

ex 2 :- gender must be 'M','F' ?


GENDER CHAR(1) CHECK(GENDER IN ('M','F'))

ex 3 :- amt must be multiple of 100

AMT NUMBER(6) CHECK( MOD(AMT,100)=0)

ex 4 :- pwd must be min 6 chars

pwd VARCHAR2(12) CHECK(LENGTH(pwd) >= 6)

ex 5 :- emailid must contain '@'


must end with '.com' or '.co' or '.in'

emailid VARHCAR2(20) CHECK(emailid LIKE '%@%'


AND
(
emailid LIKE '%.com'
OR
emailid LIKE '%.co'
OR
emailid LIKE '%.in'
))

16-dec-24

FOREIGN KEY :-
------------------------

=> foreign key is used to establish relationship between two tables

=> to establish relationship between two table then take primary key of one table
and add it to another table as foreign key then declare with references constraint.

ex :-

projects
projid pname duration cost client
100 ABC 5 800 TATA MOTORS
101 KLM 4 600 DBS

emp
empno ename job sal projid REFERENCES projects(projid)
1 A SE 40 100
2 B SSE 70 101
3 C TL 90 999 => not accepted
4 D SE 30 100 => accepted
5 E SE 20 NULL => accepted

=> values entered in fk column should match with values entered in primary key column

=> fk allows duplicates and nulls.

=> after declaring fk a relationship is created between two tables called parent/child relationship

=> pk table is parent and fk table is child.

CREATE TABLE projects


(
projid NUMBER(3) PRIMARY KEY,
pname VARCHAR2(10) NOT NULL
);

INSERT INTO projects VALUES(100,'ABC');


INSERT INTO projects VALUES(101,'KLM');

CREATE TABLE emp_proj


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL,
sal NUMBER(7,2) CHECK(sal>=3000),
projid NUMBER(3) REFERENCES projects(projid)
);

INSERT INTO emp_proj VALUES(1,'A',5000,100);


INSERT INTO emp_proj VALUES(2,'B',4000,999); => ERROR
INSERT INTO emp_proj VALUES(3,'C',3000,100);
INSERT INTO emp_proj VALUES(4,'D',4000,NULL) ;

Relationship Types :-
------------------------------

1 one to one (1:1)


2 one to many (1:m)
3 many to one (m:1)
4 many to many (m:n)
=> by default oracle creates one to many relationship between two tables

How to establish one to one relationship :-


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

=> to establish one to one relationship declare foreign key with unique constraint

ex :-

DEPT
dno dname
10 HR
20 IT
30 SALES

MGR
mgrno mname start_date end_date dno REFERENCES dept(dno)
UNIQUE
1 A 10
2 B 20

How to establish many to many relationship :-


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

=> to establish many to many relationship create 3rd table and in 3rd table
take primary keys of both tables as foreign keys

STUDENT COURSE
SID SNAME CID CNAME
1 A 10 JAVA
2 B 11 ORACLE

REGISTRATIONS
SID CID DOR FEE
1 10 ? ?
1 11 ? ?
2 10 ? ?
orders products
ordid ord_dt del_dt cid prodid pname price

order_details
ordid prodid qty
1000 100 3
1000 101 2
1001 100 2

Composite primary key :-


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

=> if combination of columns declared primary key then it is called composite primary key.

=> In some tables we may not be able to uniquely identify the records by using
single column and we need to combination of columns to uniquely
identify and that combination of columns must be declared primary key

=> In composite primary key combination should not be duplicate.

=> composite primary key declared at table level.

ex :-

CREATE TABLE student


(
sid NUMBER(2) PRIMARY KEY,
sname VARCHAR2(10) NOT NULL
);

INSERT INTO student VALUES(1,'A') ;


INSERT INTO student VALUES(2,'B');

CREATE TABLE course


(
cid NUMBER(2) PRIMARY KEY,
cname VARCHAR2(10) NOT NULL
);

INSERT INTO course VALUES(10,'JAVA');


INSERT INTO course VALUES(11,'ORACLE');

CREATE TABLE registrations


(
sid NUMBER(2) REFERENCES student(sid) ,
cid NUMBER(2) REFERENCES course(cid) ,
dor DATE,
fee NUMBER(6) ,
PRIMARY KEY(sid,cid)
)

INSERT INTO registrations VALUES(1,10,SYSDATE,5000);


INSERT INTO registrations VALUES(1,11,SYSDATE,5000);
INSERT INTO registrations VALUES(2,10,SYSDATE,5000);
INSERT INTO registrations VALUES(1,10,SYSDATE,5000); => ERROR

DEFAULT :-
------------------

=> a column can be declared with default value as follows

ex : - hiredate date default sysdate

=> while inserting if we skip hiredate then oracle inserts default value

ex :-

CREATE TABLE emp15


(
empno NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL ,
hiredate DATE DEFAULT SYSDATE
);

INSERT INTO emp15(empno,ename) VALUES(100,'A');


INSERT INTO emp15 VALUES(101,'B','01-DEC-24');
INSERT INTO emp15 VALUES(102,'c','');

SELECT * FROM emp15 ;

100 A 16-DEC-24
101 B 01-DEC-24
102 C NULL

=> which of the following constraint cannot be declared at table level ?


A UNIQUE
B CHECK
C NOT NULL
D PRIMARY KEY
E FOREIGN KEY

ANS :- C

Which statements are true regarding constraints ?

A a foreign key cannot contain NULL value F


B a column with UNIQUE constraint can contain NULL value T
C a constraint is enforced only for the INSERT operation on a table F
D all constraints can be defined at column level and table level. F

Which CREATE TABLE statement is valid?

A. CREATE TABLE ord_details


(ord_no NUMBER(2) PRIMARY KEY,
item_no NUMBER(3) PRIMARY KEY,
ord_date DATE NOT NULL);

B. CREATE TABLE ord_details


(ord_no NUMBER(2) UNIQUE , NOT NULL,
item_no NUMBER(3),
ord_date DATE DEFAULT SYSDATE NOT NULL);

C. CREATE TABLE ord_details


(ord_no NUMBER(2) ,
item_no NUMBER(3),
ord_date DATE DEFAULT NOT NULL,
UNIQUE (ord_no),
PRIMARY KEY (ord_no));

D. CREATE TABLE ord_details


(ord_no NUMBER(2),
item_no NUMBER(3),
ord_date DATE DEFAULT SYSDATE NOT NULL,
PRIMARY KEY (ord_no, item_no));

========================================================================
==
17-dec-24 JOINS
---------

=> join is an operation performed to display data from two or more tables.

=> In db related data stored in multiple tables , to gather or to combine


data stored in multiple tables we need to join those tables.

ex :-

ORDERS CUST
ordid orddt deldt cid cid cname addr
1000 15/ 20/ 10 10 A HYD
1001 11 11 B HYD
1002 12 12 C HYD

OUTPUT :-

ordid orddt deldt cid cname caddr


1000 10 A HYD
1001 11 B HYD

Types of joins :-
----------------------

1 Inner join
equi join
non equi join
self join
2 Outer join
left outer
right outer
full outer
3 Cross / Cartesian join

Equi join :-
-----------------

=> To perform equi join between the two tables there must be a common field
and name of the common field need not to be same and pk-fk relationship
is not compulsory.

SELECT columns
FROM tab1 INNER JOIN tab2
ON join condition ;

join condition :-
-------------------------

=> join condition specifies which record of table1 joined with which record of table2

=> based on the given join condition oracle joins the records of two tables.

table1.commonfield = table2.commonfield

Ex :-

EMP DEPT
empno ename sal deptno deptno dname loc
1 A 3000 10 10 ACCOUNTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 4000 20 40 OPERATIONS
5 E 2000 NULL

=> display employee details with dept details ?

SELECT empno,ename,sal,dname,loc
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno ;

1 A 3000 ACCOUNTS NEW YORK


2 B 4000 RESEARCH ----
3 C 5000 SALES ----
4 D 4000 RESEARCH ----

=> In join queries declare table alias and prefix column names with table alias for two reasons

1 to avoid ambiguity
2 for faster execution

SELECT e.ename,d.deptno,d.dname,d.loc as city


FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno ;
=> display employees working at NEW YORK loc ?

SELECT e.ename,d.dname,d.loc
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno /* join cond */
WHERE d.loc='NEW YORK' /* filter cond */ ;

18-dec-24

joining more than two tables :-


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

=> if no of tables increases no of join conditions also increases , to join N tables


N-1 join conditions required.

SELECT columns
FROM tab1 INNER JOIN tab2
ON join cond
INNER JOIN tab3
ON join cond
INNER JOIN tab4
ON join cond ;

( (tab1 join tab2) join tab3 ) join tab4

Ex 1 :-

emp dept locations countries

empno deptno locid 100 country_id 1000


ename dname acct city hyd country_name ind
sal locid state tg
deptno country_id

=> display ename dname city state country_name ?

SELECT e.ename,
d.dname,
l.city,l.state,
c.country_name
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
INNER JOIN locations l
ON d.locid = l.locid
INNER JOIN countries c
ON l.country_id = c.country_id ;

Ex 2 :-

products cust
prodid pname price cid cname addr
100 A 50 10 K
101 B 60 11 P

orders
ordid orddt deldt cid
1000 10
1001 11

order_details
ordid prodid qty
1000 100 2
1000 101 3
1001 100 2
1001 101 3

=> display ordid ordt deldt cname caddr prodid pname price qty value ?
------------------------ ------------------- ----------------------------- -------
orders cust products ord-det

1 orders join cust


2 order join order_details
3 order_details join products

SELECT --------------- , p.price * od.qty as value


FROM orders o INNER JOIN cust c
ON o.cid = c.cid
INNER JOIIN order_details od
ON o.ordid = od.ordid
INNER JOIN products p
ON od.prodid = p.prodid

OUTER JOIN :-
-----------------------
=> inner join returns only matching records but it will not display unmatched records ,
to display unmatched records also perform outer join.

ex :-

EMP DEPT
empno ename sal deptno deptno dname loc
1 A 3000 10 10 ACCOUNTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 4000 20 40 OPERATIONS => unmatched row
5 E 2000 NULL => unmatched row

=> outer join is 3 types

1 LEFT OUTER JOIN


2 RIGHT OUTER JOIN
3 FULL OUTER JOIN

LEFT OUTER JOIN :-


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

=> returns all rows from left side table and matching rows from right side table

all rows => matched + unmatched

SELECT e.ename,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno ;

=> returns all rows from emp and matching rows from dept

A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp

RIGHT OUTER JOIN :-


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

=> returns all rows (matched + unmatched) from right side table and matching rows from left
side table
SELECT e.ename,d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno ;

=> returns all rows from dept table and matching rows from emp table

A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
NULL OPERRATIONS => unmatched from dept

FULL OUTER JOIN :-


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

=> returns all rows from both tables

SELECT e.ename,d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno ;

=> returns all rows emp & dept tables

A
ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
NULL OPERATIONS => unmatched from dept

19-dec-24

Displaying only unmatched records :-


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

left side table :-


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

SELECT e.ename,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname IS NULL ;
E NULL

right side table :-


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

SELECT e.ename,d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
WHERE e.ename IS NULL ;

NULL OPERATIONS

both tables :-
-------------------

SELECT e.ename,d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname IS NULL
OR
e.ename IS NULL ;

E NULL
NULL OPERATIONS

Question :-

T1 T2
F1 F1
1 1
2 2
1 1
2 2
NULL NULL
NULL NULL

=> no of rows return by the following operations ?

EQUI JOIN => 8


LEFT OUTER => 10
RIGHT OUTER => 10
FULL OUTER => 12
SELECT T1.F1,T2.F1
FROM T1 INNER JOIN T2
ON T1.F1 = T2.F1 ;

SELECT T1.F1,T2.F1
FROM T1 LEFT OUTER JOIN T2
ON T1.F1 = T2.F1 ;

SELECT T1.F1,T2.F1
FROM T1 RIGHT OUTER JOIN T2
ON T1.F1 = T2.F1 ;

SELECT T1.F1,T2.F1
FROM T1 FULL OUTER JOIN T2
ON T1.F1 = T2.F1 ;

Non equi join :-


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

=> Non equi join is performed between the tables not sharing a common field

ex :-

emp salgrade
empno ename sal grade losal hisal
1 A 3000 1 700 1000
2 B 1000 2 1001 2000
3 C 5000 3 2001 3000
4 D 1500 4 3001 4000
5 E 2500 5 4001 9999

=> display ENAME SAL GRADE ?

SELECT e.ename,e.sal,s.grade
FROM emp e INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal ;

A 3000 3
B 1000 1
C 5000 5
D 1500 2
E 2500 3

=> display grade 3 employee list ?

SELECT e.ename,e.sal,s.grade
FROM emp e INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
WHERE s.grade = 3 ;

=> display ENAME DNAME GRADE ?

SELECT e.ename,d.dname,s.grade
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
INNER JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal ;

ON e.deptno = d.deptno :-
--------------------------------------

EMP DEPT
empno ename sal deptno deptno dname loc
1 A 3000 10 10 ACCOUNTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 4000 20 40 OPERATIONS
5 E 2000 10

OUTPUT :- salgrade
grade losal hisal
A 3000 ACCOUNTS 1 700 1000
B 4000 RESEARCH 2 1001 2000
C 5000 SALES 3 2001 3000
D 4000 RESEARCH 4 3001 4000
E 2000 ACCOUNTS 5 4001 9999

ON e.sal between s.losal AND s.hisal :-


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

A 3000 ACCOUNTS 3
B 4000 RESEARCH 4
C 5000 SALES 5
D 4000 RESEARCH 4
E 2000 ACCOUNTS 2

20-dec-24

SELF JOIN :-
------------------

=> joining a table to itself is called self join or recursive join.

=> In self join a record in one table joined with another record of same table.

=> To perform self join the same table must be specified two times with different alias in FROM
clause

FROM emp x INNER JOIN emp y

emp x emp y
empno ename mgr empno ename mgr
7369 SMITH 7902 7369 SMITH 7902
7499 ALLEN 7698 7499 ALLEN 7698
7566 JONES 7839 7566 JONES 7839
7698 BLAKE 7839 7698 BLAKE 7839
7839 KING NULL 7839 KING NULL
7902 FORD 7566 7902 FORD 7566

=> display ENAME MGRNAME ?

SELECT x.ename , y.ename as manager


FROM emp x INNER JOIN emp y
ON x.mgr = y.empno ;

SMITH FORD
ALLEN BLAKE
JONES KING
BLAKE KING
FORD JONES

=> display employee names reporting to blake ?

SELECT x.ename , y.ename as manager


FROM emp x INNER JOIN emp y
ON x.mgr = y.empno
WHERE y.ename='BLAKE' ;

=> blake's manager name ?

SELECT x.ename , y.ename as manager


FROM emp x INNER JOIN emp y
ON x.mgr = y.empno
WHERE x.ename='BLAKE' ;

=> employees earning more than their manager ?

SELECT x.ename , x.sal ,


y.ename as manager , y.sal as mgrsal
FROM emp x INNER JOIN emp y
ON x.mgr = y.empno
WHERE x.sal > y.sal ;

=> employees sernior to their manager ?

WHERE x.hiredate < y.hiredate ;

=>

TEAMS
ID COUNTRY
1 IND
2 AUS
3 ENG

write a query to display following output ?

IND VS AUS
IND VS ENG
AUS VS ENG

TEAMS A TEAMS B
ID COUNTRY ID COUNTRY
1 IND 1 IND
2 AUS 2 AUS
3 ENG 3 ENG
A.ID <> B.ID A.ID < B.ID

IND AUS IND AUS


IND ENG IND ENG
AUS IND AUS ENG
AUS ENG
ENG IND
ENG AUS

SELECT A.COUNTRY||' VS '||B.COUNTRY


FROM TEAMS A INNER JOIN TEAMS B
ON A.ID < B.ID

CROSS / CARTESIAN JOIN :-


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

=> cross join returns cross product or cartesian product of two tables

A = 1,2
B = 3,4

AXB = (1,3) (1,4) (2,3) (2,4)

=> if cross join performed between two tables then all the records of 1st table
joined with all the records of 2nd table.

=> for cross join join condition is not required

SELECT e.ename,d.dname
FROM emp e CROSS JOIN dept d ;

=>

T1 T2
ITEM PRICE ITEMS PRICE
BURGER 80 JUICE 60
PIZZA 120 COOL DRINK 30

output :-

BURGER + JUICE 140


BURGER + COOL DRINK 110
PIZZA + JUICE 180
PIZZA + COOL DRINK 150

SELECT T1.ITEM||' + '||T2.ITEM , T1.PRICE + T2.PRICE AS TOTAL


FROM T1 CROSS JOIN T2

========================================================================

21-dec-24

SET OPERATORS :-
----------------------------

UNION
UNION ALL
INTERSECT
MINUS

A = 1,2,3,4
B = 1,2,5,6

A UNION B => 1,2,3,4,5,6


A UNION ALL B => 1,2,3,4,1,2,5,6
A INTERSECT B => 1,2
A MINUS B => 3,4
B MINUS A => 5,6

=> In oracle set operations performed between the records return by two queries

SELECT statement 1
UNION / UNION ALL / INTERSECT / MINUS
SELECT statement 2

Rules :-
------------

1 no of columns return by both queries must be same


2 corresponding columns datatype must be

Query 1 :
SELECT job FROM emp WHERE deptno = 20 ;

CLERK
MANAGER
ANALYST
CLERK
ANALYST

Query 2 :-

SELECT job FROM emp WHERE deptno = 30 ;

SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

UNION :-
------------

=> combines rows return by two queries


=> duplicates are eliminated
=> result is sorted

SELECT job FROM emp WHERE deptno = 20


UNION
SELECT job FROM emp WHERE deptno = 30 ;

ANALYST
CLERK
MANAGER
SALESMAN

SELECT job,sal FROM emp WHERE deptno = 20


UNION
SELECT job,sal FROM emp WHERE deptno = 30 ;

ANALYST 3000
CLERK 800
CLERK 950
CLERK 1100
MANAGER 2850
MANAGER 2975
SALESMAN 1250
SALESMAN 1500
SALESMAN 1600

=> difference between UNION & JOIN ?

union join

1 combines rows combines columns

2 horizontal merge vertical merge

3 performed between performed between


two query outputs two tables

Ex 1 :-

T1 T2
F1 C1
1 10
2 20
3 30

T1 UNION T2 :- T1 JOIN T2 :-
--------------------- --------------------

1 1 10
2 2 20
3 3 30
10
20
30

Ex 2 :-

EMP_US
eno ename sal dno
100 10
101 20
DEPT
EMP_IND dno dname loc
eno ename sal dno 10 HR
200 10 20 IT
201 30 30 SALES

=> total employees list ?

SELECT * FROM EMP_US


UNION
SELECT * FROM EMP_IND ;

=> employees working at US loc with dept details ?

SELECT e.* , d.*


FROM emp_us e INNER JOIN dept d
ON e.dno = d.dno ;

100 10 HR
101 20 IT

=> total employees with dept details ?

SELECT e.* , d.*


FROM emp_us e INNER JOIN dept d
ON e.dno = d.dno
UNION
SELECT e.* , d.*
FROM emp_ind e INNER JOIN dept d
ON e.dno = d.dno ;

100 10 HR
101 20 IT
200 10 HR
201 30 SALES

UNION ALL :-
------------------

=> combines rows


=> duplicates are not eliminated
=> result is not sorted

SELECT job FROM emp WHERE deptno = 20


UNION ALL
SELECT job FROM emp WHERE deptno = 30 ;

CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

difference between UNION & UNION ALL ?

UNION UNION ALL

1 eliminates duplicates doesn't eliminate duplicates

2 sorts result result is not sorted

3 slower faster

INTERSECT :-
------------------

=> returns common values from the output of two queries

SELECT job FROM emp WHERE deptno = 20


INTERSECT
SELECT job FROM emp WHERE deptno = 30 ;

CLERK
MANAGER

MINUS :-
----------------
=> returns values present in 1st query output and not present in 2nd query output

SELECT job FROM emp WHERE deptno = 20


MINUS
SELECT job FROM emp WHERE deptno = 30 ;

ANALYST

=>

T1 T2
F1 F1
1 1
2 2
3 3
10 40
20 50
30 60

=> write the output for the following operations

1 inner join
2 left join
3 right join
4 full join
5 union
6 union all
7 intersect
8 minus

Which statement is true regarding the INTERSECT operator?

A. It ignores NULL values. F


B. Reversing the order of the intersected tables alters the result. F
C. The names of columns in all SELECT statements must be identical. F
D. The number of columns and data types must be identical for all
SELECT statements in the query. T

======================================================================

23-dec-24
SUB-QUERIES / NESTED QUERIES :-
-------------------------------------------------------

=> a query in another query is called sub-query or nested query.


=> one query is called inner / child / sub - query
=> other query is called outer / parent / main query
=> oracle first executes inner query then it executes outer query
=> inner query output is input to outer query
=> use sub-query when where cond based on unknown value

Types of sub-queries :-
------------------------------

1 Non co-related sub-queries


2 Co-related sub-queries
3 INLINE views
4 scalar sub-queries

Non co-related sub-queries :-


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

SELECT columns
FROM tabname
WHERE colname OP (SELECT statement) ;

=> OP must be any relational operator like = > >= < <=

Ex :-

=> employees earning more than blake ?

SELECT *
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename='BLAKE') ;
-----------------------------------------------------------------------
2850

=> employees who are senior to king ?

SELECT *
FROM emp
WHERE hiredate < ( SELECT hiredate FROM emp WHERE ename='KING') ;
=> name of the employee earning max sal ?

SELECT ename
FROM emp
WHERE sal = MAX(sal) ; => ERROR

SELECT ename,MAX(sal)
FROM emp ; => ERROR

SELECT ename
FROM emp
WHERE sal = (SELECT MAX(sal) FROM emp) ;
---------------------------------------------
5000

=> name of the employee having max experience ?

SELECT ename
FROM emp
WHERE hiredate = (SELECT MIN(hiredate) FROM emp ) ;
-----------------------------------------------------
17-dec-80

=> display 2nd max sal ?

SELECT MAX(sal)
FROM emp
WHERE sal <> (SELECT MAX(sal) FROM emp) ;

=> display name of the employee earning 2nd max sal ?

SELECT ename
FROM emp
WHERE sal = (SELECT MAX(sal)
FROM emp
WHERE sal <> (SELECT MAX(sal) FROM emp)) ;

=> increase sal of employee by 10% having max experience ?

UPDATE emp
SET sal = sal + (sal*0.1)
WHERE hiredate = (SELECT MIN(hiredate) FROM emp) ;
=> swap employee salaries whose empno = 7369 , 7499 ?

before swap after swap

7369 880 7369 1600


7499 1600 7499 880

UPDATE emp
SET sal = CASE empno
WHEN 7369 THEN (SELECT sal FROM emp WHERE empno = 7499)
WHEN 7499 THEN (SELECT sal FROM emp WHERE empno = 7369)
END
WHERE empno IN (7369,7499) ;

UPDATE emp
SET sal = CASE empno
WHEN 7369 THEN 1600
WHEN 7499 THEN 880
END
WHERE empno IN (7369,7499) ;

=> employees working at NEW YORK loc ?

sub-query :-
----------------

SELECT *
FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE loc = 'NEW YORK') ;

join :-
----------

SELECT e.*
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
WHERE d.loc = 'NEW YORK' ;

=> display employee details with dept details working at NEW YORK loc ?

join :-
-----------

SELECT e.* , d.*


FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
WHERE d.loc = 'NEW YORK' ;

sub-query :-
-----------------

not possible

=> difference between sub-query and join ?

1 to display data from one table and condition based on another table then we can use
sub-query or join.

2 to display data from two tables then use join.

Multi-row sub-query :-
------------------------------

=> if sub-query returns more than one value then it is called multi row sub-query

SELECT columns
FROM tabname
WHERE colname OP (SELECT statement) ;

=> OP must be IN , NOT IN,ANY,ALL

single multi

= IN

<> NOT IN

> >ANY >ALL

< <ANY <ALL

=> employees working at NEW YORK,CHICAGO locations ?

SELECT *
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc IN ('NEW
YORK','CHICAGO'));
10
30

24-dec-24

ANY , ALL operators :-


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

=> used for > < comparision with multiple values

WHERE X > ANY(1000,2000,3000) WHERE X < ANY(1000,2000,3000)

IF X = 800 FALSE IF X = 800 TRUE


1500 TRUE X=1500 TRUE
4500 TRUE X=4500 FALSE

WHERE X > ALL(1000,2000,3000) WHERE X < ALL (1000,2000,3000)

IF X = 800 FALSE IF X = 800 TRUE


1500 FALSE 1500 FALSE
4500 TRUE 4500 FALSE

=> employees earning more than all managers ?

SELECT empno,ename,sal
FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE job='MANAGER') ;

2975
2850
2450

=> employees earning more than atleast one manager ?

SELECT empno,ename,sal
FROM emp
WHERE sal > ANY(SELECT sal FROM emp WHERE job='MANAGER') ;

co-related sub-queries :-
---------------------------------
=> if inner query references values of outer query then it is called co-related sub-query.

=> execution starts from outer query and inner query is executed no of times
depends on no of rows return by outer query.

=> use co-related sub-query to execute sub-query for each row

ex :-

EMP
empno ename sal deptno
1 A 5000 10
2 B 3000 20
3 C 4000 30
4 D 6000 20
5 E 3000 10

=> employees earning more than avg sal of the organization ?

SELECT *
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp) ;
-------------------------------------------
4200

=> employees earning more than avg sal of their dept ?

SELECT empno,ename,sal,deptno
FROM emp e
WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno) ;

EMP
empno ename sal deptno
1 A 5000 10 5000 > (4000) true
2 B 3000 20 3000 > (4500) false
3 C 4000 30 4000 > (4000) false
4 D 6000 20 6000 > (4500) true
5 E 3000 10 3000 > (4000) false

=> display employees earning max sal in their dept ?

SELECT empno,ename,sal,deptno
FROM emp e
WHERE sal = (SELECT MAX(sal) FROM emp WHERE deptno = e.deptno) ;

empno ename sal deptno


1 A 5000 10 5000 = (5000) TRUE
2 B 3000 20 3000 = (6000) FALSE
3 C 4000 30 4000 = (4000) TRUE
4 D 6000 20 6000 = (6000) TRUE
5 E 3000 10 3000 = (5000) FALSE

=> display top 3 max salaries ?

SAL
5000
1000
3000
2000
4000

SELECT DISTINCT a.sal


FROM emp a
WHERE 3 > (SELECT COUNT(b.sal)
FROM emp b
WHERE a.sal < b.sal)
ORDER BY sal DESC ;

emp a emp b
sal sal
5000 5000 3 > (0) TRUE
1000 1000 3 > (4) FALSE
3000 3000 3 > (2) TRUE
2000 2000 3 > (3) FALSE
4000 4000 3 > (1) TRUE

=> display Nth max salary ?

SELECT DISTINCT a.sal


FROM emp a
WHERE (&N-1) = (SELECT COUNT(b.sal)
FROM emp b
WHERE a.sal < b.sal)
ORDER BY sal DESC ;
26-dec-24

ROWID :-
-------------

=> returns address of a row i.e. where the record stored in db.
=> rowid is a psuedo column because it is not a column but acts like a column

SELECT ROWID,EMPNO,ENAME,SAL FROM EMP ;

psuedo columns :-
-------------------------

ROWID
ROWNUM
SYSDATE
LEVEL

=> rowids are used to delete duplicate records

Ex :-

EMP44
ENO ENAME SAL ROWID
1 A 5000 AAA
2 B 6000 AAB
3 C 7000 AAC
1 A 5000 AAD
2 B 6000 AAE

DELETE FROM EMP44 WHERE ROWID LIKE '%AAD' ;

DELETE FROM EMP44 WHERE ROWID LIKE '%AAE' ;

=> deleting duplicates row-by-row is difficult if table contains huge number of duplicate rows ,
so execute the following query to delete all duplicate rows

DELETE
FROM emp44 x
WHERE rowid <> (SELECT MIN(rowid)
FROM emp44
WHERE eno = x.eno
AND
ename = x.ename
AND
sal = x.sal) ;

EMP44
ENO ENAME SAL ROWID
1 A 5000 AAA <> ( AAA) FALSE
2 B 6000 AAB <> (AAB) FALSE
3 C 7000 AAC <> (AAC) FALSE
1 A 5000 AAD <> (AAA) TRUE
2 B 6000 AAE <> (AAB) TRUE

what is the difference between above query and distinct ?

=> above query deletes duplicate records from the table


=> distinct eliminates duplicates only from the select stmt output

method 2 :-

CREATE TABLE TEMP


AS
SELECT DISTINCT * FROM EMP44 ;

SELECT * FROM TEMP ;

1 A 5000
2 B 6000
3 C 7000

DROP TABLE EMP44 ;

RENAME TEMP TO EMP44 ;

SELECT * FROM EMP44 ;

1 A 5000
2 B 6000
3 C 7000

INLINE views :-
--------------------
=> sub-queries in FROM clause are called INLINE views.

SELECT columns
FROM (SELECT statemeent) <ALIAS>
WHERE condition ;

=> sub-query output acts like a table for outer query


=> INLINE views are used in following scenarios

1 to control order of execution of clauses


2 to join two query outputs

controlling order of execution :-


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

default order :-
--------------------

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

=> to control this order use inline views

SELECT columns SELECT columns


FROM tab ====================> FROM (SELECT columns
WHERE cond FROM tab
ORDER BY col ASC ORDER BY col )
WHERE cond

Ex 1 :-

=> display ranks of the employees based on sal and highest paid should get 1st rank ?

SELECT empno,ename,sal,
dense_rank() over (ORDER BY sal DESC) as rnk
FROM emp ;

above query displays ranks of all the employees but to display top 5 employees
SELECT empno,ename,sal,
dense_rank() over (ORDER BY sal DESC) as rnk
FROM emp
WHERE rnk <= 5 ; => ERROR

column alias cannot be used in where clause because where clause is executed
before select , to overcome this use INLINE views.

SELECT *
FROM (SELECT empno,ename,sal,
dense_rank() over (ORDER BY sal DESC) as rnk
FROM emp) E
WHERE rnk<=5 ;

SELECT DISTINCT sal


FROM (SELECT sal,
dense_rank() over (ORDER BY sal DESC) as rnk
FROM emp) E
WHERE rnk<=5 ;

27-dec-24

ROWNUM :-
-----------------

=> returns record numbers for the records return by query


=> rownum is also a psuedo column

ex :-

SQL>SELECT rownum,empno,ename,sal FROM emp ;

=> rownum is useful when fetching records from table is based on record number.

=> rownum is not based on table and it is based on select stmt output , if
output changes rownum also changes.

SQL>SELECT rownum,empno,ename,sal FROM emp WHERE sal >= 2000 ;

5 7839 KING 5000


SQL>SELECT rownum,empno,ename,sal FROM emp WHERE sal >= 3000;

2 7839 KING 5000

=> display first 5 rows from emp ?

SELECT empno,ename,sal
FROM emp
WHERE rownum <= 5 ;

=> display 5th row ?

SELECT empno,ename,sal
FROM emp
WHERE rownum = 5 ; => no rows

In where conditions with rownum = > operators will not work


only < <= operators can be used with rownum , to overcome this use INLINE views

SELECT *
FROM (SELECT ROWNUM as rno,empno,ename,sal FROM emp) E
WHERE rno = 5 ;

WHERE rno IN (5,10,15) ;

WHERE rno BETWEEN 5 AND 10

WHERE MOD(rno,2) = 0 ;

=> display last 3 rows ?

SELECT *
FROM (SELECT ROWNUM as rno,empno,ename,sal FROM emp) E
WHERE rno >= (SELECT COUNT(*)-2 FROM emp) ;

1 display top 3 max salaries ?

1 using fetch clause


2 using co-related sub-query
3 using inline views & dense_rank function
2 displaying records based on record numbers ?

1 using fetch clause


2 using inline views & rownum

3 deleting duplicate rows ?

1 using co-related sub-query & rowid


2 using distinct clause

Question 1 :-

T1
AMT
1000
-500
2000
-800
3000
-600

output :-

POS NEG
1000 -500
2000 -800
3000 -600

Question 2 :-

T1 T2
F1 C1
1 A
2 B
3 C

output :-

1 A
2 B
3 C

SELECT ROWNUM AS RNO,F1 FROM T1 ;


1 1
2 2
3 3

SELECT ROWNUM AS RNO,C1 FROM T2 ;

1 A
2 B
3 C

SELECT A.F1 , B.C1


FROM (SELECT ROWNUM AS RNO,F1 FROM T1) A
INNER JOIN
(SELECT ROWNUM AS RNO,C1 FROM T2) B
ON A.RNO = B.RNO ;

scalar sub-queries :-
-----------------------------

=> sub-queries in SELECT clause are called scalar sub-queries

SELECT (select stmt1) , (select stmt2) , -----------


FROM tabname
WHERE cond ;

=> sub-query output acts like a column for outer query


=> use scalar sub-query to show the query output in seperate column

Ex 1 :-

SELECT (SELECT COUNT(*) FROM emp) AS EMP,


(SELECT COUNT(*) FROM dept) AS DEPT
FROM DUAL ;

SELECT 15,4 FROM DUAL ;

Ex 2 :-

=> display dept wise total salary ?

SELECT DEPTNO,SUM(SAL) AS DEPT_TOTAL


FROM EMP
GROUP BY DEPTNO ;

DEPTNO DEPT_TOTAL
---------- -------------------
30 9400
10 8750
20 10875

=> display DEPTNO DEPT_TOTAL TOTAL ?

SELECT DEPTNO,SUM(SAL) AS DEPT_TOTAL ,


(SELECT SUM(SAL) FROM EMP) AS TOTAL
FROM EMP
GROUP BY DEPTNO ;

30 9400 29025
10 8750 29025
20 10875 29025

=> display DEPTNO DEPT_TOTAL TOTAL PCT ?

PCT = (dept_total / total)*100

SELECT DEPTNO,SUM(SAL) AS DEPT_TOTAL ,


(SELECT SUM(SAL) FROM EMP) AS TOTAL ,
( SUM(SAL) / (SELECT SUM(SAL) FROM EMP))*100 AS PCT
FROM EMP
GROUP BY DEPTNO ;

simple select
where
order by
distinct
fetch
functions
group by & having
joins
set operators
sub-queries

28-dec-24
CREATING NEW TABLE FROM EXISTING TABLE (creating replica) :-
---------------------------------------------------------------------------------------------

CREATE TABLE <new-tabname>


AS
SELECT columns FROM <old-tabname> [WHERE cond] ;

Ex 1 :- copying complete table

CREATE TABLE EMP11


AS
SELECT * FROM EMP ;

a new table is created with name EMP11 and rows & cols return by query are copied to
EMP11.

Ex 2 :- copy specific rows & cols

CREATE TABLE EMP12


AS
SELECT empno,ename,job,sal
FROM emp
WHERE job IN ('CLERK','MANAGER') ;

Ex 3 :- copying table from one user to another user

copy table emp_dept from batch40 to batch41 ?

SYSTEM :-
---------------

CREATE TABLE BATCH41.emp_dept


AS
SELECT * FROM BATCH40.emp_dept ;

Ex 4 :- copy only structure but not data

CREATE TABLE emp13


AS
SELECT * FROM emp WHERE 1=2 ;

copying data from one table to another table :-


------------------------------------------------------------
INSERT INTO <target-table>
SELECT columns FROM <source-table> [WHERE cond] ;

Ex :-

=> copy data from emp to emp13 ?

INSERT INTO emp13


SELECT * FROM emp ;

MERGE command :-
----------------------------

=> MERGE is the combination of INSERT & UPDATE


=> command used to merge data into a table.
=> command used to manage replicas
=> using merge command we can apply changes made to source table to replica.

MERGE INTO <target-table> <alias>


USING <source-table> <alias>
ON (condition)
WHEN MATCHED THEN
UPDATE
WHEN NOT MATCHED THEN
INSERT ;

Ex :-

CUSTS CUSTT
CID CNAME ADDR CID CNAME ADDR
10 A BLR 10 A HYD
11 B MUM 11 B MUM
12 C DEL

STEP 1 :- create source table


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

CREATE TABLE CUSTS


(
CID NUMBER(2),
CNAME VARCHAR2(10),
ADDR VARCHAR2(10)
);

INSERT INTO CUSTS VALUES(10,'A','HYD') ;


INSERT INTO CUSTS VALUES(11,'B','MUM');

STEP 2 :- create replica

CREATE TABLE CUSTT


AS
SELECT * FROM CUSTS ;

STEP 3 :- modify source table data

1 INSERT INTO CUSTS VALUES(12,'C','DEL') ;

2 UPDATE CUSTS SET ADDR='BLR' WHERE CID=10 ;

STEP 4 :- execute merge command to apply changes made to CUSTS to CUSTT

MERGE INTO CUSTT T


USING CUSTS S
ON (S.CID = T.CID)
WHEN MATCHED THEN
UPDATE SET T.ADDR = S.ADDR
WHEN NOT MATCHED THEN
INSERT VALUES (S.CID,S.CNAME,S.ADDR);

Ex 2 :-

EMPS EMPT
EMPNO ENAME SAL EMPNO ENAME SAL
1 A 5000 1 A
2 B 6000 2 B
3 C 7000 3 C

=> copy salareis from EMPS to EMPT ?

1 UPDATE command
2 merge command

========================================================================
=
30-dec-24

DATABASE TRANSACTIONS :-
-----------------------------------------

=> a transaction is a unit of work that contains one or more dmls


and must be saved as a whole or must be cancelled as a whole.

ex :- acct1 -----------------------1000--------------------------acct2

update1 update2

(bal=bal-1000) (bal=bal+1000)

successful failed INVALID

failed successful INVALID

successful successful VALID

failed failed VALID

=> every db txn must gurantee a property called "atomocity" i.e. all or none
if txn contains multiple dmls , if all are successful then it must be saved ,
if one of the operation fails then entire txn must be cancelled.

=> the following commands provided by oracle to handle transactions


called TCL commands

COMMIT => to save txn


ROLLBACK => to cancel txn
SAVEPOINT => to cancel part of the txn

=> every txn has a begins point and an end point.

=> a txn begins implicitly when user submits dml command to oracle.

=> a txn ends when user submits any of the following command

1 COMMIT / ROLLBACK
2 DDL command txn ends with COMMIT

ex 1 :-
create table a(a number(2)); => commit
insert into a values(10); => txn begins T1
insert into a values(20);
insert into a values(30);
insert into a values(40);
rollback; => txn ends

=> if txn ends with rollback then it is aborted txn and operations are cancelled.

ex 2 :-

create table a(a number(2)); => commit


insert into a values(10); => txn begins T1
insert into a values(20);
create table b(b number(2)); => commit
insert into a values(30); => txn begins T2
insert into a values(40);
rollback; => txn ends

if txn ends with commit then it is called successful txn and operations are saved

savepoint :-
----------------

=> we can declare savepoint and we can cancel upto the savepoint
=> using savepoint we can cancel part of the txn

ex :-

create table a(a number(2));


insert into a values(10);
insert into a values(20);
savepoint sp1;
insert into a values(30);
insert into a values(40);
savepoint sp2;
insert into a values(50);
insert into a values(60);
rollback to sp1;

select * from a ;
10
20

============================================================

LOCKING :-
----------------

=> accessing same data by no of users at the same time is called


concurrent access , when data accessed concurrently then
users encounters following problems

1 dirty read
2 lost update
3 phantom read
4 non repeatable read

=> to overcome these problems every db system supports a mechanism


called locking.

=> locks are 2 types

1 shared lock (S)


2 exclusive lock (X)

=> oracle will apply shared lock when user try to read data (select stmt).
=> oracle will apply exclusive lock when user try to modify data (i,u,d).

S X

S YES YES

X YES NO

Ex :-

BATCH40 SYSTEM

1 update emp 2 update batch40.emp


set sal = 2000 set sal=3000
where empno = 7844 ; where empno = 7844;
(updated + locked) --------wait----------------

3 commit ; 4 1 row updated

DeadLock :-
---------------

=> deadlock is the situation where two users mutually waits for one another ,
if deadlock occurs then oracle throws error so that one transaction
can be cancelled and another can be continued.

Ex :-

BATCH40 SYSTEM

1 update emp 2 update batch40.emp


set sal = 2000 set sal=3000
where empno = 7844 ; where empno = 7566;

(updated + locked) (updated + locked)

3 update emp 4 update batch40.emp


set sal = 2000 set sal=3000
where empno = 7566; where empno = 7844;

------------wait---------- --------wait----------------

---------------------------------------deadlock----------------------------------------------------------

5 error

6 rollback; 7 commit ;

TABLE LEVEL locking :-


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

=> In table level the whole table is locked i.e. all the records of the table are locked

LOCK TABLE <tabname> IN <mode> ;

Ex :-
SQL> LOCK TABLE emp IN EXCLUSIVE MODE ;

===============================================================

DB Security :-
------------------

1 USERS => provides security at db level


2 PRIVILEGES => provides security at table level
3 VIEWS => provides security at row & col level

server
database (users)
table (privileges)
rows & cols (views)

creating new user :-


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

SYSTEM :-
--------------

SQL>create user naresh identified by oracle


default tablespace users
quota unlimited on users ;

SQL> GRANT connec,resource to naresh ;

PRIVILEGES :-
------------------

=> privileges means permissions


=> privileges are granted to users by using grant command

GRANT <privileges> ON <tabname> TO <usernames>;

Ex :-

BATCH40 :-
-----------------

SQL>GRANT select,insert,update,delete on emp to naresh ;


NARESH :-
----------------

SQL>SELECT * FROM batch40.emp ;

SQL> UPDATE batch40.emp SET sal = 1000 WHERE empno = 7369 ;

changes made by naresh visible to batch40 only after commit.

REVOKE command :-
-----------------------------

=> command used to take back permissions from user

REVOKE <privileges> ON <tabname> FROM <usernames> ;

Ex :-

BATCH40 :-
-----------------

SQL>REVOKE SELECT,INSERT,UPDATE,DELETE ON emp FROM naresh ;

DB objects :-
------------------

SQL :-
----------

TABLES
VIEWS
SYNONYMS
SEQUENCES
INDEXES

PL/SQL :-
------------

PROCEDURES
FUNCTIONS
PACKAGES
TRIGGERS
VIEWS :-
------------

=> a view is a subset of a table i.e. part of the table.

=> a view is a virtual table because it doesn't store data and doesn't
occupy memory and it always derives data from base table.

=> a view is a representation of a query

=> views are created

1 to provide security
2 to reduce complexity

=> views are 2 types

1 simple views
2 complex views

simple views :-
---------------------

=> if view created on single table then it is called simple view.

CREATE VIEW <name>


AS
SELECT statement ;

Granting permissions to create view :-


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

SYSTEM :-
---------------

SQL>GRANT CREATE VIEW TO BATCH40 ;

Ex :-

SQL>CREATE VIEW v1
AS
SELECT empno,ename,job,deptno FROM emp ;

=> oracle creates view V1 and stores query but not query output

SELECT * FROM v1 ;

=> oracle executes the above query as follows

SELECT * FROM (SELECT empno,ename,job,deptno FROM emp) ;

Granting permissions on view to user :-


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

SQL>GRANT SELECT,INSERT,UPDATE,DELETE ON v1 TO naresh ;

NARESH :-
---------------

SQL>SELECT * FROM batch40.v1 ;

SQL>UPDATE batch40.v1 SET job='MANAGER' WHERE empno = 7369 ;

SQL>UPDATE batch40.v1 SET sal=2000 WHERE empno = 7369 ; => error

Row level security :-


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

SQL>CREATE VIEW V2
AS
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno = 20 ;

SQL>GRANT SELECT,INSERT,UPDATE,DELETE ON V2 TO NARESH ;

NARESH :-
---------------

SQL>SELECT * FROM batch40.v2 ;

SQL>INSERT INTO batch40.v2 VALUES(666,'PQR','CLERK',30);

above insert command executed successfully even though it is violating


where cond.

WITH CHECK option :-


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

=> if view created with " WITH CHECK " option then any dml command
through view violates where cond that dml is not accepted.

SQL>CREATE VIEW V3
AS
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno = 20
WITH CHECK OPTION ;

SQL>GRANT select,insert,update,delete on v3 TO naresh ;

NARESH :-
------------------

SQL>INSERT INTO batch40.v3 VALUES(7777,'KLM','CLERK',30); => ERROR

1-jan-25

complex views :-
----------------------

=> a view said to be complex view

1 if based on multiple tables


2 if query contains group by clause
distinct clause
aggregate functions
set operators
sub-queries

=> with the help of views complex queries can be converted into simple queries

ex 1 :-

CREATE VIEW CV1


AS
SELECT e.empno,e.ename,e.sal,
d.deptno,d.dname,d.loc
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno ;

=> afer creating view , whenever user wants data from emp & dept tables then
instead of writing complex join query write the simple query as follows

SELECT * FROM CV1 ;

ex 2 :-

CREATE VIEW CV2


AS
SELECT d.dname,MIN(e.sal) as minsal,
MAX(e.sal) as maxsal,
SUM(e.sal) as totsal,
COUNT(*) as cnt
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
GROUP BY d.dname ;

after creating view whenever user want dept wise summary then execute the following
simple query

SELECT * FROM CV2 ;

=> difference between simple and complex views ?

simple complex

1 based on single table based on multiple tables

2 query performs simple query perform complex


operations operations like joins,group by etc

3 allows dmls doesn't allow dmls


i.e. updatable i.e. not updatable

USER_VIEWS :-
-----------------------

=> system table that stores information about views created by user
list of views created by user ?

SELECT VIEW_NAME FROM USER_VIEWS ;

displa query declared with V1 ?

SELECT TEXT FROM USER_VIEWS WHERE VIEW_NAME='V1' ;

Droping :-
--------------

DROP VIEW V1 ;

if we drop base table what about views created on base table ?

ans :- views are not dropped but becomes invalid

2-jan-25

SYNONYMS :-
--------------------

=> a synonym is another name to the table or view.

=> if tablename is lengthy then we can give a simple and short name to the table
called synonym and instead of using tablename we can use synonym name
in SELECT / INSERT / UPDATE / DELETE queries.

CREATE SYNONYM <name> FOR <tabname> ;

Granting permission to create synonym :-


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

SYSTEM :-
----------------

SQL>GRANT CREATE SYNONYM TO BATCH40 ;

BATCH40 :-
------------------

SQL>CREATE SYNONYM D FOR DEPT ;


after creating synonym instead of using tablename DEPT use synonym name
in SELECT / INSERT / UPDATE / DELETE queries.

SQL>SELECT * FROM D ;

SQL>UPDATE D SET LOC='HYD' WHERE DEPTNO = 10 ;

Accessing tables without owner name :-


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

BATCH40 :-
----------------

SQL>GRANT SELECT,INSERT,UPDATE,DELETE ON EMP TO NARESH ;

NARESH :-
-----------------

SQL>SELECT * FROM BATCH40.EMP ;

SQL>CREATE SYNONYM EMP FOR BATCH40.EMP ;

SQL>SELECT * FROM EMP ;

Question :-
------------------

SQL>CREATE SYNONYM E FOR EMP ;

SQL>SELECT * FROM EMP E ;

SQL>RENAME EMP TO E ; => changes tablename from EMP to E

difference between synonym and alias ?

synonym alias

1 permanent not permanent

2 stored in db not stored in db

3 scope of the synonym scope the alias is


is upto the user upto the query
USER_SYNONYMS :-
-----------------------------

=> system table that stores synonyms created by user

list of synonyms ?

SELECT SYNONYM_NAME,TABLE_NAME FROM USER_SYNONYMS ;

Droping synonym :-
--------------------------

SQL>DROP SYNONYM D ;

if we drop table what about synonyms created on table ?

ANS :- synonyms are not dropped but becomes invalid

Question :-

SQL> DROP TABLE products;

What is the implication of this command? (Choose all that apply.)

A. All data along with the table structure is deleted. T


B. The pending transaction in the session is committed. T
C All views and synonyms will remain but they are invalidated. T
D. All data in the table are deleted but the table structure will remain. F

SEQUENCES :-
-----------------------

=> sequence is also a db object created to generate sequence numbers.


=> used to auto increment column values.

CREATE SEQUENCE <name>


[START WITH <value>]
[INCREMENT BY <value>]
[MAXVALUE <value>]
[MINVALUE <value>]
[CYCLE]
[CACHE <size>] ;

Ex 1 :-

SQL>CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 5;

SQL>CREATE TABLE STUDENT


(
SID NUMBER(2),
SNAME VARCHAR2(10)
);

use sequence s1 to generate sid ?

SQL>INSERT INTO STUDENT VALUES(S1.NEXTVAL , 'A') ;


SQL>INSERT INTO STUDENT VALUES(S1.NEXTVAL , 'B') ;
SQL>NSERT INTO STUDENT VALUES(S1.NEXTVAL , 'C);
SQL>NSERT INTO STUDENT VALUES(S1.NEXTVAL , 'D') ;
SQL>NSERT INTO STUDENT VALUES(S1.NEXTVAL , 'E');
SQL>NSERT INTO STUDENT VALUES(S1.NEXTVAL , 'F') ; => ERROR

SELECT * FROM STUDENT ;

SID SNAME
1 A
2 B
3 C
4 D
5 E

Ex 2 :-

SQL>CREATE SEQUENCE S2
START WITH 100
INCREMENT BY 1
MAXVALUE 9999;

use sequence s2 to generate empno for existing employees ?

SQL>UPDATE emp SET empno = S2.NEXTVAL ;


Ex 3 :-

BILLNO
BILLNO BDATE AMT
DM/020125/1
DM/02/0125/2

CREATE TABLE BILL


(
BILLNO VARCHAR2(20) ,
BDATE DATE,
AMT NUMBER(6)
);

CREATE SEQUENCE S3
START WITH 1
INCREMENT BY 1
MAXVALUE 9999 ;

INSERT INTO BILL


VALUES('DM/'||TO_CHAR(SYSDATE,'DDMMYY')||'/'||S3.NEXTVAL,SYSDATE,1000);

CYCLE :-
------------

=> by default sequence created with NOCYCLE i.e. after reaching max value then it stops.

=> if sequence created with cycle then after reaching max then it will be
reset to min

CREATE SEQUENCE S10


START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE
CACHE 4 ;

CACHE size :-
---------------------

CREATE SEQUENCE S11


START WITH 1
INCREMENT BY 1
MAXVALUE 1000
MINVALUE 1
CYCLE
CACHE 100;

=> next 100 values are preallocated in cache memory and every time we call
seq.nextval oracle goes to cache memory and returns the value from
cache memory and accessing cache memroy is faster than accessing
db and this improves performance.

=> default cache size is 20

=> cache size must be less than one cycle.

=> list of sequences created by user ?

SELECT min_value,max_value,increment_by,cycle_flag,cache_size
FROM user_sequences
WHERE sequence_name='S15' ;

Droping :-

DROP SEQUENCE S1 ;

INDEXES :-
----------------

=> index is also a db object created to improve query performance.

=> index improves performance of data accessing.

=> index in db is similar to index in textbook , in textbook using


index a particular topic can be located fastly , in db using
index a particular record can be located fastly.

=> indexes are created on columns and that column is called index key.

=> indexes created on columns

1 that are frequently used in where clause


2 that are frequently used in join operation
CREATE INDEX <name> ON <tabname> (colname) ;

ex :-

SQL>CREATE INDEX I1 ON EMP(SAL) ;

=> when above command is executed oracle creates a structure called


BTREE (balanced binary tree).

EMP 3000
sal
5000
1000 2000 4000
3000
2000 1000 * 2500 * 4000 * 5000 *
4000 1500 * 3000 *,*
1500 2000 *
3000
2500

=> when we submit a query to oracle , it used following methods to access the data

1 TABLE SCAN
2 INDEX SCAN

=> In table scan , oracle scans complete table i.e. each and every row.

=> In index scan on avg oracle scans only half of the table , so index scan
is much faster than table scan.

SELECT * FROM emp WHERE sal = 3000 ; (index scan)


SELECT * FROM emp WHERE sal>=3000; (index scan)
SELECT * FROM emp WHERE sal<=3000; (index scan)

SELECT * FROM emp WHERE ename='BLAKE' ; (table scan)


SELECT * FROM emp ; (table scan)

UNIQUE index :-
------------------------

=> unique index doesn't allow duplicate values into the column on which
index is created.
ex :- CREATE UNIQUE INDEX I2 ON EMP(ENAME) ;

G Q

ADAMS * JAMES * MARTIN * SCOTT *


ALLEN * JONES * MILLER * SMITH *
BLAKE *

1 SELECT * FROM emp WHERE ename='BLAKE' ;

2 INSERT INTO emp(empno,ename,sal) VALUES(888,'BLAKE',2000); => ERROR

How many methods are there to enforce uniqueness ?

1 declare pk / unique constraint


2 create unique index

note :-

=> primary key / unique columns are implicitly indexed by oracle ,


oracle creates a unique index on primary key / unique columns
and unique index doesn't allow duplicates , so primary key / unique
also doesn't allow duplicates.

USER_INDEXES :-
--------------------------

=> stores indexes created by user

SELECT INDEX_NAME,INDEX_TYPE
FROM USER_INDEXES
WHERE TABLE_NAME='EMP' ;

Droping :-
------------

DROP INDEX I1 ;

SERVER
DATABASE
TABLE
ROWS & COLS
CONSTRAINTS
INDEXES
TRIGGERS
VIEWS
SYNONYMS
SEQUENCES

SQL

commands clauses operations objects

DDL WHERE FILTERING TABLES


DML ORDER BY SORTING VIEWS
DQL DISTINCT ELIMINATING DUPLICATES SYNONYMS
TCL FETCH TOP N ROWS SEQUENCES
DCL GROUP BY GROUPING INDEXES
HAVING FILTERS GROUPS
ON JOINING
FUNCTIONS
SET OPERATIONS
SUB-QUERIES

========================================================================
=

PL/SQL (PROCEDURAL LANG/SQL)


=============================

basic programming
conditional statements
loops
cursors
error handling
procedures
functions
packages
triggers
USER----SQLPLUS--------------SQL-----------------ORACLE-----------DB

USER----SQLPLUS--------------PL/SQL-----------------ORACLE-----------DB

ORACLE

SQL PL/SQL
(commands) (blocks)

Features :-
----------------

improves performance :-
---------------------------------

=> In pl/sql , sql commands can be grouped into one block and we submit
that to oracle , so in pl/sql no of requests and response between user and
oracle are reduced and performance is improved.

supports conditional statements :-


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

=> PL/SQL supports conditional statements like IF-ELSE , so in pl/sql we can


execute sql queries based on conditions.

supports loops :-
----------------------

=> pl/sql supports looping statements like while,for , so in pl/sql we can


execute sql queries repeatedly multiple times.

supports error handling :-


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

=> In pl/sql , if any statement causes error we can handle that error and
we can display our own simple and user friendly message.

supports reusability :-
-----------------------------

=> pl/sql programs can be stored in db , so applications which are connected


to db can reuse pl/sql programs.
=> pl/sql blocks are 2 types

1 Anonymous Blocks
2 Named Blocks
procedures
functions
packages
triggers

Anonymous Blocks :-
=================

=> a pl/sql program without name is called anonymous block

DECLARE
<declaration-part>; optional
BEGIN
<statements>;
END;
/ => compiled & executed

How to print messages :-


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

DBMS_OUTPUT.PUT_LINE(message) ;
--------------------- --------------
package procedure

=> by default messages are not send to output , to send messages to output
execute the following command.

SQL>SET SERVEROUTPUT ON

How to write pl/sql programs :-


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

1 Editors
2 IDEs

EDITOR IDE

coding yes yes


compiling no yes

executing no yes

debugging no yes

example notepad sql developer

using notepad :-
-----------------------

=> open notepad and enter following code

begin
dbms_output.put_line('welcome');
end;
/

=> save the program in a file as D:\ORACLE\"prog1.sql"

=> go to sqlplus compiled and run the program as follows

SQL>@D:\ORACLE\"prog1.sql"

output :- welcome

8-JAN-25

Datatypes in PL/SQL :-
--------------------------------

1 scalar types or built-in types


2 user define types
3 reference types

scalar types :-
-----------------

1 char/varchar2/long/clob
2 nchar/nvarchar2/nclob
3 number(p) / number(p,s)
4 date / timestamp
5 bfile/blob
6 binary_float / binary_double
7 binary_integer
8 boolean

1 TO 6 => allowed in SQL , PL/SQL


7,8 => allowed only in PL/SQL but not allowed in SQL

Declaring variable :-
---------------------------

variablename datatype(size) ;

ex :- x NUMBER(4);
s VARCHAR2(10);
d DATE;
b BOOLEAN;

Assigning value to variable :-


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

varname := value ; := assignment operator


= comparision operator

x := 100;
s := 'hello' ;
d := sysdate;
b := TRUE;

=> wap to add two numbers ?

DECLARE
a NUMBER(3);
b NUMBER(3);
c NUMBER(4);
BEGIN
a := 100;
b := 200;
c := a+b;
DBMS_OUTPUT.PUT_LINE(c);
END;
/
To input values at runtime :-
-----------------------------------

DECLARE
a NUMBER(3);
b NUMBER(3);
c NUMBER(4);
BEGIN
a := &a;
b := &b;
c := a+b;
DBMS_OUTPUT.PUT_LINE(c);
END;
/

=> wap to input date and print day of the week ?

DECLARE
d DATE;
BEGIN
d := '&date' ;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(d,'day'));
END;
/

=> wap to input name and print first name,middle name,last name ?

input :- sachin ramesh tendulkar

output :-

First Name = sachin


Middle Name = ramesh
Last Name = tendulkar

DECLARE
n VARCHAR2(30);
f VARCHAR2(20);
m VARCHAR2(20);
l VARCHAR2(20);
BEGIN
n := '&name' ;
f := SUBSTR(n,1,INSTR(n,' ')-1);
l := SUBSTR(n,INSTR(n,' ',1,2)+1);
m := RTRIM( LTRIM(n,f),l);
DBMS_OUTPUT.PUT_LINE(' First Name = '||f);
DBMS_OUTPUT.PUT_LINE(' Middle Name = '||m);
DBMS_OUTPUT.PUT_LINE(' Last Name = '||l);
END;
/

REGEXP_SUBSTR :-
------------------------------

REGEXP_SUBSTR(string,pattern,[start,occurance])

n := '&name' ;
f := REGEXP_SUBSTR(n,'[A-Z]+',1,1);
m := REGEXP_SUBSTR(n,'[A-Z]+',1,2);
l := REGEXP_SUBSTR(n,'[A-Z]+',1,3);

9-JAN-25

DB programming with PL/SQL :-


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

=> To work with db execute sql commands from pl/sql program and
the following commands can be executed from pl/sql program.

1 DML (insert,update,delete,merge,insert all)


2 DQL (select)
3 TCL (commit,rollback,savepoint)

SELECT stmt syntax :-


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

SELECT columns INTO variables


FROM tabname
WHERE cond ;

Ex :-

=> wap to input empno and print name & salary ?

DECLARE
veno NUMBER(4);
vename VARCHAR2(10);
vsal NUMBER(7,2);
BEGIN
veno := &empno;
SELECT ename,sal INTO vename,vsal
FROM emp
WHERE empno = veno ;
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
END;
/
=> wap to input empno and calculate and print experience ?

DECLARE
veno NUMBER(4);
vhire DATE;
vexpr NUMBER(2);
BEGIN
veno := &empno;
SELECT hiredate INTO vhire
FROM emp
WHERE empno = veno;
vexpr := (SYSDATE-vhire)/365;
DBMS_OUTPUT.PUT_LINE('Experience = '||vexpr||' years');
END;
/

output :-

Experience = ?? years

Conditional statements :-
---------------------------------

1 IF-ELSE
2 MULTI IF
3 NESTED IF

IF-ELSE :-
---------------

IF COND THEN
statements;
ELSE
statements;
END IF;

MULTI IF :-
---------------

IF COND1 THEN
statements;
ELSIF COND2 THEN
statements;
ELSIF COND3 THEN
statements;
ELSE
statements;
END IF;

NESTED IF :-
------------------

IF COND THEN
IF COND THEN
statemens;
ELSE
statements;
END IF;
ELSE
statements;
END IF;

Ex :-

=> wap to input empno and increment sal by specific amount and after increment
if sal exceeds 5000 then cancel that increment ?

DECLARE
veno NUMBER(4);
vamt NUMBER(5);
vsal NUMBER(7,2);
BEGIN
veno := &empno;
vamt := &amount;
UPDATE emp SET sal = sal + vamt WHERE empno = veno ;
SELECT sal INTO vsal FROM emp WHERE empno = veno ;
IF vsal > 5000 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;
/

=> wap to input empno and increment sal as follows ?

if job=CLERK incr sal by 10%


SALESMAN 15%
MANAGER 20%
others 5%

DECLARE
veno NUMBER(4);
vjob VARCHAR2(10);
vpct NUMBER(2);
BEGIN
veno := &empno;
SELECT job INTO vjob FROM emp WHERE empno = veno;
IF vjob='CLERK' THEN
vpct := 10;
ELSIF vjob='SALESMAN' THEN
vpct := 15;
ELSIF vjob='MANAGER' THEN
vpct := 20;
ELSE
vpct := 5;
END IF;
UPDATE emp SET sal = sal + (sal*vpct/100) WHERE empno = veno;
COMMIT;
END;
/

=> wap to input sno and calculate total,avg,result and insert into result table ?

STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT

DECLARE
vsno NUMBER(2);
vs1 NUMBER(3);
vs2 NUMBER(3);
vs3 NUMBER(3);
vtotal NUMBER(3);
vavg NUMBER(5,2);
vres VARCHAR2(4);
BEGIN
vsno := &sno;
SELECT s1,s2,s3 INTO vs1,vs2,vs3 FROM student WHERE sno=vsno;
vtotal := vs1 + vs2 + vs3;
vavg := vtotal/3;
IF vs1>=35 AND vs2>=35 AND vs3>=35 THEN
vres := 'PASS';
ELSE
vres := 'FAIL';
END IF;
INSERT INTO result VALUES(vsno,vtotal,vavg,vres);
COMMIT;
END;
/

Reference Types :-
-------------------------

1 %TYPE
2 %ROWTYPE

%TYPE :-
-------------

=> used to refer column datatype & size


=> used to match variable type with column type

vename emp.ename%type ;

=> whatever datatype & size declared for ename column , the same type
and size assigned to variable vename.
=> Adv of %type is even if column type or size changes pl/sql is program is
not affected.

%ROWTYPE :-
--------------------

=> used to refer row type or record type

ex :- r emp%rowtype;

=> a row from emp table can be assigned to variable "r"

SELECT * INTO r
FROM emp
WHERE empno = 7844;

r
empno ename job mgr hiredate sal comm deptno
7844 turner salesman 1500 0 30\

=> from the rowtype variable individual field values are accessed by using
rowtypevar.fieldname

r.sal => 1500


r.ename => turner

=> rowtype reduces no of variables required in the program and reduces


complexity.

Ex :-

STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50

RESULT
SNO TOTAL AVG RESULT

=> wap to input sno and calcualte total,avg,result and insert into result table ?

DECLARE
vsno student.sno%TYPE;
vstd student%ROWTYPE;
vres result%ROWTYPE;
BEGIN
vsno := &sno;
SELECT * INTO vstd FROM student WHERE sno = vsno ;
vres.total := vstd.s1 + vstd.s2 + vstd.s3 ;
vres.avg := vres.total/3;
IF vstd.s1 >= 35 AND vstd.s2>=35 AND vstd.s3>=35 THEN
vres.result := 'PASS' ;
ELSE
vres.result := 'FAIL';
END IF;
INSERT INTO result VALUES(vsno,vres.total,vres.avg,vres.result);
COMMIT;
END;
/

vstd
SNO SNAME S1 S2 S3
1 A 80 90 70

vres
SNO TOTAL AVG RESULT
240 80 PASS

=> wap to process bank transaction (W/D) ?

ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO

CREATE SEQUENCE S10


START WITH 1
INCREMENT BY 1
MAXVALUE 99999 ;

DECLARE
vacno accounts.accno%TYPE;
vtype CHAR(1);
vamt transactions.tamt%TYPE;
vbal accounts.bal%TYPE;
BEGIN
vacno := &acno ;
vtype := '&type' ;
vamt := &amount;
IF vtype='W' THEN
SELECT bal INTO vbal FROM accounts WHERE accno = vacno ;
IF vamt > vbal THEN
DBMS_OUTPUT.PUT_LINE('insufficient balance');
ELSE
UPDATE accounts SET bal = bal - vamt WHERE accno = vacno;
INSERT INTO transactions VALUES(S10.nextval,'w',sysdate,vamt,vacno);
COMMIT;
END IF;
ELSIF vtype='D' THEN
UPDATE accounts SET bal = bal + vamt WHERE accno = vacno;
INSERT INTO transactions VALUES(S10.nextval,'d',sysdate,vamt,vacno);
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('invalid transaction type');
END IF;
END;
/

=> wap for money transfer ?

DECLARE
vsacno accounts.accno%TYPE;
vtacno accounts.accno%TYPE;
vamt transactions.tamt%TYPE;
vbal accounts.bal%TYPE;
BEGIN
vsacno := &sacno;
vtacno := &tacno;
vamt := &amount;
SELECT bal INTO vbal FROM accounts WHERE accno = vsacno;
IF vamt > vbal THEN
DBMS_OUTPUT.PUT_LINE('insufficient balance');
ELSE
UPDATE accounts SET bal = bal - vamt WHERE accno = vsacno ;
UPDATE accounts SET bal = bal + vamt WHERE accno = vtacno ;
INSERT INTO transactions VALUES(S10.NEXTVAL,'W',sysdate,vamt,vsacno);
INSERT INTO transactions VALUES(S10.NEXTVAL,'D',sysdate,vamt,vtacno);
COMMIT;
END IF;
END;
/

20-jan-25

LOOPS :-
------------

1 simple loop
2 while loop
3 for loop

simple loop :-
------------------

LOOP LOOP
statements; statements;
exit when cond; if cond then
END LOOP; exit;
end if;
END LOOP;

if cond = false loop continues


if cond = true loop terminates

while loop :-
-----------------

while(cond)
LOOP
statements;
END LOOP;

if cond = true loop continues


if cond = false loop terminates

for loop :-
--------------

FOR <var> IN <low>..<upp>


LOOP
statements;
END LOOP;

FOR i IN 1..10
LOOP
statements;
END LOOP;

=> loop variable "i" declared implicitly as number type


=> by default "i" value incremented by 1
=> "i" is read only variable
=> scope of "i" is upto the for loop

Ex :-

=> wap to print numbers from 1 to 20 ?

using simple loop :-


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

DECLARE
x NUMBER(2) := 1 ;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(x);
x := x+1;
EXIT WHEN x>20;
END LOOP;
END;
/

using while loop :-


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

DECLARE
x NUMBER(2) := 1;
BEGIN
WHILE(x<=20)
LOOP
DBMS_OUTPUT.PUT_LINE(x);
x := x+1;
END LOOP;
END;
/

using for loop :-


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

BEGIN
FOR x IN 1..20
LOOP
DBMS_OUTPUT.PUT_LINE(x);
END LOOP;
END;
/

BEGIN
FOR x IN REVERSE 1..20
LOOP
DBMS_OUTPUT.PUT_LINE(x);
END LOOP;
END;
/

=> wap to print 2025 calendar ?

01-JAN-25 ?
02-JAN-25 ?

31-DEC-25 ?

DECLARE
d1 DATE;
d2 DATE;
BEGIN
d1 := '01-JAN-2025' ;
d2 := '31-DEC-2025' ;
WHILE(d1<=d2)
LOOP
DBMS_OUTPUT.PUT_LINE(d1||' '||TO_CHAR(d1,'day'));
d1 := d1 + 1;
END LOOP;
END;
/
=> wap to print sundays between two given dates ?

DECLARE
d1 DATE;
d2 DATE;
BEGIN
d1 := '01-JAN-2025' ;
d2 := '31-DEC-2025' ;
WHILE(d1<=d2)
LOOP
IF TO_CHAR(d1,'dy') = 'sun' THEN
DBMS_OUTPUT.PUT_LINE(d1||' '||TO_CHAR(d1,'day'));
END IF;
d1 := d1 + 1;
END LOOP;
END;
/

DECLARE
d1 DATE;
d2 DATE;
BEGIN
d1 := '01-JAN-2025' ;
d2 := '31-DEC-2025' ;
d1 := NEXT_DAY(d1,'sunday');
WHILE(d1<=d2)
LOOP
DBMS_OUTPUT.PUT_LINE(d1||' '||TO_CHAR(d1,'day'));
d1 := d1 + 7;
END LOOP;
END;
/

=> wap to print emi dates ?

DECLARE
d1 DATE;
x NUMBER(2) := 1;
BEGIN
d1 := '05-FEB-2025' ;
WHILE(x <= 60)
LOOP
DBMS_OUTPUT.PUT_LINE(d1) ;
d1 := add_months(d1,1);
x := x+1;
END LOOP;
END;
/

=> wap to input string and print the following pattern ? SUBSTR(string,start,len)

input :- NARESH

output :-

N
A
R
E
S
H

DECLARE
s VARCHAR2(20);
b NUMBER(2) := 1;
BEGIN
s := '&string' ;
FOR x IN 1..LENGTH(s)
LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(s,b,1));
b := b+1;
END LOOP;
END;
/

=> wap to input string and print the following pattern ?

input :- NARESH

output :-

N
NA
NAR
NARE
NARES
NARESH

DECLARE
s VARCHAR2(20);
b NUMBER(2) := 1;
BEGIN
s := '&string' ;
FOR x IN 1..LENGTH(s)
LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(s,1,b));
b := b+1;
END LOOP;
END;
/

=> wap to input string and print reverse of that string ?

input :- NARESH
output :- HSERAN

DECLARE
s1 VARCHAR2(20);
s2 VARCHAR2(20);
BEGIN
s1 := '&string';
FOR x IN REVERSE 1..LENGTH(s1)
LOOP
s2 := s2||SUBSTR(s1,x,1);
END LOOP;
DBMS_OUTPUT.PUT_LINE(s2);
IF s1 = s2 THEN
DBMS_OUTPUT.PUT_LINE('palindrome');
ELSE
DBMS_OUTPUT.PUT_LINE('not a palindrome');
END IF;
END;
/

=> wap to input number and check whether it is prime or not ?


=> wap to print prime numbers from 1 to 100 ?
=> wap to input number and print sum of individual digits ?
=> wap to print following pattern ?
*
**
***
****
*****

21-jan-25

CURSORS :-
------------------

=> cursors are used to process multiple rows in PL/SQL program.

=> using cursors we can access row-by-row in pl/sql program.

=> from pl/sql prog if we submit a query to oracle , it goes to db and gets the data
and copies that data into temporary memory (instance) called cursor and
in prog we can give name to cursor and access row-by-row from cursor and
process the row.

=> follow below steps to use cursor

1 DECLARE CURSOR
2 OPEN CURSOR
3 FETCH RECORDS FROM CURSOR
4 CLOSE CURSOR

Declaring cursor :-
-------------------------

CURSOR <name> IS SELECT statement ;

Ex :-

CURSOR C1 IS SELECT ename,sal FROM emp ;

Opening cursor :-
------------------------

OPEN <cursor-name> ;

Ex :-
OPEN C1 ;

1 select stmt submitted to oracle


2 oracle executes the query
3 data returned by query is copied to cursor
4 c1 points to cursor

Fetching records from cursor :-


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

=> "FETCH" stmt is used to fetch record from cursor

FETCH <cursor-name> INTO <variables>;

Ex :-

FETCH C1 INTO vename,vsal;

=> a fetch stmt fetches one row at a time , but to process multiple rows fetch stmt should be
executed multiple times , so fetch stmt should be in a loop.

Closing cursor :-
-------------------------

CLOSE <cursor-name>;

CLOSE C1 ;

cursor attributes :-
-------------------------

%FOUND :-
-----------------

TRUE => if fetch is successful


FALSE => if fetch is unsuccessful

%NOTFOUND :-
----------------------

TRUE => if fetch is unsuccessful


FALSE => if fetch is successful
%ROWCOUNT :-
-----------------------

=> returns no of rows fetched successfully.

C1%FOUND
C1%NOTFOUND
C1%ROWCOUNT

Ex :-

=> wap to print all employee names and salaries ?

DECLARE
CURSOR C1 IS SELECT ename,sal FROM emp ;
vename emp.ename%TYPE;
vsal emp.sal%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vename,vsal;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
END LOOP;
CLOSE C1;
END;
/

using while loop :-


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

DECLARE
CURSOR C1 IS SELECT ename,sal FROM emp ;
vename emp.ename%TYPE;
vsal emp.sal%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO vename,vsal;
WHILE(C1%FOUND)
LOOP
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
FETCH C1 INTO vename,vsal;
END LOOP;
CLOSE C1;
END;
/

FOR LOOP CURSOR :-


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

FOR <var> IN <cursor-name>


LOOP
statements ;
END LOOP;

FOR r IN C1
LOOP
statements ;
END LOOP;

=> loop is executed no of times depends on no of rows in cursor


=> adv of for loop cursor is opening cursor,fetching records and closing cursor is not requied
=> evertime for loop is executed a record is fetched from cursor and assigned to variable "r".
=> loop variable "r" is also declared implicitly as rowtype.

DECLARE
CURSOR C1 IS SELECT ename,sal FROM emp;
BEGIN
FOR r IN C1
LOOP
DBMS_OUTPUT.PUT_LINE(r.ename||' '||r.sal);
END LOOP;
END;
/

=> wap to calculate total sal without using sum function ?

DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
t NUMBER := 0;
BEGIN
FOR r IN C1
LOOP
t := t + r.sal ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(t);
END;
/

=> wap to print max sal without using max function ?

DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
m NUMBER ;
vsal emp.sal%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO m;
WHILE(C1%FOUND)
LOOP
FETCH C1 INTO vsal;
IF vsal > m THEN
m := vsal;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(m);
END;
/

DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal DESC ;
m NUMBER ;
BEGIN
OPEN C1;
FETCH C1 INTO m;
DBMS_OUTPUT.PUT_LINE(m);
CLOSE C1;
END;
/

=> wap to print min sal ?

DECLARE
CURSOR C1 IS SELECT sal FROM emp ;
m NUMBER ;
vsal emp.sal%TYPE;
BEGIN
OPEN C1;
FETCH C1 INTO m;
WHILE(C1%FOUND)
LOOP
FETCH C1 INTO vsal;
IF vsal < m THEN
m := vsal;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(m);
END;
/

DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal ASC ;
m NUMBER ;
BEGIN
OPEN C1;
FETCH C1 INTO m;
DBMS_OUTPUT.PUT_LINE(m);
CLOSE C1;
END;
/

=> wap to print top 5 max salaries ?

DECLARE
CURSOR C1 IS SELECT sal FROM emp ORDER BY sal DESC;
vsal emp.sal%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO vsal;
EXIT WHEN C1%ROWCOUNT>5 OR C1%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE(vsal);
END LOOP;
CLOSE C1;
END;
/

=> wap to print employee names as follows ?

smith,allen,ward,jones,-------------------

DECLARE
CURSOR C1 IS SELECT ename FROM emp ;
s VARCHAR2(1000);
BEGIN
FOR r IN C1
LOOP
s := s||r.ename||',' ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(RTRIM(s,','));
END;
/

LISTAGG() :-
--------------------

=> function used to concatenate column values

LISTAGG(colname,seperator) WITHIN GROUP (ORDER BY colname ASC/DESC)

Ex :-

SELECT LISTAGG(ename,',') WITHIN GROUP (ORDER BY hiredate DESC)


FROM emp ;

o/ p:- SMITH,ALLEN,WARD,-----

=> display dept wise employee names ?

SELECT deptno,LISTAGG(ename,',') WITHIN GROUP (ORDER BY sal DESC) as names


FROM emp
GROUP BY deptno ;

DEPTNO NAMES
---------- --------------------------------------------------
10 KING,CLARK,MILLER
20 SCOTT,FORD,JONES,ADAMS,SMITH
30 BLAKE,TURNER,ALLEN,MARTIN,WARD,JAMES

=> wap to calculate all the students total,avg,result and insert into result table ?

STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT

DECLARE
CURSOR C1 IS SELECT sno,s1,s2,s3 FROM student ;
r RESULT%ROWTYPE;
BEGIN
FOR s IN C1
LOOP
r.total := s.s1 + s.s2 + s.s3 ;
r.avg := r.total / 3 ;
IF s.s1>=35 AND s.s2>=35 AND s.s3>=35 THEN
r.result := 'PASS';
ELSE
r.result := 'FAIL';
END IF;
INSERT INTO result VALUES(s.sno,r.total,r.avg,r.result);
END LOOP;
COMMIT;
END;
/

C1
1 80 90 70 => s
2 30 60 50

r
SNO TOTAL AVG RESULT
240 80 pass

=======================================================================

ERROR HANDLING / EXCEPTION HANDLING :-


====================================

1 syntax errors
2 logical errors
3 runtime errors (exceptions)

=> errors that are raised during program execution are called runtime errors

ex :-
DECLARE
X NUMBER(3);
BEGIN
X := &X; => 1000 => RUNTIME error
DBMS_OUTPUT.PUT_LINE(X);
END;
/

=> if any statement causes runtime error then program execution is terminated and
oracle displays error message

=> to continue program execution and to replace system generated message with
our own simple and user friendly message then we need to handle that runtime error.

=> to handle runtime error include a block called EXCEPTION block.

DECLARE
variables;
BEGIN
statements; => causes exception
EXCEPTION
statements; => handles exception
END;
/

=> exceptions are 2 types

1 system defined
2 user defined

system defined :-
------------------------

1 ZERO_DIVIDE => raised when we try to divide a number with 0


2 VALUE_ERROR => raised when variable size or type mismatched
3 INVALID_NUMBER => raised when invalid arithmetic calculation performed
4 NO_DATA_FOUND => raised when data not found in the table
5 TOO_MANY_ROWS => raised when select stmt fetches more than one row
6 DUP_VAL_ON_INDEX => raised when we try to insert duplicate value into pk column

23-jan-25
Ex 1 :-

DECLARE
a NUMBER(3);
b NUMBER(3);
c NUMBER(3);
BEGIN
a := &a;
b := &b;
c := a/b;
DBMS_OUTPUT.PUT_LINE(c);
EXCEPTION
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('value exceeding size');
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('divisor cannot be zero');
END;
/

Ex 2 :-

=> wap to input empno and print name & salary ?

DECLARE
veno emp.empno%TYPE;
vename emp.ename%TYPE;
vsal emp.sal%TYPE;
BEGIN
veno := &empno ;
SELECT ename,sal INTO vename,vsal FROM emp WHERE empno = veno;
DBMS_OUTPUT.PUT_LINE(vename||' '||vsal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('invalid empno');
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('value exceeding size');
END;
/

SQLCODE & SQLERRM :-


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

SQLCODE => returns error code


SQLERRM => returns error message

Ex :-

CREATE TABLE emp44


(
empno NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL,
sal NUMBER(7) CHECK(sal>=3000)
);

=> WAP to insert data into emp44 table ?

DECLARE
veno emp44.empno%TYPE;
vename emp44.ename%TYPE;
vsal emp44.sal%TYPE;
BEGIN
veno := &empno;
vename := '&ename';
vsal := &sal;
INSERT INTO emp44 VALUES(veno,vename,vsal);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('empno should not be duplicate');
WHEN OTHERS THEN
IF SQLCODE = -02290 THEN
DBMS_OUTPUT.PUT_LINE('sal >= 3000');
END IF;
END;
/

USER DEFINED EXCEPTIONS :-


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

=> errors raised by user are called user defined errors.


=> user must raise error to stop program execution based on some condition.
=> the following built-in procedure is used to raise our own errors

RAISE_APPLICATION_ERROR(error code , error msg);

error code => -20001 to -20999


Ex :-

=> wap to increment employee sal by specific amount but sunday updates are not allowed ?

DECLARE
veno emp.empno%TYPE;
vamt NUMBER(5);
BEGIN
veno := &empno;
vamt := &amount;
IF TO_CHAR(sysdate,'dy')='sun' THEN
RAISE_APPLICATION_ERROR(-20001,'sunday not allowed');
END IF;
UPDATE emp SET sal = sal + vamt WHERE empno=veno;
COMMIT;
END;
/

=> wap for money transfer ?

ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO

CREATE SEQUENCE S10


START WITH 1
INCREMENT BY 1
MAXVALUE 99999 ;

DECLARE
vsacno accounts.accno%TYPE;
vtacno accounts.accno%TYPE;
vamt NUMBER(10);
vbal accounts.bal%TYPE;
cnt1 NUMBER(2);
cnt2 NUMBER(2);
BEGIN
vsacno := &sacno;
vtacno := &tacno;
vamt := &amount;
SELECT COUNT(*) INTO cnt1 FROM accounts WHERE accno = vsacno;
IF cnt1=0 THEN
RAISE_APPLICATION_ERROR(-20001,'source account does not exists');
END IF;
SELECT COUNT(*) INTO cnt2 FROM accounts WHERE accno = vtacno;
IF cnt2=0 THEN
RAISE_APPLICATION_ERROR(-20001,'target account does not exists');
END IF;
SELECT bal INTO vbal FROM accounts WHERE accno = vsacno;
IF vamt > vbal THEN
RAISE_APPLICATION_ERROR(-20002,'insufficient balance');
END IF;
UPDATE accounts SET bal = bal - vamt WHERE accno = vsacno;
UPDATE accounts SET bal = bal + vamt WHERE accno = vtacno;
INSERT INTO transactions VALUES(S10.NEXTVAL,'W',SYSDATE,vamt,vsacno);
INSERT INTO transactions VALUES(S10.NEXTVAL,'D',SYSDATE,vamt,vtacno);
COMMIT;
END;
/

========================================================================
=

24-jan-25

Named PL/SQL Blocks :-


===================

1 PROCEDURES
2 FUNCTIONS
3 PACKAGES
4 TRIGGERS

SUB-PROGRAMS :-
-----------------------------

1 PROCEDURES
2 FUNCTIONS

Advantages :-
==========

1 modular programming :-
===================

=> with the help of procedures & function a big pl/sql program can be divided into small
modules

2 reusability :-
-----------------

=> procedures & functions are created with name , so they can be called another program

3 invoked from front-end applications :-


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

=> procedures & funcations are stored in db , so applications which are connect db
can call procedures & functions.

4 improves performance :-
-------------------------------

=> procedures improves performance because of one time compilation i.e. if we


create a procedure program is compiled and stored in db and whenever
we call procedure only execution is repeated but not compilation , so this improves
performance.

PROCEDURES :-
-----------------------

=> a procedure is a named PL/SQL block that accepts some input performs some action
on db and may or may not returns a value.

=> procedures are created to perform one or more dmls on tables

CREATE OR REPLACE PROCEDURE <name>


(
parameters if any
)
IS
<declaration-part>;
BEGIN
statements;
END;
/

parameters :-
-----------------

=> we can declare parameters and we can pass values to parameters


=> parameters are 3 types

1 IN
2 OUT
3 IN OUT

=> "IN" parameter always receives value


=> "OUT" parameter always sends value
=> "IN OUT" receives and sends

JAVA PROCEDURE

X ---------------------------------------------> A (IN )

Y <--------------------------------------------- B (OUT)

Z ----------------------------------------------> C (IN OUT)


<-----------------------------------------------

Ex 1 :- procedure without parameters

=> create a proedure to increment all the employee salaries by 1000 ?

CREATE OR REPLACE PROCEDURE raise_salary


IS
BEGIN
UPDATE emp SET sal = sal + 1000 ;
COMMIT;
END;
/

procedure created ( compiled + stored in db)

Execution :-
-------------------
1 sql prompt
2 another pl/sql prog
3 front-end applications

executing from sql prompt :-


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

SQL> EXECUTE raise_salary ;

Ex 2 :- procedure with IN parameters

=> create a procedure to increment specific employee sal by specific amount ?

CREATE OR REPLACE PROCEDURE raise_salary


(
peno IN emp.empno%TYPE ,
pamt IN NUMBER
)
IS
BEGIN
UPDATE emp SET sal = sal + pamt WHERE empno = peno ;
COMMIT;
END;
/

Execution :-
----------------

SQL>EXECUTE raise_salary(7369,1000); positional association


SQL>EXECUTE raise_salary(peno=>7369,pamt=>1000); named association
SQL>EXECUTE raise_salary(pamt=>1000,peno=>7369) ;

Ex 3 :- procedure with OUT parameter

=> create a procedure to increment specific employee sal by specific amount


and after increment send the updated sal to calling program ?

CREATE OR REPLACE PROCEDURE raise_salary


(
peno IN emp.empno%TYPE ,
pamt IN NUMBER,
pnewsal OUT emp.sal%TYPE
)
IS
BEGIN
UPDATE emp SET sal = sal + pamt WHERE empno = peno ;
COMMIT;
SELECT sal INTO pnewsal FROM emp WHERE empno = peno;
END;
/

Execution :-
-----------------

SQL>VARIABLE X NUMBER

SQL>EXECUTE raise_salary(7369,1000,:X);

SQL>PRINT :X

SQL> EXECUTE raise_salary(peno=>7369,pamt=>1000,pnewsal=>:X);

25-jan-25

Ex 5 :- declaring parameters with default value

CREATE OR REPLACE PROCEDURE raise_salary


(
peno IN emp.empno%TYPE ,
pamt IN NUMBER DEFAULT 500,
pnewsal OUT emp.sal%TYPE
)
IS
BEGIN
UPDATE emp SET sal = sal + pamt WHERE empno = peno ;
COMMIT;
SELECT sal INTO pnewsal FROM emp WHERE empno = peno;
END;
/

Execution :-

SQL>VARIABLE K NUMBER

SQL>EXECUTE raise_salary(peno=>7369,pnewsal=>:K);
SQL>PRINT :K

USER DEFINE FUNCTIONS :-


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

=> functions created by user are called user defined functions.

=> when predefine functions not meeting our requirements then we create our own
functions called user defined functions.

=> a function accepts some input performs some calculation and must return a value.

=> functions are created

1 for calculations
2 to fetch data from tables

CREATE OR REPLACE FUNCTION <name>


(
parameters
) RETURN <type>
IS
declaration;
BEGIN
statements;
RETURN <expr>;
END;
/

Ex 1 :-

CREATE OR REPLACE FUNCTION CALC


(
a NUMBER,b NUMBER,op CHAR
) RETURN NUMBER
IS
BEGIN
IF op = '+' THEN
RETURN (a+b);
ELSIF op = '-' THEN
RETURN(a-b);
ELSIF op = '*' THEN
RETURN(a*b);
ELSE
RETURN (a/b);
END IF;
END;
/

function created ( compiled + stored in db)

Execution :-

1 sql commands
2 another pl/sql prog
3 front-end applications

executing from select command :-


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

SQL>SELECT CALC(10,20,'*') FROM DUAL ; => 200

Ex 2 :- create a function to check whether given year is leap year or not ?

CREATE OR REPLACE
FUNCTION IS_LEAP(y NUMBER) RETURN VARCHAR2
IS
d DATE;
BEGIN
d := '29-FEB-'||y ;
RETURN 'leap year' ;
EXCEPTION
WHEN OTHERS THEN
RETURN 'not a leap year';
END;
/

Execution :-

SQL>SELECT IS_LEAP(2024) FROM DUAL ;

Ex 3 :- create a function that accepts ordid and returns order amount ?

orders products
ordid prodid qty prodid pname price
1000 100 3 100 A 500
1000 101 2 101 B 1000
1000 102 1 102 C 1500
1001 100 2

input ordid = 1000


output amount = 5000

CREATE OR REPLACE
FUNCTION getOrdAmt(pordid NUMBER) RETURN NUMBER
IS
CURSOR C1 IS SELECT o.prodid,o.qty,p.price
FROM orders o INNER JOIN products p
ON o.prodid = p.prodid
WHERE o.ordid = pordid ;
vamt NUMBER := 0;
BEGIN
FOR r IN C1
LOOP
vamt := vamt + (r.qty * r.price) ;
END LOOP;
RETURN vamt;
END;
/

C1
100 3 500
101 2 1000
102 1 1500

=> difference between procedures & functions ?

PROCEDURES FUNCTIONS

1 may or may not returns a value must return a value

2 can return multiple values always returns one value

3 returns values using OUT parameter returns value using return stmt

4 cannot be called from sql commands can be called from sql commands
5 created to perform actions like I/U/D created to perform calculations

6 create procedure to update balance create function to get balance

USER_SOURCE :-
------------------------

=> It is a system table that stores procedures & functions created by user

NAME TYPE LINE TEXT


IS_LEAP FUNCTION 1 FUNCTION IS_LEAP(y NUMBER) RETURN
VARCHAR2
2 IS
3 d DATE;
4 BEGIN

=> list of procedure & functions ?

SELECT DISTINCT NAME,TYPE FROM USER_SOURCE ;

=> display is_leap function code ?

SELECT TEXT FROM USER_SOURCE WHERE NAME='IS_LEAP' ;

Droping :-
-------------

SQL>DROP PROCEDURE RAISE_SALARY ;

SQL>DROP FUNCTION CALC ;

27-JAN-25

packages :-
---------------

=> a package is a collection of procedures & functions.


=> related procedures & functions can be grouped into one program called package.

Advantages :-
-----------------
1 supports overloading :-
--------------------------------

=> standalone proc & func cannot be overloaded but in package we can define two or more
proc or func with same and with different parameters.

2 supports hiding :-
-----------------------

=> In package we can define members as public and private , public members can be
called from any where but private members can be called with in package.

=> package contains 2 parts

1 package specification
2 package body

package specification :-
-----------------------------

=> specification contains declarations of procedures & functions.

CREATE OR REPLACE PACKAGE <name>


AS
PROCEDURE <name>(parameters if any) ;
FUNCTION <name>(parameters) RETURN <type>;
-----------------------------
END;
/

package body :-
--------------------

=> package body contains defintions of procedures & functions .

CREATE OR REPLACE PACKAGE BODY <name>


AS
PROCEDURE <name>(parameters)
IS
declare ;
BEGIN
statements;
END procname;
FUNCTION <name>(parameters) RETURN <type>
IS
declare ;
BEGIN
statements;
RETURN <expr>;
END funname;
END;
/

Ex :-

=> create package to implement following operations ?

1 hire employee (proc)


2 fire employee (proc)
3 update salary (proc)
4 calculate experience (func)
5 top n employee list based on sal (func)

package specification :-
-------------------------------

CREATE OR REPLACE PACKAGE hr


AS
PROCEDURE hire(e NUMBER,n VARCHAR2,j VARCHAR2,s NUMBER,d NUMBER) ;
PROCEDURE fire(e NUMBER);
PROCEDURE update_sal(e NUMBER,pct NUMBER);
FUNCTION expr(e NUMBER) RETURN NUMBER;
FUNCTION getTopN(n NUMBER) RETURN SYS_REFCURSOR;
END;
/

package body :-
---------------------

CREATE OR REPLACE PACKAGE BODY hr


AS
PROCEDURE hire(e NUMBER,n VARCHAR2,j VARCHAR2,s NUMBER,d NUMBER)
IS
BEGIN
INSERT INTO emp(empno,ename,job,sal,deptno,hiredate)
VALUES(e,n,j,s,d,sysdate);
COMMIT;
END hire ;
PROCEDURE fire(e NUMBER)
IS
BEGIN
DELETE FROM emp WHERE empno = e ;
COMMIT;
END fire;
PROCEDURE update_sal(e NUMBER,pct NUMBER)
IS
BEGIN
UPDATE emp SET sal = sal + (sal*pct/100) WHERE empno = e ;
COMMIT;
END update_sal ;
FUNCTION expr(e NUMBER) RETURN NUMBER
IS
vhire DATE ;
vexpr NUMBER(2);
BEGIN
SELECT hiredate INTO vhire FROM emp WHERE empno = e;
vexpr := (SYSDATE - vhire) / 365 ;
RETURN vexpr;
END expr;
FUNCTION getTopN(n NUMBER) RETURN SYS_REFCURSOR
IS
C1 SYS_REFCURSOR;
BEGIN
OPEN C1 FOR SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
FETCH FIRST n ROWS ONLY ;
RETURN C1;
END getTopN ;
END;
/

Execution :-
-------------

SQL>EXECUTE hr.hire(888,'A','CLERK',4000,20);

SQL>EXECUTE hr.update_sal(7369,10);
SQL>SELECT HR.EXPR(7369) FROM DUAL ; => 44

SQL>SELECT hr.getTopN(3) FROM DUAL ;

=> create a package to implement various bank transactions ?

1 account opening (proc)


2 account closing (proc)
3 balance enquiry (func)
4 money deposit (proc)
5 money withdrawl (proc)
6 money transfer (proc)
7 statement between two given dates (func)
8 lastest N transaction (func)

ACCOUNTS
ACCNO ACTYPE BALa

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO

CREATE SEQUENCE S10


START WITH 1
INCREMENT BY 1
MAXVALUE 99999 ;

specification :-
--------------------

CREATE OR REPLACE PACKAGE bank


AS
PROCEDURE new_acct(a NUMBER,t CHAR,b NUMBER);
PROCEDURE close_acct(a NUMBER);
FUNCTION getBal(a NUMBER) RETURN NUMBER;
PROCEDURE credit(a NUMBER,amt NUMBER);
PROCEDURE debit(a NUMBER,amt NUMBER);
PROCEDURE transfer(s NUMBER,t NUMBER,amt NUMBER);
FUNCTION stmt(a NUMBER,s DATE,e DATE) RETURN SYS_REFCURSOR;
FUNCTION stmt(a NUMBER,n NUMBER) RETURN SYS_REFCURSOR;
END;
/
========================================================================
=====

28-JAN-29

TRIGGERS :-
==========

=> a trigger is also a named PL/SQL block like procedure but executed implicitly by oracle
whenever user submits DML commands to oracle.

=> triggers are created

1 to control dmls
2 to enforce complex rules and validations
3 to audit day-to-day operations on tables

CREATE OR REPLACE TRIGGER <NAME>


BEFORE / AFTER INSERT OR UPDATE OR DELETE
ON <TABNAME>
[FOR EACH ROW]
[
DECLARE
variables;
]
BEGIN
statements;
END;
/

BEFORE triggers :-
--------------------------

=> if trigger is before then oracle executes the trigger before executing dml

AFTER triggers :-
------------------------

=> if trigger is after then oracle executes the trigger after executing dml

Trigger levels :-
------------------------
1 statement level (default)
2 row level

=> statement level triggers are executed once per the statement (dml).
=> row level triggers are executed once per the row affected by dml.
=> if trigger is created with FOR EACH ROW then it is row level otherwise stmt level.

ex :-

=> create trigger to not to allow dmls on emp table on sunday ?

CREATE OR REPLACE TRIGGER T1


BEFORE INSERT OR UPDATE OR DELETE
ON EMP
BEGIN
IF TO_CHAR(SYSDATE,'dy') = 'sun' THEN
RAISE_APPLICATION_ERROR(-20001,'sunday not allowed');
END IF;
END;
/

Testing :-

SQL>UPDATE EMP SET COMM = 800 WHERE EMPNO = 7844 ; => ERROR

=> create trigger not to allow dmls on emp table as follows ?

MON - FRI <10am and >4pm

SAT 2nd & 4th not allowed

1st & 3rd allowed between 10AM - 2PM

SUN --------------------------------

CREATE OR REPLACE TRIGGER T2


BEFORE INSERT OR UPDATE OR DELETE
ON EMP
BEGIN
IF TO_CHAR(SYSDATE,'d') BETWEEN 2 AND 6 THEN
IF TO_CHAR(SYSDATE,'hh24') < 10 OR TO_CHAR(SYSDATE,'hh24') >= 16 THEN
RAISE_APPLICATION_ERROR(-20001,'only between 10am and 4pm');
END IF;
ELSIF TO_CHAR(SYSDATE,'dy')='sat' AND TO_CHAR(SYSDATE,'W') IN (2,4) THEN
RAISE_APPLICATION_ERROR(-20001,'2nd and 4th saturdays not allowed');
ELSIF TO_CHAR(SYSDATE,'dy')='sat' AND TO_CHAR(SYSDATE,'W') IN (1,3) THEN
IF TO_CHAR(SYSDATE,'hh24') < 10 OR TO_CHAR(SYSDATE,'hh24') >= 14
THEN
RAISE_APPLICATION_ERROR(-20001,'only between 10am and 2pm');
END IF;
ELSE
RAISE_APPLICATION_ERROR(-20001,'sunday not allowed');
END IF;
END;
/

Testing :-
----------

SQL>UPDATE EMP SET COMM = 800 WHERE EMPNO = 7844; => ERROR

=> create a trigger to not to update empno ?

CREATE OR REPLACE TRIGGER T3


BEFORE UPDATE OF EMPNO,HIREDATE
ON EMP
BEGIN
RAISE_APPLICATION_ERROR(-20005,'empno and hiredate cannot be updated');
END;
/

Testing :-

SQL>UPDATE EMP SET EMPNO = 9999 WHERE EMPNO = 7844 ; => ERROR

:NEW , :OLD variables :-


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

=> these two variables are bind variable and rowtype variables
=> record user is trying to insert is copied to :NEW variable.
=> record user is trying to delete is copied to :OLD variable.
=> record user is trying to update is copied to both :OLD & :NEW variables.

INSERT INTO EMP VALUES(100,'A','CLERK',4000,---,20) => :NEW


DELETE FROM EMP WHERE EMPNO = 7844 ; => :OLD

UPDATE EMP SET SAL = 8000 WHERE EMPNO = 7839 ; => :OLD
EMPNO SAL
7839 7000

:NEW
EMPNO SAL
7839 8000

=> these two variables are allowed only in row level triggers but not allowed in stmt level
triggers.

create trigger to not to allow to decrement salary ?

CREATE OR REPLACE TRIGGER T4


BEFORE UPDATE
ON EMP
FOR EACH ROW
BEGIN
IF :NEW.SAL < :OLD.SAL THEN
RAISE_APPLICATION_ERROR(-20005,'sal cannot be decremented');
END IF;
END;
/

Testing :-

SQL>UPDATE EMP SET SAL = 5000 WHERE EMPNO = 7839 ; => ERROR

=> create trigger to insert details into emp_resign whenever employee resigns ?

EMP_RESIGN
EMPNO ENAME JOB SAL HIREDATE DOR

CREATE TABLE EMP_RESIGN


(
empno NUMBER(4),
ename VARCHAR2(10),
job VARCHAR2(10),
sal NUMBER(7),
hiredate DATE,
dor DATE
);

CREATE OR REPLACE TRIGGER T5


AFTER DELETE
ON EMP
FOR EACH ROW
BEGIN
INSERT INTO EMP_RESIGN

VALUES(:OLD.EMPNO,:OLD.ENAME,:OLD.JOB,:OLD.SAL,:OLD.HIREDATE,SYSDATE);
END;
/

Testing :-
------------

SQL>DELETE FROM EMP WHERE EMPNO = 7844 ;

/* row is copied to :old


delete command is executed
trigger is executed
*/

USER_TRIGGERS :-
---------------------------

=> stores triggers created by user

=> list of triggers created on emp table ?

SELECT TRIGGER_NAME,
TRIGGER_TYPE,
TRIGGERING_EVENT
FROM USER_TRIGGERS
WHERE TABLE_NAME = 'EMP' ;

Droping :-
---------------

DROP TRIGGER T1 ;
DATABASE
USER
TABLE
ROWS & COLS
CONSTRAINTS
INDEXES
TRIGGER
VIEW
SYNONYM
SEQUENCE
PROCEDURE
FUNCTION
PACKAGE

========================================================================
=====

Dynamic SQL :-
===========

=> SQL commands generated runtime are called dynamic sql commands

DROP TABLE emp ; (static sql)

tname varchar2(20);
tname := '&tabname' ;
DROP TABLE tname ; (dynamic sql)

=> Dynamic sql is useful when we don't know table names and column names until runtime.

=> Dynamic SQL and DDL commands are executed by using EXECUTE IMMEDIATE.

EXECUTE IMMEDIATE ' Dynamic SQL / DDL command '

Ex :-

=> create a procedure to drop table ?

CREATE OR REPLACE PROCEDURE drop_table


(
tname IN VARCHAR2
)
IS
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE '||tname ;
END;
/

SQL>EXECUTE drop_table('EMP_RESIGN') ;

=> create a procedure to drop all tables ?

CREATE OR REPLACE PROCEDURE DROP_ALL_TABLES


IS
CURSOR C1 IS SELECT TABLE_NAME FROM USER_TABLES ;
BEGIN
FOR R IN C1
LOOP
EXECUTE IMMEDIATE 'DROP TABLE '||R.TABLE_NAME|| ' CASCADE
CONSTRAINTS ' ;
END LOOP;
END;
/

=> wap to print no of rows in all tables ?

EMP ?
DEPT ?
CUST ?
STUDENT ?

DECLARE
CURSOR C1 IS SELECT TABLE_NAME FROM USER_TABLES ;
str VARCHAR2(100);
cnt NUMBER(5);
BEGIN
FOR R IN C1
LOOP
str := 'SELECT COUNT(*) FROM '||R.TABLE_NAME ;
EXECUTE IMMEDIATE str INTO cnt ;
DBMS_OUTPUT.PUT_LINE(R.TABLE_NAME||' '||cnt);
END LOOP;
END;
/
procedures
functions
triggers

========================================================================
======

Normalization :-
============

=> Normalization is the process of decomposing tables with redundency into number of well
structured tables.
=> Normalization is set of rules and each rule is called one normal form.
=> There are six normal forms

1NF
2NF
3NF
BCNF (boyce-codd)
4NF
5NF

ex :-

BILL
BILLNO BDATE CCODE CNAME ADDR ICODE NAME RATE QTY VALUE
TBILL
100 29- 10 A HYD 1
2
3

10

1NF :-
---------

=> a table said to be in 1NF if there are no multi valued attributes in it or all the attributes in
table
are atomic (single)

BILL
BILLNO BDATE CCODE CNAME ADDR ICODE NAME RATE QTY VALUE
TBILL
s s s s s m m m m m
s

=> In the above table some fields are multivalued , so the table is not according to 1NF then
decompose the table as follows.

BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
======
100 ?? 10 A HYD
101 11 B HYD

BILL_ITEMS
BILLNO ICODE NAME RATE QTY VALUE
=============
100 1X 100
100 2
100 3
101 1 X 100
101 2

In the above table if icode is repeated then name,rate are also repeated , To reduce this
redundency apply 2NF

2NF :-
=====

=> a table said to be in 2NF

1 if it is in 1NF
2 if there are no partial dependencies in it

Full dependency :-
------------------------

=> In table if non key fields depends on key field then it is called full dependency

ex :-

R(A,B,C,D) A => PRIMARY KEY


A ====> B,C,D

Partial dependency :-
---------------------------

=> In table if non key field depends on part of the key field then it is called partial dependency

ex :-

R(A,B,C,D) A,B => PRIMARY KEY

A,B =======> C (full dependency)

B =======> D (partial dependency)

TABLE 1 :-
---------------

BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
======
100 ?? 10 A HYD
101 11 B HYD

=> above table satisifies 2NF because no partial dependencies exists in the table.

TABLE 2 :-
--------------

BILL_ITEMS
BILLNO ICODE NAME RATE QTY VALUE
=============

BILLNO,ICODE =======> QTY , VALUE (full dependency)


ICODE ========> NAME,RATE (partial dependency)

=> above table contains patial dependency , so the table is not according to 2NF then
decompose the table as follows.

TABLE 2 :-
-------------
ITEMS
ICODE NAME RATE
======

TABLE 3 :-
--------------

BILL_ITEMS
BILLNO ICODE QTY VALUE
=============

3NF :-
----------

=> a table said to be in 3NF

1 if it is in 2NF
2 if there are no transitive dependencies in it

Trasitive dependency :-
----------------------------

=> In table if non key field depends on another non key field then it is called transitive
dependency

R(A,B,C,D) A => PRIMARY KEY

A ====> B,C (full dependency)

C ======> D ( transitive dependency)

TABLE 1 :-
---------------

BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
======

BILLNO ======> BDATE , TBILL (full dependency)

CCODE ======> CNAME,ADDR (transitive dependency)


above table contains transitive dependency , so the table is not according to 3NF then
decompose the table as follows.

CUST
CCODE CNAME ADDR
======

BILL
BILLNO BDATE TBILL CCODE(FK)
=======

TABLE 2 :-
-------------

ITEMS
ICODE NAME RATE (according to 3NF because no transitive dependency)
======

TABLE 3 :-
--------------

BILL_ITEMS
BILLNO ICODE QTY VALUE (according to 3NF because no transitive dependency)
=============

after 3NF :-
----------------

CUST
CCODE CNAME ADDR
======

BILL
BILLNO BDATE TBILL CCODE(FK)
=======

ITEMS
ICODE NAME RATE
======

BILL_ITEMS
BILLNO ICODE QTY VALUE
=============

========================================================================
=====

You might also like