BATCH40
BATCH40
---------
Database :-
--------------
Types of Databases :-
-----------------------------
=> OLTP is for running business and OLAP is for to analyze business
C create
R read
U update
D delete
DBMS :-
-------------
USER----------------DBMS-----------------------DB
Evolution of DBMS :-
-----------------------------
1960 FMS (file mgmt system)
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 :-
-------------------------
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
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 :-
---------------------------
NoSQL Databases :-
------------------------------
mongoDB
cassandra
ORDBMS :-
----------------
=> Object Relational DBMS
=> It is the combination of RDBMS & OOPS
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
1 on premises server
2 on cloud server
=> in " on cloud " db is deployed in the server managed by cloud service provider
like amazon.
20-nov-24
1 server
2 client
server :-
------------
1 DB
2 INSTANCE
CLIENT :-
--------------
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 :-
----------
user------mysqlworkbench------sql------------------mysql----------db
user--------ssms---------------------sql-----------------sql server------db
SQL
schema :-
-------------
server
database
user
table
data
server
orcl
sys / MANAGER (dba)
system / MANAGER (dba)
username :- SYSTEM
password :- MANAGER
OR
21-nov-24
syn :-
--------
Ex :-
changing 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 :-
------------
Datatypes in oracle :-
-----------------------------
DATATYPES
char(size) :-
----------------
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) :-
------------------------
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 unicode chars (65536) that includes all ascii chars and chars
belongs to different languages.
Number(p) :-
-----------------
ex :- empid NUMBER(4)
10
100
1000
10000 => not allowed
aadharno NUMBER(12)
phone NUMBER(10)
accno NUMBER(12)
Number(p,s) :-
--------------------
ex :- SALARY NUMBER(7,2)
5000
5000.55
50000.55
500000.55 => not allowed
SAVG NUMBER(5,2)
DATE :-
-------------
Ex :- DOB DATE
TIMESTAMP :-
---------------------
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
=> 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 :-
--------------------------------------
Rules ;-
----------
123emp invalid
emp 123 invalid
emp*123 invalid
emp_123 valid
Ex :-
=> create table with following structure ?
EMP
EMPID ENAME JOB SAL HIREDATE DNO
=> above command created table structure / definition / metadata that includes
columns,datatype and size.
DESC :- (DESCRIBE)
------------
DESC <tabname>
ex :- SQL>DESC emp
EMPID NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(10)
SAL NUMBER(7,2)
HIREDATE DATE
DNO NUMBER(2)
1 single row
2 multiple rows
single row :-
----------------
ex :-
multiple rows :-
---------------------
=> insert command can be executed multiple times with different values by using
variables prefixed with "&".
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 :-
----------------
method 2 :-
----------------
NOTE :-
=> above insert commands inserted data into instance which is temporary
to save this data execute commit.
SQL>COMMIT;
NOTE :-
Operators in oracle :-
------------------------------
23-nov-24
Displaying Data :-
--------------------------
SELECT columns / *
FROM tabname
[WHERE cond] ;
sql = english
queries = sentences
clauses = words
WHERE clause :-
------------------------
=> where clause is used to get specific row/rows from table
=> OP must be any relational operator like > >= < <= = <>
=> if cond = true row is selected
=> if cond = false row is not selected
Ex ;-
note :-
=> In oracle string comparision is case sensitive i.e. uppercase and lowercase
strings not same.
compound condition :-
------------------------------
Ex :-
SELECT *
FROM emp
WHERE empid = 100 OR empid = 103 OR empid = 105 ;
SELECT *
FROM emp
WHERE job='clerk' OR job='manager' ;
SELECT *
FROM emp
WHERE job='clerk' AND sal > 3000 ;
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' ;
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
SELECT *
FROM student
WHERE s1>=35 AND s2>=35 AND s3>=35 ;
SELECT *
FROM student
WHERE s1<35 OR s2<35 OR s3<35 ;
25-nov-24
IN operator :-
------------------
SELECT *
FROM emp
WHERE empid IN (100,103,105) ;
SELECT *
FROM emp
WHERE job IN ('clerk','manager','analyst') ;
BETWEEN operator :-
------------------------------
SELECT *
FROM emp
WHERE sal BETWEEN 5000 AND 10000 ;
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 10000 AND 5000 ( SAL >= 10000 AND SAL<=5000)
LIKE operator :-
------------------------
ex :-
SELECT *
FROM emp
WHERE ename LIKE 's%' ;
SELECT *
FROM emp
WHERE ename LIKE '%d' ;
SELECT *
FROM emp
WHERE ename LIKE '%a%' ;
SELECT *
FROM emp
WHERE ename LIKE '___a%' ;
SELECT *
FROM emp
WHERE ename LIKE '%a___' ;
SELECT *
FROM emp
WHERE hiredate LIKE '___OCT___' ;
SELECT *
FROM emp
WHERE hiredate LIKE '%20' ;
=>
CUST
CID CNAME
10 sachin_tendulkar
11 virat%kohli
12 mahendra_singh_dhoni
SELECT *
FROM CUST
WHERE CNAME LIKE '%\_%' ESCAPE '\' ;
SELECT *
FROM CUST
WHERE CNAME LIKE '%\%%' ESCAPE '\' ;
SELECT *
FROM CUST
WHERE CNAME LIKE '%\_%\_%' ESCAPE '\' ;
IS operator :-
-----------------
summary :-
26-nov-24
ALIAS :-
-------------
Ex :-
SELECT ENAME,
FLOOR((SYSDATE-HIREDATE)/365) AS EXPR
FROM EMP ;
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 :-
-----------------------------
SELECT columns / *
FROM tabname
[WHERE cond]
ORDER BY colname ASC/DESC , ----
Ex :-
SELECT *
FROM emp
ORDER BY ename ASC ;
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 ;
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
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 :-
-----------------------------
Ex :-
JOB
---------
CLERK
SALESMAN
ANALYST
MANAGER
PRESIDENT
DEPTNO
----------
30
10
20
FETCH clause :-
------------------------
Ex :-
SELECT empno,ename,sal
FROM emp
FETCH FIRST 5 ROWS ONLY ;
SELECT empno,ename,sal
FROM emp
OFFSET 4 ROWS FETCH NEXT 6 ROWS ONLY ;
SELECT empno,ename,sal
FROM emp
OFFSET 4 ROWS FETCH NEXT 1 ROW ONLY ;
SELECT empno,ename,sal
FROM emp
ORDER BY sal DESC
FETCH FIRST 5 ROWS ONLY ;
SELECT empno,ename,hiredate
FROM emp
ORDER BY hiredate ASC
FETCH FIRST 5 ROWS ONLY ;
summary :-
INSERT
UPDATE
DELETE
INSERT ALL
MERGE
DDL DML
UPDATE command :-
------------------------------
Ex :-
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' ;
products
prodid pname price category brand
SQL>UPDATE products
SET price = price + (price * 0.1)
WHERE brand IN ('samsung','realme')
AND
category='mobiles' ;
SQL>UPDATE emp
SET deptno = 20
WHERE deptno = 10 ;
DELETE command :-
----------------------------
ex :-
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) ;
SQL>COMMIT;
STEP 3 :- get the data that exists 2 mins back and insert that data into current emp table
SYSTEM :-
---------------
CREATE
ALTER
DROP
TRUNCATE
RENAME
FLASHBACK
PURGE
Ex 1 :-
Ex 2 :-
ALTER command :-
-----------------------
Adding columns :-
-------------------------
Ex :-
after adding by default the new column is filled with nulls , to insert
data into the new column use update command.
Droping columns :-
----------------------------
Ex :-
Renaming a column :-
----------------------------
ALTER TABLE <tabname>
RENAME COLUMN <oldname> TO <newname> ;
ex :-
Modifying a column :-
----------------------------
1 changing datatype
2 changing size
Ex :-
NOTE :-
DROP command :-
--------------------------
Ex :-
SQL>SHOW RECYCLEBIN ;
FLASHBACK command :-
------------------------------------
=> command used to restore the table from recyclebin.
Ex :-
=> table is restored with no of columns and rows that exists before drop
i.e. (8 cols and 14 rows)
PURGE command :-
---------------------------
Ex :-
TRUNCATE command :-
---------------------------------
=> deletes all the data from table but keeps structure
=> will empty the table.
=> will release memory allocated for table.
Ex :-
=> 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
7 slower faster
RENAME command :-
------------------------------
Ex :-
=> 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 :-
--------------------
sql>DESC ALL_USERS
USERNAME
USER_ID
CREATED
USER_TABLES :-
------------------------
sql>DESC USER_TABLES
TABLE_NAME
TABLESPACE_NAME
system :-
------------
Built-in functions :-
--------------------------
=> a function accepts some input performs some calculation and returns one value
Types of Functions :-
-----------------------------
character functions :-
----------------------------
UPPER() :-
---------------
UPPER(string/colname)
Ex :-
LOWER() :-
----------------
LOWER(string/colname)
Ex :-
sql>SELECT LOWER('HELLO') FROM DUAL ; => hello
INITCAP() :-
----------------
INITCAP(string/colname)
Ex :-
LENGTH() :-
----------------
LENGTH(string/colname)
Ex :-
sql>SELECT empno,ename,sal
FROM emp
WHERE LENGTH(ename) > 4 ;
SUBSTR() :-
-----------------
SUBSTR(string,start,[no of chars])
Ex :-
'a'||'b' => ab
SELECT empno,ename,
SUBSTR(ename,1,3)||SUBSTR(empno,1,3)||'@tcs.com' as emailid
FROM emp ;
sql>UPDATE emp
SET emailid = SUBSTR(ename,1,3)||SUBSTR(empno,1,3)||'@tcs.com' ;
INSTR() :-
---------------
INSTR(string,char,[start,occurance])
Ex :-
ex :-
CUST
CID CNAME
10 sachin tendulkar
11 virat kohli
SUBSTR(string,start,[ no of chars])
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
Ex :-
=>
ACCOUNTS
accno bal
123456789531 10000
1 LPAD(SUBSTR(ACCNO,-4) ,8,'X')
2 LPAD('X',4,'X')||SUBSTR(ACCNO,-4)
=>
credit_cards
card_no
1234567890123456
display 12xxxx456 ?
REPLACE() :-
-------------------
REPLACE(str1,str2,str3)
Ex :-
TRANSLATE() :-
-----------------------
TRANSLATE(str1,str2,str3)
Ex :-
E => A
L => B
O => C
=> translate function can be used to encrypt data i.e. converting plain text to cipher text.
SELECT ename,
TRANSLATE(sal,'0123456789','$bT*@r^%#!') as sal
FROM emp ;
o/p :- HELLO
SELECT
REPLACE(TRANSLATE('!@HE#$LL%^O*@' ,'!@#$%^*','*******') , '*','') FROM DUAL ;
-----------------------------------------------------------------------
**HE**LL**O**
Numeric functions :-
----------------------------
Rounding numbers :-
----------------------------
ROUND
TRUNC
CEIL
FLOOR
ROUND() :-
----------------
ROUND(number,[decimal places])
Ex :-
ROUND(38.456789) => 38
38--------------------------38.5-----------------------------39
ROUND(38.556789) => 39
300-------------------------350-----------------------------400
380---------------------------385--------------------------------390
ROUND(386,-3) => 0
0-------------------------------500--------------------------------1000
=>
TRUNC() :-
----------------
TRUNC(number,[decimal places])
Ex :-
TRUNC(38.9) => 38
TRUNC(999,-3) => 0
FLOOR() :-
---------------
FLOOR(number)
Ex :-
FLOOR(3.9) => 3
CEIL() :-
----------
CEIL(number)
Ex :-
CEIL(3.1) => 4
MOD() :-
--------------
MOD(num1,num2)
Ex :-
MOD(10,2) => 0
SELECT *
FROM emp
WHERE MOD(sal,50) = 0 ;
4-DEC-24
Date functions :-
-----------------------
ADD_MONTHS() :-
---------------------------
ADD_MONTHS(DATE , NUMBER)
Ex :-
=>
GOLD_RATES
DATEID RATE
01-JAN-20 ?
02-JAN-20 ?
04-DEC-24 ?
5 SELECT *
FROM GOLD_RATES
WHERE DATEID BETWEEN ADD_MONTHS(SYSDATE,-1) AND SYSDATE ;
MONTHS_BETWEEN() :-
----------------------------------
MONTHS_BETWEEN(DATE1,DATE2)
Ex :-
MONTHS_BETWEEN(SYSDATE,'04-DEC-23') => 12
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) AS EXPR
FROM EMP ;
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) AS YEARS ,
MOD(FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) ,12) AS
MONTHS
FROM EMP
17-FEB-2024 11
Conversion functions :-
-------------------------------
1 implicit conversion
2 explicit conversion
implicit conversion :-
---------------------------
Ex 1 :-
note :-
Explicit conversion :-
-----------------------------
formats :-
-------------
yyyy 2024
yy 24
mm 12
mon dec
month december
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
sql>SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') IN (1980,1983,1985) ;
sql>SELECT *
FROM emp
WHERE MOD(TO_CHAR(hiredate,'yyyy'),4) = 0 ;
d = 1
day = 'sunday'
=> employees joined in jan,apr,dec months ?
sql>SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') = 1981 AND TO_CHAR(hiredate,'q') = 2;
ex :-
sql>SELECT *
FROM emp
WHERE hiredate = SYSDATE ; => no rows
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 :-
----------------------------------------------
TO_CHAR(number,'format')
formats :-
-------------
ex :-
sql>SELECT ENAME,
TO_CHAR(SAL,'L99G999') AS SAL
FROM EMP ;
10-DEC-24
TO_DATE(string,'format')
Ex :-
sql>SELECT
TO_CHAR(TO_DATE('15-AUG-1947','DD-MON-YYYY'),'DAY')
FROM DUAL ;
TO_NUMBER(string , 'format')
Ex :-
o/p :- 8000
Special functions :-
---------------------------
NVL() :-
------------
NVL(arg1,arg2)
ex :-
ASCII() :-
------------
ASCII('char')
CHR() :-
------------
=>
cust
cid name hno street city state pin
10 A 100 ampt hyd tg 5000036
o/p :-
cname
hno
street
city
state
pin
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 20 ;
LEVEL = 1 ;
CONNECT BY (LEVEL<=10)
{
PRINT LEVEL
LEVEL = LEVEL + 1
}
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
65 A
66 B
date day
01-JAN-25 ?
02-JAN-25 ?
31-DEC-25 ?
SELECT LPAD('*',LEVEL,'*')
FROM DUAL
CONNECT BY LEVEL<=10 ;
*
**
***
***********
*
***
*****
Analytical Functions :-
-------------------------------
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 ;
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
=> 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 ;
student
sno sname m p c
=> these functions process multiple rows and returns one value
MAX
MIN
SUM
AVG
COUNT
COUNT(*)
MAX() :-
------------
MAX(colname)
Ex :-
MIN() :-
-----------
MIN(colname)
Ex :-
SUM() :-
-------------
SUM(colname)
Ex :-
29000-------------29050---------------------29100
=> after rounding display total sal with thousand seperator and currency symbol ?
SELECT SUM(sal)
FROM emp
WHERE job='MANAGER' ;
12-DEC-24
AVG() :-
-----------
AVG(colname)
Ex :-
2073----------------------------------------------2074
COUNT() :-
---------------
COUNT(colname)
Ex :-
SELECT COUNT(comm) FROM emp ; => 4 => NULLs are not counted
COUNT(*) :-
----------------
T1
F1
10
NULL
20
NULL
30
COUNT(F1) => 3
COUNT(*) => 5
SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate,'YYYY') = 1981 ;
SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate, 'dy') = 'sun' ;
d
dy
day
Ex :-
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 :-
---------------------------
1 simple case
2 searched case
simple case :-
--------------------
CASE colname
WHEN value1 THEN return expr1
WHEN value2 THEN return expr2
----------------------
ELSE return expr
END
SELECT ename,
CASE deptno
WHEN 10 THEN 'HR'
WHEN 20 THEN 'IT'
WHEN 30 THEN 'SALES'
ELSE 'UNKNOWN'
END AS dname
FROM emp ;
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 :-
SELECT ename,sal,
CASE
WHEN sal>3000 THEN 'Hisal'
WHEN sal<3000 THEN 'Losal'
ELSE 'Avgsal'
END as salrange
FROM emp ;
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
=> 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 :-
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
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
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 ;
========================================================================
==
=> 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
1 column level
2 table level
column level :-
-------------------
=> if constraints are declared immediately after declaring column then it is called
column level
NOT NULL :-
-------------------
ex :-
create table emp11
(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL
);
UNIQUE :-
-----------------
ex :-
PRIMARY KEY :-
--------------------------
=> 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 :-
=> 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 ;-
ex :-
VEHICLES
VEHNO NAME MODEL COST CHASSISNO
=> while creating table secondary keys are declared as UNIQUE NOT NULL.
CHECK :-
--------------
CHECK(condition)
16-dec-24
FOREIGN KEY :-
------------------------
=> 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
=> after declaring fk a relationship is created between two tables called parent/child relationship
Relationship Types :-
------------------------------
=> 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
=> 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
=> 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
ex :-
DEFAULT :-
------------------
=> while inserting if we skip hiredate then oracle inserts default value
ex :-
100 A 16-DEC-24
101 B 01-DEC-24
102 C NULL
ANS :- C
========================================================================
==
17-dec-24 JOINS
---------
=> join is an operation performed to display data from two or more 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 :-
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
SELECT empno,ename,sal,dname,loc
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno ;
=> 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.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
SELECT columns
FROM tab1 INNER JOIN tab2
ON join cond
INNER JOIN tab3
ON join cond
INNER JOIN tab4
ON join cond ;
Ex 1 :-
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
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
=> returns all rows from left side table and matching rows from right side table
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
=> 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
SELECT e.ename,d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno ;
A
ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
NULL OPERATIONS => unmatched from dept
19-dec-24
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
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
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 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
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
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 ;
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
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 :-
------------------
=> 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
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
SMITH FORD
ALLEN BLAKE
JONES KING
BLAKE KING
FORD JONES
=>
TEAMS
ID COUNTRY
1 IND
2 AUS
3 ENG
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
=> cross join returns cross product or cartesian product of two tables
A = 1,2
B = 3,4
=> if cross join performed between two tables then all the records of 1st table
joined with all the records of 2nd table.
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 :-
========================================================================
21-dec-24
SET OPERATORS :-
----------------------------
UNION
UNION ALL
INTERSECT
MINUS
A = 1,2,3,4
B = 1,2,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 :-
------------
Query 1 :
SELECT job FROM emp WHERE deptno = 20 ;
CLERK
MANAGER
ANALYST
CLERK
ANALYST
Query 2 :-
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
UNION :-
------------
ANALYST
CLERK
MANAGER
SALESMAN
ANALYST 3000
CLERK 800
CLERK 950
CLERK 1100
MANAGER 2850
MANAGER 2975
SALESMAN 1250
SALESMAN 1500
SALESMAN 1600
union join
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
100 10 HR
101 20 IT
100 10 HR
101 20 IT
200 10 HR
201 30 SALES
UNION ALL :-
------------------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
3 slower faster
INTERSECT :-
------------------
CLERK
MANAGER
MINUS :-
----------------
=> returns values present in 1st query output and not present in 2nd query output
ANALYST
=>
T1 T2
F1 F1
1 1
2 2
3 3
10 40
20 50
30 60
1 inner join
2 left join
3 right join
4 full join
5 union
6 union all
7 intersect
8 minus
======================================================================
23-dec-24
SUB-QUERIES / NESTED QUERIES :-
-------------------------------------------------------
Types of sub-queries :-
------------------------------
SELECT columns
FROM tabname
WHERE colname OP (SELECT statement) ;
=> OP must be any relational operator like = > >= < <=
Ex :-
SELECT *
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename='BLAKE') ;
-----------------------------------------------------------------------
2850
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
SELECT ename
FROM emp
WHERE hiredate = (SELECT MIN(hiredate) FROM emp ) ;
-----------------------------------------------------
17-dec-80
SELECT MAX(sal)
FROM emp
WHERE sal <> (SELECT MAX(sal) FROM emp) ;
SELECT ename
FROM emp
WHERE sal = (SELECT MAX(sal)
FROM emp
WHERE sal <> (SELECT MAX(sal) FROM emp)) ;
UPDATE emp
SET sal = sal + (sal*0.1)
WHERE hiredate = (SELECT MIN(hiredate) FROM emp) ;
=> swap employee salaries whose empno = 7369 , 7499 ?
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) ;
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 :-
-----------
sub-query :-
-----------------
not possible
1 to display data from one table and condition based on another table then we can use
sub-query or 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) ;
single multi
= IN
<> NOT IN
SELECT *
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc IN ('NEW
YORK','CHICAGO'));
10
30
24-dec-24
SELECT empno,ename,sal
FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE job='MANAGER') ;
2975
2850
2450
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.
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
SELECT *
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp) ;
-------------------------------------------
4200
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
SELECT empno,ename,sal,deptno
FROM emp e
WHERE sal = (SELECT MAX(sal) FROM emp WHERE deptno = e.deptno) ;
SAL
5000
1000
3000
2000
4000
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
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
psuedo columns :-
-------------------------
ROWID
ROWNUM
SYSDATE
LEVEL
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
=> 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
method 2 :-
1 A 5000
2 B 6000
3 C 7000
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 ;
default order :-
--------------------
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
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 ;
27-dec-24
ROWNUM :-
-----------------
ex :-
=> 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.
SELECT empno,ename,sal
FROM emp
WHERE rownum <= 5 ;
SELECT empno,ename,sal
FROM emp
WHERE rownum = 5 ; => no rows
SELECT *
FROM (SELECT ROWNUM as rno,empno,ename,sal FROM emp) E
WHERE rno = 5 ;
WHERE MOD(rno,2) = 0 ;
SELECT *
FROM (SELECT ROWNUM as rno,empno,ename,sal FROM emp) E
WHERE rno >= (SELECT COUNT(*)-2 FROM emp) ;
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
1 A
2 B
3 C
scalar sub-queries :-
-----------------------------
Ex 1 :-
Ex 2 :-
DEPTNO DEPT_TOTAL
---------- -------------------
30 9400
10 8750
20 10875
30 9400 29025
10 8750 29025
20 10875 29025
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) :-
---------------------------------------------------------------------------------------------
a new table is created with name EMP11 and rows & cols return by query are copied to
EMP11.
SYSTEM :-
---------------
Ex :-
MERGE command :-
----------------------------
Ex :-
CUSTS CUSTT
CID CNAME ADDR CID CNAME ADDR
10 A BLR 10 A HYD
11 B MUM 11 B MUM
12 C DEL
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
1 UPDATE command
2 merge command
========================================================================
=
30-dec-24
DATABASE TRANSACTIONS :-
-----------------------------------------
ex :- acct1 -----------------------1000--------------------------acct2
update1 update2
(bal=bal-1000) (bal=bal+1000)
=> 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.
=> 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 :-
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 :-
select * from a ;
10
20
============================================================
LOCKING :-
----------------
1 dirty read
2 lost update
3 phantom read
4 non repeatable read
=> 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
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
------------wait---------- --------wait----------------
---------------------------------------deadlock----------------------------------------------------------
5 error
6 rollback; 7 commit ;
=> In table level the whole table is locked i.e. all the records of the table are locked
Ex :-
SQL> LOCK TABLE emp IN EXCLUSIVE MODE ;
===============================================================
DB Security :-
------------------
server
database (users)
table (privileges)
rows & cols (views)
SYSTEM :-
--------------
PRIVILEGES :-
------------------
Ex :-
BATCH40 :-
-----------------
REVOKE command :-
-----------------------------
Ex :-
BATCH40 :-
-----------------
DB objects :-
------------------
SQL :-
----------
TABLES
VIEWS
SYNONYMS
SEQUENCES
INDEXES
PL/SQL :-
------------
PROCEDURES
FUNCTIONS
PACKAGES
TRIGGERS
VIEWS :-
------------
=> 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.
1 to provide security
2 to reduce complexity
1 simple views
2 complex views
simple views :-
---------------------
SYSTEM :-
---------------
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 ;
NARESH :-
---------------
SQL>CREATE VIEW V2
AS
SELECT empno,ename,job,deptno
FROM emp
WHERE deptno = 20 ;
NARESH :-
---------------
=> 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 ;
NARESH :-
------------------
1-jan-25
complex views :-
----------------------
=> with the help of views complex queries can be converted into simple queries
ex 1 :-
=> afer creating view , whenever user wants data from emp & dept tables then
instead of writing complex join query write the simple query as follows
ex 2 :-
after creating view whenever user want dept wise summary then execute the following
simple query
simple complex
USER_VIEWS :-
-----------------------
=> system table that stores information about views created by user
list of views created by user ?
Droping :-
--------------
DROP VIEW V1 ;
2-jan-25
SYNONYMS :-
--------------------
=> 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.
SYSTEM :-
----------------
BATCH40 :-
------------------
SQL>SELECT * FROM D ;
BATCH40 :-
----------------
NARESH :-
-----------------
Question :-
------------------
synonym alias
list of synonyms ?
Droping synonym :-
--------------------------
SQL>DROP SYNONYM D ;
Question :-
SEQUENCES :-
-----------------------
Ex 1 :-
SQL>CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 5;
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;
BILLNO
BILLNO BDATE AMT
DM/020125/1
DM/02/0125/2
CREATE SEQUENCE S3
START WITH 1
INCREMENT BY 1
MAXVALUE 9999 ;
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
CACHE size :-
---------------------
=> 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.
SELECT min_value,max_value,increment_by,cycle_flag,cache_size
FROM user_sequences
WHERE sequence_name='S15' ;
Droping :-
DROP SEQUENCE S1 ;
INDEXES :-
----------------
=> indexes are created on columns and that column is called index key.
ex :-
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.
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
note :-
USER_INDEXES :-
--------------------------
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
========================================================================
=
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 loops :-
----------------------
=> 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 :-
-----------------------------
1 Anonymous Blocks
2 Named Blocks
procedures
functions
packages
triggers
Anonymous Blocks :-
=================
DECLARE
<declaration-part>; optional
BEGIN
<statements>;
END;
/ => compiled & executed
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
1 Editors
2 IDEs
EDITOR IDE
executing no yes
debugging no yes
using notepad :-
-----------------------
begin
dbms_output.put_line('welcome');
end;
/
SQL>@D:\ORACLE\"prog1.sql"
output :- welcome
8-JAN-25
Datatypes in PL/SQL :-
--------------------------------
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
Declaring variable :-
---------------------------
variablename datatype(size) ;
ex :- x NUMBER(4);
s VARCHAR2(10);
d DATE;
b BOOLEAN;
x := 100;
s := 'hello' ;
d := sysdate;
b := TRUE;
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;
/
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 ?
output :-
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
=> To work with db execute sql commands from pl/sql program and
the following commands can be executed from pl/sql program.
Ex :-
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;
/
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 :-
-------------
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 :-
--------------------
ex :- r emp%rowtype;
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
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
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
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;
/
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;
while loop :-
-----------------
while(cond)
LOOP
statements;
END LOOP;
for loop :-
--------------
FOR i IN 1..10
LOOP
statements;
END LOOP;
Ex :-
DECLARE
x NUMBER(2) := 1 ;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(x);
x := x+1;
EXIT WHEN x>20;
END LOOP;
END;
/
DECLARE
x NUMBER(2) := 1;
BEGIN
WHILE(x<=20)
LOOP
DBMS_OUTPUT.PUT_LINE(x);
x := x+1;
END LOOP;
END;
/
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;
/
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;
/
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;
/
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;
/
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;
/
21-jan-25
CURSORS :-
------------------
=> 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.
1 DECLARE CURSOR
2 OPEN CURSOR
3 FETCH RECORDS FROM CURSOR
4 CLOSE CURSOR
Declaring cursor :-
-------------------------
Ex :-
Opening cursor :-
------------------------
OPEN <cursor-name> ;
Ex :-
OPEN C1 ;
Ex :-
=> 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 :-
-----------------
%NOTFOUND :-
----------------------
C1%FOUND
C1%NOTFOUND
C1%ROWCOUNT
Ex :-
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;
/
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 r IN C1
LOOP
statements ;
END LOOP;
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;
/
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;
/
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;
/
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;
/
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;
/
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() :-
--------------------
Ex :-
o/ p:- SMITH,ALLEN,WARD,-----
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
=======================================================================
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.
DECLARE
variables;
BEGIN
statements; => causes exception
EXCEPTION
statements; => handles exception
END;
/
1 system defined
2 user defined
system defined :-
------------------------
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 :-
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;
/
Ex :-
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;
/
=> 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;
/
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
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
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
=> procedures & funcations are stored in db , so applications which are connect db
can call procedures & functions.
4 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.
parameters :-
-----------------
1 IN
2 OUT
3 IN OUT
JAVA PROCEDURE
X ---------------------------------------------> A (IN )
Y <--------------------------------------------- B (OUT)
Execution :-
-------------------
1 sql prompt
2 another pl/sql prog
3 front-end applications
Execution :-
----------------
Execution :-
-----------------
SQL>VARIABLE X NUMBER
SQL>EXECUTE raise_salary(7369,1000,:X);
SQL>PRINT :X
25-jan-25
Execution :-
SQL>VARIABLE K NUMBER
SQL>EXECUTE raise_salary(peno=>7369,pnewsal=>:K);
SQL>PRINT :K
=> 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.
1 for calculations
2 to fetch data from tables
Ex 1 :-
Execution :-
1 sql commands
2 another pl/sql prog
3 front-end applications
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 :-
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
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
PROCEDURES FUNCTIONS
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
USER_SOURCE :-
------------------------
=> It is a system table that stores procedures & functions created by user
Droping :-
-------------
27-JAN-25
packages :-
---------------
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.
1 package specification
2 package body
package specification :-
-----------------------------
package body :-
--------------------
Ex :-
package specification :-
-------------------------------
package body :-
---------------------
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
ACCOUNTS
ACCNO ACTYPE BALa
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
specification :-
--------------------
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.
1 to control dmls
2 to enforce complex rules and validations
3 to audit day-to-day operations on tables
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 :-
Testing :-
SQL>UPDATE EMP SET COMM = 800 WHERE EMPNO = 7844 ; => ERROR
SUN --------------------------------
Testing :-
----------
SQL>UPDATE EMP SET COMM = 800 WHERE EMPNO = 7844; => ERROR
Testing :-
SQL>UPDATE EMP SET EMPNO = 9999 WHERE EMPNO = 7844 ; => ERROR
=> 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.
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.
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
VALUES(:OLD.EMPNO,:OLD.ENAME,:OLD.JOB,:OLD.SAL,:OLD.HIREDATE,SYSDATE);
END;
/
Testing :-
------------
USER_TRIGGERS :-
---------------------------
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
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.
Ex :-
SQL>EXECUTE drop_table('EMP_RESIGN') ;
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 :-
=====
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 :-
Partial dependency :-
---------------------------
=> In table if non key field depends on part of the key field then it is called partial dependency
ex :-
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
=============
=> 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 :-
----------
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
TABLE 1 :-
---------------
BILL
BILLNO BDATE CCODE CNAME ADDR TBILL
======
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
=============
========================================================================
=====