Oracle

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 99

25-aug-22

WHERE clause :-
---------------

=> where clause is used to get specific row/rows from table based on
a condition.

SELECT columns/*
FROM tabname
WHERE condition ;

condition :-
------------

COLNAME OP VALUE

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

examples :-
-----------

=> display employee details whose id = 103 ?

SELECT *
FROM emp
WHERE empid = 103 ;

=> display employee details whose name = vijay ?

SELECT *
FROM emp
WHERE ename='vijay' ;

SELECT *
FROM emp
WHERE ename='VIJAY' ; => no rows selected

NOTE :- in oracle string comparision is case sensitive i.e.


uppercase and lowercase strings are not same.

=> display employee details earning more than 5000 ?


SELECT *
FROM emp
WHERE sal>5000;

=> display employee details joined after 2020 ?

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

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

=> employees 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
=> display employee details whose name = vijay,sachin ?

SELECT *
FROM emp
WHERE ename='vijay' OR ename='sachin' ;

=> employees working as clerk,manager ?

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

=> employee list working for 20th dept and earning more than 5000 ?

SELECT *
FROM emp
WHERE dno=20 AND sal>5000 ;

=> employees joined in 2020 year ?

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

scenario :-
-----------
1

CUST
cid name age gender city

=> list of customers styaing in hyd,mum ?

SELECT * FROM cust WHERE city='hyd' OR city='mum' ;

=> list of customers age between 30 and 40 ?

SELECT * FROM cust WHERE age>30 AND age<40;

=> list of male customers staying in hyd and age > 30 ?


SELECT * FROM cust WHERE gender='m'
AND
city='hyd'
AND
age>30 ;

2
STUDENTS
sno sname s1 s2 s3
1 A 80 90 70
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 ;

26-aug-22

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

examples :-
-------------

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

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

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


=> employees working as clerk,manager ?

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

=> employees not working for dept 10,20 ?

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

SINGLE MULTI

= IN

<> NOT IN

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

=> use BETWEEN operator for range comparision.

WHERE colname BETWEEN V1 AND V2


WHERE colname NOT BETWEEN V1 AND V2

=> employees earning between 5000 and 10000 ?

SELECT * FROM emp WHERE sal BETWEEN 5000 AND 10000 ;

=> employees joined in 2021 year ?

SELECT * FROM emp


WHERE hiredate BETWEEN '01-JAN-2021' AND '31-DEC-2021' ;

=> employees not joined in 2021 year ?

SELECT * FROM emp


WHERE hiredate NOT BETWEEN '01-JAN-2021' AND '31-DEC-2021' ;

Question :-
-----------

SELECT * FROM emp WHERE sal BETWEEN 10000 AND 5000;

A ERROR
B RETURNS ROWS
C RETURNS NO ROWS
D NONE

ANS :- C

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

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

NOTE :- use BETWEEN operator with lower and upper but not with upper and lower

scenario :-
-----------

PRODUCTS
prodid pname price category brand

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

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

2
CUST
cid name gender age city

=> list of male customers styaing in hyd,blr,mum


and age between 20 and 30 ?

SELECT *
FROM cust
WHERE gender='m'
AND
city IN ('hyd','blr','mum')
AND
age BETWEEN 20 AND 30 ;

=> display employees working as clerk,manager and earning between 3000


and 8000 and joined in 2022 year and not working for dept 20,30 ?

SELECT *
FROM emp
WHERE job IN ('clerk','manager')
AND
sal BETWEEN 3000 AND 8000
AND
hiredate BETWEEN '01-JAN-2022' AND '31-DEC-2022'
AND
dno NOT IN (20,30);

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

=> use LIKE operartor for pattern comparision.

ex :- name starts with 'a'


name ends with 's'
name contains 'k'

WHERE COLNAME LIKE 'PATTERN'


WHERE COLNAME NOT LIKE 'PATTERN'

=> pattern contains alphabets,digits and wildcard characters

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

% => 0 or many chars


_ => exactly 1 char

=> employee name starts with 's' ?

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

=> employees name ends with "n" ?

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

=> employees name contains 'a' ?


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

=> 'a' is the 3rd char in their name ?

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

=> 'a' is the 3rd char from last ?

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

=> name contains 4 chars ?

SELECT * FROM emp WHERE ename LIKE '____' ;

=> employees joined in JAN month ?

DD-MON-YY

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

=> joined in 2022 year ?

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

27-aug-22

Question :-
------------

SELECT *
FROM emp
WHERE job IN ('clerk','man%') ;

A ERROR
B returns clerk,manager
C returns only clerk
D none

ANS :- C

SELECT *
FROM emp
WHERE job='clerk' OR job LIKE 'man%' ;
ANS :- B

example :-

CUST
CID NAME
10 sachin
11 virat_kohli
12 rohit%sharma

=> list of customers name contains "_" ?

SELECT *FROM cust WHERE name LIKE '%_%' ;

=> above query returns all the customer records because "_"
is treated as wildcard char , to overcome this problem
use escape character.

SELECT * FROM cust WHERE name LIKE '%\_%' ESCAPE '\' ;

=> name contains "%" ?

SELECT * FROM cust WHERE name LIKE '%\%%' ESCAPE '\' ;

=> name contains 2 "_" ?

SELECT * FROM cust WHERE name LIKE '%\_%\_%' ESCAPE '\' ;

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

=> use IS operator for NULL comparision

WHERE COLNAME IS NULL


WHERE COLNAME IS NOT NULL

=> find the 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

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

=> system table or data dictionary table that stores information


about tables created by user.

display list of tables created by user ?

SELECT TABLE_NAME FROM USER_TABLES ;

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

=> system table that stores information about users

list of users in oracle db ?

SELECT USERNAME FROM ALL_USERS ;

ALIAS :-
--------

=> alias means another name or alternative name.


=> used to change column headings.

syntax :- EXPRESSION [AS] ALIAS

=> display ENAME , ANNUAL SALARY ?

SELECT ename,sal*12 as annsal


FROM emp ;

SELECT ename,sal*12 as "annual sal"


FROM emp ;

=> display ENAME EXPERIENCE in years ?


SELECT ename,
(SYSDATE-hiredate) as experience
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 ;

29-AUG-22

DML commands :- (DATA MANIPULATION LANG)


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

INSERT
UPDATE
DELETE
INSERT ALL
MERGE

=> all DML commands acts on table data.


=> DML operations performed on instance(RAM).
=> to save the operations execute COMMIT.
=> to cancel the operations execute ROLLBACK.

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

=> command used to modify the table data.


=> we can update all rows or specific rows.
=> we can update single column or multiple columns.

SYN :- UPDATE tabname


SET colname = value , colname = value, ----
[WHERE cond] ;

EX :-

=> update all the employee salaries with 5000 ?

UPDATE emp SET sal = 5000 ;

=> update employee salaries with 4000 whose salary = null ?

UPDATE emp SET sal = 4000 WHERE sal IS NULL ;

=> increment salary by 10% of the employees working as clerk,manager


and working for dept 10,20 ?

UPDATE emp
SET sal = sal + (sal*0.1)
WHERE job IN ('clerk','manager')
AND
dno IN (10,20) ;

=> update the employee job to clerk and increment sal by 20%
those who working for 10,20th depts and joined in 2022 year ?

UPDATE emp
SET job='CLERK' , sal = sal + (sal*0.2)
WHERE dno IN (10,20)
AND
hiredate LIKE '%22' ;

=> transfer all employees from 10th dept to 30th dept ?

UPDATE emp SET dno=30 WHERE dno=10 ;

scenario :-
------------

PRODUCTS
prodid pname price category brand

=> increase all the samsung,redmi,realme brand mobile phones price by 10% ?

UPDATE products
SET price = price + (price * 0.1)
WHERE brand IN ('samsung','redmi','realme')
AND
category='mobile phones' ;

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

=> command used to delete row/rows from table.


=> we can delete specific row/multiple rows/all rows.
=> to save delete operation execute commit.
=> to cancel the operation execute rollback.

syn :- DELETE FROM <tabname> [WHERE cond];

ex :-

=> delete the employees joined in 2019 year ?

DELETE FROM emp WHERE hiredate LIKE '%19' ;

=> delete employees whose empid=102,104,106 ?

DELETE FROM emp WHERE empid IN (102,104,106);

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

=> using flashback we can recover the data after commit.


=> useful to recover data which is accidentally deleted.
=> use rollback to recover data before commit.
=> use flashback to recover data after commit.

example for flashback query :-


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

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

=> a normal query returns current data.


=> a query that returns past data is called flashback query.

example for recovering data after commit :-


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

step 1 :-

DELETE FROM student ;

step 2 :-

COMMIT;

step 3 :-

=> to recover the data after commit , get the data that exists 5 mins back
and insert that data into current student table.

INSERT INTO STUDENT


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

DDL commands :- (Data Definition Lang)


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

CREATE
ALTER
DROP
TRUNCATE
RENAME
FLASHBACK
PURGE

=> all DDL commands acts on table structure that includes columns,datatype and size
=> all DDL commands are auto committed.

DDL command = DDL command + COMMIT

Question 1 :-
-------------

CREATE TABLE a(a NUMBER(2));


INSERT INTO a VALUES(10);
INSERT INTO a VALUES(20);
INSERT INTO a VALUES(30);
ROLLBACK ;
which operations are saved & cancelled ?

CREATE TABLE => saved


INSERT => cancelled

Question 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 ;

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

=> command used to modify the table structure.


=> using ALTER command we can

1 add columns
2 drop columns
3 rename column
4 modify a column
incr/decr field size
changing datatype

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

ALTER TABLE <tabname> ADD(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,
use update command to insert data into the new column.

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


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

Droping column :-
------------------

ALTER TABLE <tabname>


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

Ex :- drop column gender from emp table ?

ALTER TABLE emp


DROP (gender);

renaming a column :-
--------------------

ALTER TABLE <tabname>


RENAME COLUMN <oldname> TO <newname> ;

ex :- rename the column COMM to BONUS ?

ALTER TABLE emp


RENAME COLUMN COMM TO BONUS ;

SELECT empno,ename,sal,comm as bonus FROM emp ;

diff b/w rename & alias ?

rename alias

1 permanent not permanent

2 changes column name changes column heading


in table. in select stmt output

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

1 incr/decr field size


2 changing datatype
ALTER TABLE <TABNAME>
MODIFY(colname datatype(size));

Ex :- increase size of ename to 20 ?

ALTER TABLE emp


MODIFY(ename VARCHAR2(20));

ALTER TABLE emp


MODIFY(ename VARCHAR2(5)); => ERROR some value contains more than 5 chars

NOTE :- 1 column must be empty to decrease precision or scale of a numeric field

ALTER TABLE emp


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

2 column must be empty to change datatype

ALTER TABLE emp


MODIFY(empno VARCHAR2(10)); => ERROR

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

=> command used to drop table from database.


=> command drops table structure along with data.

syn :- DROP TABLE <tabname>

ex :-

SQL>DROP TABLE emp ;

=> before 10g ver when table is dropped then it is permanently removed and
cannot be recovered but from 10g onwards when table is dropped then
it is moved to recyclebin.

How to see the recyclebin :-


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

SQL>SHOW RECYCLEBIN ;
FLASHBACK command :-
---------------------

=> command used to restore the table from recyclebin.


=> introduced in 10g ver.
=> useful when tables are dropped accidentally.

syn :- FLASHBACK TABLE <tabname> TO BEFORE DROP ;

Ex :- SQL>FLASHBACK TABLE emp TO BEFORE DROP ;

=> table is restored with columns and rows that exists before drop.

recovering data after commit :-


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

SQL>delete from emp ;


SQL>commit;

SQL>insert into emp


select *
from emp
as of timestamp(sysdate - interval '2' minute) ;

recovering table after drop :-


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

SQL>FLASHBACK TABLE emp TO BEFORE DROP ;

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

=> command used to delete the table from recyclebin.


=> introduced in 10g.
=> after purge flashback will not work and flashback will work only
when table is there in recyclebin.

syntax :- PURGE TABLE <tabname>

ex :- SQL>PURGE TABLE emp ;

DROP & PURGE :-


----------------
SQL>DROP TABLE STUDENT PURGE ;

=> above command drops table and also deletes the table from recyclebin.

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

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

syn :- TRUNCATE TABLE <tabname> ;

ex :- SQL>TRUNCATE TABLE emp ;

=> when above command is executed then oracle goes to memory and releases
all the blocks allocated for emp table and when memory is released
then data stored in the memory also deleted.

DROP VS TRUNCATE :-
------------------

DROP TRUNCATE

1 DDL command DDL command

2 drops table structure deletes only data


with data but not structure

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

DELETE TRUNCATE

1 DML command DDL command

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 delete operation can truncate operation cannot


be rolledback be rolledback
5 deletes row-by-row deletes all rows at a time

6 slower faster

7 will not release memory will release memory

RENAME :-
---------

=> command used to change tablename.

syntax :- RENAME <oldname> TO <newname> ;

ex :-

SQL>RENAME emp TO employees ;

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

Integrity Constraints :-
------------------------

=> Integrity Constraints are rules to maintain Data Integrity i.e. Data
Quality.

=> Integrity Constraints are used to prevent users from entering invalid data

=> used to enforce rules like min bal must be 1000.

=> different integrity constraints in oracle

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 field declared with NOT NULL is called mandatory field.

ex :- CREATE TABLE emp11


(
empid 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 emp12


(
empid NUMBER(4),
emailid VARCHAR2(20) UNIQUE
);

INSERT INTO emp12 VALUES(100,'abc@gmail.com');


INSERT INTO emp12 VALUES(101,'abc@gmail.com'); => ERROR
INSERT INTO emp12 VALUES(102,''); => accepted
INSERT INTO emp12 VALUES(103,''); => accepted
note :- unique constraint doesn't allow duplicates but allows nulls

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

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


=> primary key is the combination of unique & not null.

primary key = unique + not null

=> in tables one column must be there to uniquely identify the


records and that column must be declared with primary key.

Example :-

CREATE TABLE emp13


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10),
sal NUMBER(7,2)
);

INSERT INTO emp13 VALUES(100,'A',5000);


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

=> because primary key doesn't allow duplicates & nulls so using
primary key column we can uniquely identify the records.

=> only one primary key is allowed per table , if we want


multiple primary keys then declare one column with primary key
and remaining columns with UNIQUE & NOT NULL.

CREATE TABLE cust


(
custid NUMBER(8) PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
aadharno NUMBER(12) UNIQUE NOT NULL,
panno CHAR(10) UNIQUE NOT NULL
);

1 diff b/w unique & primary key


unique primary key

1 allows nulls doesn't allow nulls

2 multiple columns only single column can be declared


can be declared with primary key
with unique

3 cannot be used can be used to uniquely


to uniquely identify the records
identify records

candidate key :-
----------------

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

ex :-

VEHICLE
VEHNO NAME MODEL PRICE CHASSISNO

candidate keys :- VEHNO,CHASSISNO


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

=> while creating table seconday keys are declared with UNIQUE & NOT NULL

03-sep-22

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

=> use CHECK constraint when rule based on condition.

syntax :- CHECK(condition)

example 1 :- sal must be min 3000

CREATE TABLE emp14


(
empid NUMBER(4),
ename VARCHAR2(10),
sal NUMBER(7,2) CHECK(sal>=3000)
);

INSERT INTO emp14 VALUES(1,'A',1000); => ERROR


INSERT INTO emp14 VALUES(2,'B',5000);
INSERT INTO emp14 VALUES(3,'C',NULL); => 1 row created

NOTE :- check constraint allows null values

example 2 :- gender must be 'm','f'

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

example 3 :- amt must be multiple of 100

AMT NUMBER(8,2) CHECK(MOD(AMT,100)=0)

MOD => it is a function that returns remainder

MOD(10,2) => 0
MOD(10,3) => 1

example 4 :- pwd must be min 6 chars

PWD VARCHAR2(10) CHECK(LENGTH(PWD)>=6)

example 5 :- emailid must contain '@'


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

EMAILID VARCHAR2(30) CHECK(EMAILID LIKE '%@%'


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

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

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


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

Example :-

PROJECTS
PROJID NAME DURATION COST CLIENT
100 ABC 5 YEARS 200 TATA MOTORS
101 XYZ 3 YEARS 150 DBS BANK
102 KLM 4 YEARS 180 L&T

EMP
EMPID ENAME SAL PROJID REFERENCES PROJECTS(PROJID)
1 A 5000 100
2 B 4000 101
3 C 6000 100
4 D 3000 NULL
5 E 2000 999 => INVALID

=> values entered in foreign key column should match with values entered
in primary key column.

=> foreing key allows duplicates and nulls.

=> after declaring foreign key a relationship is established between


two tables called parent/child relationship.

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

CREATE TABLE projects


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

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


INSERT INTO projects VALUES(101,'XYZ','DBS BANK');

CREATE TABLE emp_proj


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10) NOT NULL,
sal NUMBER(7,2) CHECK(sal BETWEEN 3000 AND 10000),
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',6000,100);
INSERT INTO emp_proj VALUES(4,'D',3000,NULL);

05-sep-22

Types of Relationships :-
------------------------

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 (1:m) relationship between two
tables , to establish one to one (1:1) relationship between two
tables then declare foreign key with unique constraint.

Example for one to one relationship :-


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

DEPT
DNO DNAME
10 HR
20 IT
30 SALES

MANAGERS
MGRNO MNAME DNO REFERENCES DEPT(DNO) UNIQUE
1 A 10
2 B 20
3 C 30
4 D 10 => NOT ACCEPTED

CREATE TABLE dept


(
dno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(10) UNIQUE NOT NULL
);

INSERT INTO dept VALUES(10,'HR');


INSERT INTO dept VALUES(20,'IT');

CREATE TABLE managers


(
mgrno NUMBER(4) PRIMARY KEY,
mname VARCHAR2(10) NOT NULL,
dno NUMBER(2) REFERENCES dept(dno) UNIQUE
);

INSERT INTO managers VALUES(1,'A',10);


INSERT INTO managers VALUES(2,'B',10); => ERROR
INSERT INTO managers VALUES(2,'B',20);

RELATIONAL MODEL FOR THE ABOVE ER DIAGRAM :-


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

BANK
CODE NAME ADDRESS
-----

BRANCH
BRANCH_ID NAME ADDRESS CODE (FK)
---------

ACCOUNT
ACCNO ACCTYPE BALANCE BRANCH_ID (FK) CUSTID(FK)
-----

LOANS
LOAN_ID LOAN_TYPE AMOUNT BRANCH_ID (FK) CUSTID(FK)
-------

CUSTOMER
CUSTID NAME PHONE ADDRESS
------

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.

CREATE TABLE emp22


(
empid NUMBER(4),
hiredate DATE DEFAULT SYSDATE
);

INSERT INTO emp22(empid) VALUES(100);


INSERT INTO emp22 VALUES(101,'01-JAN-22');
INSERT INTO emp22 VALUES(102,'');

SELECT * FROM emp22

empid hiredate
100 05-SEP-22
101 01-JAN-22
102

06-SEP-22

ACCOUNTS
ACCNO ACTYPE BAL

RULES :-
--------

1 ACCNO SHOULD NOT BE DUPLICATE & NULL


2 ACTYPE MUST BE 'S' OR 'C'
3 BAL MUST BE MIN 1000

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO

RULES :-

1 TRID SHOULD NOT BE DUPLICATE & NULL


2 TTYPE MUST BE 'W' OR 'D'
3 TDATE MUST BE SYSDATE
4 TAMT MUST BE MULTIPLE OF 100
5 ACCNO SHOULD MATCH WITH ACCOUNTS TABLE ACCNO.

=> WRITE CREATE TABLE SCRIPT WITH GIVEN RULES ?

TABLE LEVEL :-
--------------

=> if constraints are declared after declaring all columns then it is called
table level.

=> use table level to declare constraint for multiple columns or combination of
columns.

CREATE TABLE <tabname>


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

Declaring check constraint at table level :-


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

PRODUCTS
prodid pname mfd_dt exp_dt
100 A 06-sep-22 01-jan-22 => invalid

RULE :- exp_dt > mfd_dt

CREATE TABLE products


(
prodid NUMBER(3) PRIMARY KEY,
pname VARCHAR2(10) NOT NULL,
mfd_dt DATE ,
exp_dt DATE,
CHECK(exp_dt>mfd_dt)
);

INSERT INTO products VALUES(100,'A',SYSDATE,'01-JAN-22'); => ERROR


INSERT INTO products VALUES(100,'A','01-JAN-22',SYSDATE);
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 combination of columns to uniquely
identity , so that combination should be declared primary key

=> composite primary key declared at table level.

Example :-
---------

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

REGISTRATIONS
SID CID DOR FEE
1 10 ??? ??
1 11 ??? ??
2 10 ??? ??

=> above example sid,cid combination uniquely identifies the records


so declare this combination as primary key at table levle.

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,'ORACLE');
INSERT INTO course VALUES(11,'JAVA');

CREATE TABLE registrations


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

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


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

composite foreign key :-


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

=> if foreign key declared for combination then it is called composite


foreign key.

=> a composite foreign key refers composite primary key.

=> composite foreign key is declared at table level.

example :-

REGISTRATIONS
SID CID DOR FEE
1 10 ??? ??
1 11 ??? ??
2 10 ??? ??

CERTIFICATES
certno doi sid cid
1000 06/ 1 10
1001 06/ 1 11
1002 06/ 2 11

=> in the above example sid,cid combination should match with


registrations table sid,cid , so declare this combination as
foreign key at table level.
CREATE TABLE certificates
(
certno NUMBER(4) PRIMARY KEY,
doi DATE,
sid NUMBER(2),
cid NUMBER(2),
FOREIGN KEY(sid,cid) REFERENCES registrations(sid,cid)
);

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

07-sep-22

Adding constraints to existing table :-


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

=> "ALTER" command is used to add constraints to existing table.

CREATE TABLE emp77


(
empno NUMBER(4),
ename VARCHAR2(10),
sal NUMBER(7,2),
dno NUMBER(2)
);

Adding primary key :-


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

=> add primary key to empno ?

ALTER TABLE emp77


ADD PRIMARY KEY(empno);
NOTE :- primary key cannot be added to the column that already
contains duplicates and nulls.

Adding Check constraint :-


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

=> add check constraint with condition sal>=3000 ?

ALTER TABLE emp77


ADD CHECK(sal>=3000);

add check constraint to emp table with cond sal >= 3000 ?

ALTER TABLE emp


ADD CHECK(sal>=3000); => ERROR

NOTE :- while adding constraint oracle also validates


existing data , if existing data satisfies the cond then
constraint is added otherwise not added.

NOVALIDATE :-
-------------

=> if check constraint is added with NOVALIDATE then


oracle will not validate existing data and validates
only new data.

ALTER TABLE emp


ADD CHECK(sal>=3000) NOVALIDATE ;

Adding foreign key :-


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

=> add foreign key to dno that references dept table primary key
i.e. dno ?

ALTER TABLE emp77


ADD FOREIGN KEY(dno) REFERENCES dept(dno) ;

changing from NULL to NOT NULL :-


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

=> Modify the column ename to NOT NULL ?


ALTER TABLE emp77
MODIFY(ename NOT NULL);

USER_CONSTRAINTS :-
-------------------

=> it is a system table that stores information about


constraints declared in a table.

CONSTRAINT_NAME
CONSTRAINT_TYPE
TABLE_NAME
SEARCH_CONDITION

=> list of constraints declared in emp77 table ?

SELECT CONSTRAINT_NAME,
CONSTRAINT_TYPE,
SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP77' ;

CONSTRAINT_NAME C SEARCH_CONDITION
------------------------------ - --------------------
SYS_C007766 R
SYS_C007763 C sal>=3000
SYS_C007767 C "ENAME" IS NOT NULL
SYS_C007762 P

P => PRIMARY KEY


R => FOREIGN KEY
U => UNIQUE
C => CHECK
C => NOT NULL

Droping constraints :-
----------------------

ALTER TABLE <TABNAME>


DROP CONSTRAINT <NAME>;
=> drop check constraint in emp77 table ?

ALTER TABLE emp77


DROP CONSTRAINT SYS_C007763 ;

=> drop primary key in emp77 table ?

ALTER TABLE emp77


DROP PRIMARY KEY ;

=> drop primary key in dept table ?

ALTER TABLE dept


DROP PRIMARY KEY ; => ERROR

DROP TABLE dept ; => ERROR

TRUNCATE TABLE dept; => ERROR

NOTE :-

1 primary key constraint cannot be dropped if ref by some fk


2 primary key table cannot be dropped if ref by some fk
3 primary key table cannot be truncated if ref by some fk

CASCADE option :-
-----------------

ALTER TABLE dept


DROP PRIMARY KEY CASCADE ;

=> drops primary key with dependent foreign key

DROP TABLE dept CASCADE CONSTRAINTS ;

=> drops table with dependent foreign key.

08-SEP-22

DELETE RULES :-
---------------
1 ON DELETE NO ACTION (DEFAULT)
2 ON DELETE CASCADE
3 ON DELETE SET NULL

=> these rules are declared with foreign key.

=> delete rules specifies how child rows are affected if parent
row is deleted.

ON DELETE NO ACTION :-
----------------------

=> parent row cannot be deleted if associated with child rows.

CREATE TABLE dept99


(
dno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(10)
);

INSERT INTO dept99 VALUES(10,'HR');


INSERT INTO dept99 VALUES(20,'IT');

CREATE TABLE emp99


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10),
dno NUMBER(2) REFERENCES dept99(dno)
);

INSERT INTO emp99 VALUES(1,'A',10);


INSERT INTO emp99 VALUES(2,'B',10);

DELETE FROM DEPT99 WHERE DNO=10; => ERROR

SCENARIO :-
-----------

ACCOUNTS
ACCNO BAL
100 10000
101 20000
LOANS
ID TYPE AMT ACCNO
1 H 30 100
2 C 10 100

NOTE :- account closing is not possible if associated with loans

ON DELETE CASCADE :-
---------------------

=> if parent row is deleted , along with parent child rows are
also deleted.

CREATE TABLE dept99


(
dno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(10)
);

INSERT INTO dept99 VALUES(10,'HR');


INSERT INTO dept99 VALUES(20,'IT');

CREATE TABLE emp99


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10),
dno NUMBER(2) REFERENCES dept99(dno)
ON DELETE CASCADE
);

INSERT INTO emp99 VALUES(1,'A',10);


INSERT INTO emp99 VALUES(2,'B',10);

DELETE FROM DEPT99 WHERE DNO=10; => 1 ROW DELETED

SELECT * FROM EMP99 ; => NO ROWS

SCENARIO :-
-----------

ACCOUNTS
ACCNO BAL
100 10000
101 20000

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
1 W 20/ 1000 100
2 D 25/ 2000 100

NOTE :- IF ACCOUNTS IS CLOSED THEN ALONG WITH ACCOUNT DELETE


TRANSACTIONS.

ON DELETE SET NULL :-


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

=> if parent is deleted then it is deleted without deleting


child rows but fk will be set to null.

CREATE TABLE dept99


(
dno NUMBER(2) PRIMARY KEY,
dname VARCHAR2(10)
);

INSERT INTO dept99 VALUES(10,'HR');


INSERT INTO dept99 VALUES(20,'IT');

CREATE TABLE emp99


(
empid NUMBER(4) PRIMARY KEY,
ename VARCHAR2(10),
dno NUMBER(2) REFERENCES dept99(dno)
ON DELETE SET NULL
);

INSERT INTO emp99 VALUES(1,'A',10);


INSERT INTO emp99 VALUES(2,'B',10);

DELETE FROM DEPT99 WHERE DNO=10; => DELETED

SELECT * FROM EMP99;

1 A NULL
2 B NULL
SCENARIO :-
----------

PROJECTS
projid name client
100 A
101 B

EMP
empid ename projid
1 K 100
2 X 101

NOTE :- when project is completed set the employee projid


to NULL.

SUMMARY :-

=> importance of constraints


=> types of constraints
=> declaring constraints
column level
table level
=> adding constraints to existing table
=> droping constraints
=> delete rules
=> getting constraints information

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

Built-in Functions in ORACLE :-


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

=> a functions accepts some input performs some calculation


and returns one value.

=> functions are widely used in data processing.

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

1 STRING
2 MATHEMATICAL
3 DATE
4 CONVERSION
5 SPECIAL
6 ANALYTICAL
7 AGGREGATE

STRING functions :-
-------------------

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

=> used to convert string to uppercase

UPPER(arg)

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

what is DUAL ?

DUAL is a dummy table provided by oracle used to select


non db values.

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

=> converts string to lowercase.

LOWER(arg)

SQL>SELECT LOWER('HELLO') FROM DUAL ; => hello

=> Display EMPNO ENAME SAL ?

display names in lowercase ?

SELECT EMPNO,LOWER(ENAME) AS ENAME,SAL FROM EMP ;

=> convert names to lowercase in table ?


UPDATE emp SET ename = LOWER(ename) ;

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

=> converts initials into capitals

INITCAP(arg)

SELECT INITCAP('sachin tendulkar') FROM DUAL ;

o/p :- Sachin Tendulkar

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

=> returns string length i.e. no of chars

LENGTH(arg)

LENGTH('hello') => 5

LENGTH('hello welcome') => 13

=> display employee list name contains 5 chars ?

SELECT * FROM emp WHERE ename LIKE '_____' ;

SELECT * FROM emp WHERE LENGTH(ename)=5 ;

09-SEP-22

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

=> used to extract part of the string starting from specific position

SUBSTR(string,start,[length])

SUBSTR('hello welcome',10,3) => com


SUBSTR('hello welcome',7,4) => welc
SUBSTR('hello welcome',7) => welcome
SUBSTR('hello welcome',-5,3) => lco
SUBSTR('hello welcome',-12,3) => ell

=> display employoees name starts with 's' ?

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

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

=> employees name ends with 's' ?

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

=> employees name starts and ends with same char ?

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


OR
ename LIKE 'b%b'

SELECT * FROM emp


WHERE SUBSTR(ename,1,1) = SUBSTR(ename,-1,1);

LPAD & RPAD :-


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

=> both functions are used to fill string with a character

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


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

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


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

=> display ENAME SAL ?

***
****
*****

SELECT ename,RPAD('*',LENGTH(sal),'*') as sal FROM emp ;

scenario :-
ACCOUNTS
ACCNO
123456789428

=> your a/c no XXXX9428 debited ----- ?

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

|| => operator for concatenation

'A'||'B' => AB

LTRIM & RTRIM & TRIM :-


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

=> used to remove spaces and unwanted chars.

LTRIM(string,[char]) => removes left side


RTRIM(string,[char]) => removes right side
TRIM(string) => removes both sides

LTRIM('@@@hello@@@','@') => hello@@@


RTRIM('@@@hello@@@','@') => @@@hello

TRIM(both '@' from '@@@hello@@@') => hello

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

=> used to replace one string with another string.

REPLACE(str1,str2,str3)

=> in str1 , str2 replaced with str3

REPLACE('hello','ell','abc') => habco


REPLACE('hello','l','abc') => heabcabco
REPLACE('hello','ell','') => ho
REPLACE('@@he@@ll@@o@@','@','') => hello

TRANSLATE() :-
--------------
=> used to translate one char to another char

TRANSLATE(str1,str2,str3)

TRANSLATE('hello','elo','abc') => habbc

e => a
l => b
o => c

=> translate function can be used to encrypt data i.e.


changing plain text to cipher text.

plain text cipher text

hello #5*%y!

SELECT ENAME,
TRANSLATE(SAL,'0123456789','$Bt*p@H^k%') as sal
FROM emp ;

jones 2975 t%^@

=> remove all special chars from '@#he%*ll^$o@^' ?

o/p :- hello

SELECT
REPLACE(
TRANSLATE('@#he%*ll^$o@^','@#%*^$','******'),'*','')
FROM DUAL ;

TRANSLATE('@#he%*ll^$o@^','@#%*^$','******') => **he**ll**o**

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

10-sep-22

MATHEMATICAL FUNCTIONS :-
-------------------------

MOD() :- returns remainder


--------

MOD(NUM1,NUM2)

MOD(10,2) => 0

=> employees earning multiples of 100 ?

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

ROUNDING NUMBERS :-
------------------

ROUND
TRUNC
CEIL
FLOOR

38.5678 => 39
38.56
38.567

ROUND :-
--------

=> used to round number to integer or to decimal places


based on avg.

ROUND(number,[decimal places])

ROUND(38.5678) => 39

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

number >= avg => rounded to highest


number > avg => rounded to lowest

ROUND(38.5678,2) => 38.57


ROUND(38.5678,3) => 38.568
ROUND(386,-2) => 400

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

ROUND(386,-1) => 390

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

ROUND(386,-3) => 0

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

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

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

TRUNC :-
---------

=> rounds number always to lowest

TRUNC(number,[decimal places])

TRUNC(38.9) => 38

38------------------------39

TRUNC(38.5678,2) => 38.56

TRUNC(386,-2) => 300

300---------------------400

SELECT TRUNC(ROUND(4567,-2),-3) FROM DUAL ;

STEP 1 :- ROUND(4567,-2) => 4600


STEP 2 ;- TRUNC(4600,-3) => 4000

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

=> rounds number always to highest

CEIL(number)

CEIL(3.1) => 4

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

=> rounds number always to lowest

FLOOR(number)

FLOOR(3.9) => 3

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

DATE FUNCTIONS :-
-----------------

SYSDATE + 10 => adds 10 days to sysdate


SYSDATE - 10 => subtracts 10 days from sysdate
SYSDATE - HIREDATE => calculates difference in days
SYSDATE + HIREDATE => INVALID

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

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

ADD_MONTHS(DATE,MONTHS)

ADD_MONTHS(SYSDATE,2) => 10-NOV-22


ADD_MONTHS(SYSDATE,-2) => 10-JUL-22

SCENARIO :-
-----------

GOLD_RATES
DATEID RATE
01-JAN-16 ?
02-JAN-16 ?

10-SEP-22 ?

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 ?

answers :-
---------

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 ;

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

=> returns difference between two dates in months

MONTHS_BETWEEN(DATE1,DATE2)

MONTHS_BETWEEN(SYSDATE,'10-SEP-21') => 12

=> display ENAME EXPERIENCE in months ?

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

12-sep-22

=> 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 ;

LAST_DAY() :-
--------------

=> returns last day of the month

LAST_DAY(DATE)

LAST_DAY(SYSDATE) => 30-SEP-22

=> display first day of the next month ?

SELECT LAST_DAY(SYSDATE) + 1 FROM DUAL ;

=> display current month day first day ?

SELECT ADD_MONTHS(LAST_DAY(SYSDATE),-1)+1
FROM DUAL ;

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

Conversion Functions :-
------------------------

=> conversion means converting 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.

example 1 :-

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

=> string '5000' converted to number by oracle

example 2 :-

SQL>CREATE TABLE D(D DATE);

SQL>INSERT INTO D VALUES('12-SEP-22'); => 1 ROW CREATED

=> string '12-SEP-22' converted to DATE by oracle.

NOTE :- implicit conversion is not recommended because it


degrades performance , so better to avoid implicit conversion
use explicit conversion.

explicit conversion :-
----------------------

=> conversion performed by user then it is called explicit


conversion.

=> the following functions provided by oracle for explicit


conversion.

1 TO_CHAR
2 TO_DATE
3 TO_NUMBER

converting date to char type :-


------------------------------
=> Dates are converted to char type to display dates in
different formats.

TO_CHAR(DATE,FORMAT) (DATE=SYSDATE)

FORMATS :-
-----------

YYYY 2022
YY 22
YEAR TWENTY TWENTY-TWO

MM 09
MON SEP
MONTH SEPTEMBER

DDD DAY OF THE YEAR 255


DD DAY OF THE MONTH 12
D DAY OF THE WEEK 2
DY DAY OF THE WEEK NAME MON
DAY MONDAY

HH hour part
HH24 hour part in 24 hrs format
MI minutes
SS seconds

Q quarter (1-4)

1 JAN-MAR
2 APR-JUN
3 JUL-SEP
4 OCT-DEC

SELECT TO_CHAR(SYSDATE,'MM/DD/YYYY HH:MI:SS') FROM DUAL ;

output :-

09/12/2022 12:19:15

=> display employees joined on sunday ?


SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'d') = 1 ;
dy = 'sun'
day = 'sunday'

=> joined on sat,sun ?

SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'d') IN (1,7) ;

=> display employee joined in jan,apr,dec months ?

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

=> display employee joined in 2nd quarter of 1981 year ?

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

14-sep-22

=> display employees joined in leap year ?

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

converting number to char type :-


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

=> numbers are 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

TO_CHAR(1234,'99999') => 1234


TO_CHAR(1234,'00000') => 01234
TO_CHAR(1234,'000000') => 001234

TO_CHAR(1234,'9G999') => 1,234


TO_CHAR(1234,'99G999') => 1,234
TO_CHAR(1234,'00G000') => 01,234
TO_CHAR(500000,'9G99G999') => 5,00,000
TO_CHAR(5000,'9G99G999') => 5,000
TO_CHAR(5000,'0G00G000') => 0,05,000

TO_CHAR(5000,'L9G999') => $5,000


TO_CHAR(5000,'C9G999') => USD5,000

TO_CHAR(5000,'C9G999D00') => USD5,000.00

=> display ENAME SAL ? display salaries with thousand


seperator and currency symbol ?

SELECT ENAME,TO_CHAR(SAL,'C99G999') AS SAL FROM EMP ;

smith $800
allen $1,600

How to change currency :-


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

SQL>ALTER SESSION SET NLS_TERRITORY='INDIA' ;

converting char to date type :-


------------------------------
TO_DATE(DATE STRING,'FORMAT')

DATE STRING => '14-SEP-22'


'09/14/22'

SQL>SELECT SYSDATE + 10 FROM DUAL ; => 24-SEP-22

SQL>SELECT '01-JAN-22' + 200 FROM DUAL ; => ERROR

NUMBER + NUMBER => VALID


DATE + NUMBER => VALID
STRING + NUMBER => INVALID

SQL>SELECT TO_DATE('01-JAN-22','DD-MON-YY')+200 FROM DUAL ;

=> calculate '09/14/22' + 100 ?

SQL>SELECT TO_DATE('09/14/22','MM/DD/YY') + 100 FROM DUAL;

=> write a query to display on which day india got independence ?

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

O/P :- FRIDAY

converting char to number type :-


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

TO_NUMBER(NUMERIC STRING,'FORMAT')

NUMERIC STRING => '5000'


'5,000'
'$5,000'

Examples :-
------------
SQL>SELECT 1000 + '5,000' FROM DUAL ; => ERROR

SQL>SELECT 1000 + TO_NUMBER('5,000','9G999') FROM DUAL ; => 6000

=> calculate '$6,000' + 'USD5,000' ?

SELECT
TO_NUMBER('$6,000','L9G999') + TO_NUMBER('USD5,000','C9G999')
FROM DUAL ;

O/P :- 11000

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

15-sep-22

Special Functions :-
--------------------

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

=> used to convert null values

NVL(arg1,arg2)

if arg1 = null returns arg2


if arg1 <> null returns arg1 only

NVL(100,200) => 100


NVL(NULL,200) => 200

Display ENAME SAL COMM TOTSAL ?


TOTSAL = SAL + COMM

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

smith 800 null null


allen 1600 300 1900

X + NULL => NULL


X - NULL => NULL
X * NULL => NULL
X/NULL => NULL

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 ?

SELECT ENAME,SAL,NVL(COMM,'N/A') AS COMM FROM EMP ; => ERROR

SELECT ENAME,SAL,NVL(TO_CHAR(COMM),'N/A') AS COMM FROM EMP ;

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

=> returns ascii value of a given character

ASCII(CHAR)

ASCII('A') => 65

ASCII('a') => 97

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

=> returns character for given ascii value

CHR(ASCII VALUE)
CHR(65) => A
CHR(97) => a

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

O/P :- A
B

scenario :-
-----------

CUST
CID NAME HNO STREET CITY STATE
10 A 100 AMPT HYD TS

output :-

NAME
HNO
STREET
CITY
STATE

SELECT CNAME||CHR(10)||
HNO||CHR(10)||
STREET||CHR(10)||
CITY||CHR(10)||
STATE
FROM CUST
WHERE CID = 10 ;

how to implement loop in SQL :-


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

SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL<=10 ;

=> LEVEL is a system variable


=> LEVEL is initialized to 1
=> by default LEVEL is incremented by 1

for(level=1;level<=10;level++)
{
print level;
}

=> write a query to print all even nos upto 20 ?

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

for(level=1;level<=20;level++)
{
if mod(level,2)=0
print level;
}

=> write a query to print all ascii characters ?

1 ?
2 ?

65 A

97 a

255 ?

SELECT LEVEL,CHR(LEVEL)
FROM DUAL
CONNECT BY LEVEL<=255;

=> write a query to print following pattern ?

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

*
**
***

**********

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


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

*
***
*****
*******

=> input string and print following pattern ?

input :- NARESH

output :-

N
A
R
E
S
H

=> input string and print following pattern ?

INPUT :- NARESH

output :-

N
NA
NAR
NARE
NARES
NARESH

=> print 2023 calendar ?


DATE DAY

01-JAN-23 ?
02-JAN-23 ?

31-DEC-23 ?

SELECT TO_DATE('31-DEC-22','DD-MON-YY') + LEVEL,


TO_CHAR(TO_DATE('31-DEC-22','DD-MON-YY') + LEVEL,'DAY')
FROM DUAL
CONNECT BY LEVEL<=365 ;

16-sep-22

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

RANK & DENSE_RANK :-


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

=> Both functions are used to find ranks


=> used to find Top N
=> ranking is always based on some column
=> for rank functions input data must be sorted (arranged)

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


DENSE_RANK() OVER (ORDER BY COLNAME ASC/DESC)

ASC => ASCENDING


DESC => DESCENDING

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

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

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

difference between rank & dense_rank ?


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 will be always in sequence.

SAL RANK DENSE_RANK


5000 1 1

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

=> display ranks of the employees based on sal , if salaries are same then
ranking should be based on hiredate ?

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

KING 17-NOV-81 5000 1


FORD 03-DEC-81 3000 2
SCOTT 09-DEC-82 3000 3
JONES 02-APR-81 2975 4

scenario :-

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

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

SELECT SNO,SNAME,M,P,C,M+P+C AS TOTAL,


DENSE_RANK() OVER (ORDER BY (M+P+C) DESC,M DESC,P DESC) AS RNK
FROM STUDENT;
3 C 90 80 70 240 1
4 D 90 70 80 240 2
1 A 80 90 70 240 3
2 B 60 70 50 180 4

PARTITION BY clause :-
----------------------

=> used to find ranks with in group , for ex to find ranks with in dept
first we need to divide the table dept wise using partition by clause
and apply dense_rank function on each dept.

display ranks of the employees with in dept based on sal ?

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

ROW_NUMBER() :-
---------------

=> returns record numbers


=> row_number is also based on some column
=> for row_number function input data must be sorted

ROW_NUMBER() OVER (ORDER BY COLNAME ASC/DESC)

SELECT ename,sal,
ROW_NUMBER() OVER (ORDER BY sal DESC) as rno
FROM emp ;

king 5000 1
scott 3000 2
ford 3000 3

17-sep-22

Aggregate / Group Functions :-


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

=> These functions process group of rows and returns one value

MAX() :- returns maximum value


--------
MAX(arg)

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(arg)

SELECT MIN(sal) FROM emp ; => 800

SELECT MIN(ename) FROM emp ; => ADAMS

SUM() :- returns total


--------

SUM(arg)

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 with currency symbol ?

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

o/p :- $29,000

=> display total sal paid to managers ?

SELECT SUM(sal)
FROM emp
WHERE job='MANAGER' ;
=> display totsal and include comm ?

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

SAL COMM SAL+COMM


5000 NULL NULL
3000 500 3500
4000 NULL NULL

SUM(SAL) = 12000
SUM(SAL+COMM) = 3500

SAL COMM SAL+NVL(COMM,0)


5000 NULL 5000
3000 500 3500
4000 NULL 4000

SUM(SAL) = 12000
SUM(SAL+NVL(COMM,0)) = 12500

SELECT SUM(SAL+NVL(COMM,0)) FROM EMP ; => 31225

AVG() :- returns average value


---------

AVG(arg)

SELECT AVG(sal) FROM emp ; => 2073.21429

=> round the avg(sal) to lowest integer ?

SELECT FLOOR(AVG(sal)) FROM emp ; => 2073

NOTE :- SUM,AVG functions cannot be applied on char,date columns


and can be applied on only on numeric columns.

SELECT SUM(hiredate) FROM emp ; => ERROR

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

=> returns no of rows in a table.


SELECT COUNT(*) FROM emp ; => 14

=> how many employees joined in 1981 year ?

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

=> how many employees joined on sunday ?

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

d 1
dy sun
day sunday

NOTE :- aggregate functions are not allowed in where clause


and they are allowed only in select,having clauses .

SELECT *
FROM emp
WHERE COUNT(*) = 3 ; => ERROR

STRING :-
--------

upper,lower,initcap,length,substr,lpad,rpad,ltrim,rtrim,trim,
replace,translate

MATH :-
--------

mod,round,trunc,ceil,floor

DATE :-
-------

add_months,months_between,last_day
CONVERSION :-
-----------

to_char,to_date,to_number

Special :-
----------

nvl,ascii,chr

analytical :-
--------------

rank,dense_rank,row_number

aggregate :-
------------

max,min,sum,avg,count(*)

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

19-sep-22

How to implement IF-THEN-ELSE :-


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

1 CASE statement
2 DECODE function

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

=> used to implement IF-THEN-ELSE


=> similar to switch case
=> returns values based on conditions
=> case statements are 2 types

1 simple case
2 searched case

1 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 display IT
30 display SALES
otherwise OTHERS ?

SELECT ENAME,
CASE DEPTNO
WHEN 10 THEN 'HR'
WHEN 20 THEN 'IT'
WHEN 30 THEN 'SALES'
ELSE 'OTHERS'
END AS DNAME
FROM EMP ;

=> increment employee salaries as follows ?

if JOB=CLERK incr sal 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 ;

only clerk sal should be incr by 10% ?


UPDATE emp SET sal=sal+(sal*0.1) where job='clerk' ;

SEARCHED CASE :-
----------------

=> use searched case when conditions not based on "=" operator like
> < >= <= between in like etc.

CASE
WHEN COND1 THEN RETURN EXPR1
WHEN COND2 THEN RETURN EXPR2
----------
ELSE RETURN EXPR
END

=> display ENAME SAL SALRANGE ?

if SAL>3000 dislplay HISAL


SAL<3000 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) AS AVG,
CASE
WHEN S1>=35 AND S2>=35 AND S3>=35 THEN 'PASS'
ELSE 'FAIL'
END AS RESULT
FROM STUDENT ;
storing the query output in table :-
----------------------------------

CREATE TABLE <tabname>


AS
SELECT statement ;

Example :-

CREATE TABLE student_result


AS
SELECT SNO,
S1+S2+S3 AS TOTAL,
ROUND((S1+S2+S3)/3) AS AVG,
CASE
WHEN S1>=35 AND S2>=35 AND S3>=35 THEN 'PASS'
ELSE 'FAIL'
END AS RESULT
FROM STUDENT ;

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

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

=> used to sort data based on one or more columns either in ascending
order or in descending order.

SELECT columns
FROM tabname
[WHERE cond]
ORDER BY colname ASC/DESC ;

=> default sort order is ASC

Examples :-
------------

=> arrange employee list name wise ascending order ?

SELECT *
FROM emp
ORDER BY ename ASC ;
=> arrange employee list sal wise desc order ?

SELECT *
FROM emp
ORDER BY sal DESC ;

NOTE :-
--------

=> in ORDER BY we can use column names or column numbers

SELECT *
FROM emp
ORDER BY 6 DESC ;

=> above query sorts data based on 6th column i.e. sal.

2 ORDER BY number is not based on table and it is based on select list

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

=> above query sorts data based on 3rd column in select i.e. sal

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

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

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

=> display employees working as clerk,manager and arrange


list sal wise desc order ?
SELECT empno,ename,job,sal
FROM emp
WHERE job IN ('CLERK','MANAGER')
ORDER BY 4 DESC ;

execution :-
--------------

FROM
WHERE
SELECT
ORDER BY

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

1 A 3000 20 CLERK
2 B 4000 10 MANAGER
3 C 3000 30 SALESMAN
4 D 6000 10 MANAGER
5 E 5000 20 CLERK

WHERE job IN ('CLERK','MANAGER') :-


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

1 A 3000 20 CLERK
2 B 4000 10 MANAGER
4 D 6000 10 MANAGER
5 E 5000 20 CLERK

SELECT empno,ename,sal,deptno,job :-
----------------------------------

1 A 3000 20 CLERK
2 B 4000 10 MANAGER
4 D 6000 10 MANAGER
5 E 5000 20 CLERK

ORDER BY sal DESC :-


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

4 D 6000 10 MANAGER
5 E 5000 20 CLERK
2 B 4000 10 MANAGER
1 A 3000 20 CLERK

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

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

=> used to eliminate duplicates from the select stmt output

syntax :- DISTINCT colname


DISTINCT col1,col2,---

SQL> SELECT DISTINCT JOB FROM EMP ;

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

SQL> SELECT DISTINCT DEPTNO FROM EMP ;

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

SQL>SELECT DISTINCT DEPTNO,JOB


FROM EMP
ORDER BY DEPTNO ASC ;

DEPTNO JOB
---------- ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN

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.

1 A 5000 10
2 B 3000 20 GROUP BY 10 11000
3 C 4000 30 ================> 20 8000
4 D 6000 10 30 4000
5 E 5000 20

detailed data summarized data

=> GROUP BY clause converts detailed data into summarized data


which is useful for analysis.

syntax :- Execution :-
--------

SELECT columns FROM


FROM tabname WHERE
[WHERE cond] GROUP BY
GROUP BY <colname> HAVING
[HAVING cond] SELECT
[ORDER BY <colname>] ; ORDER BY

examples :-

=> display dept wise total salary ?

SELECT DEPTNO,SUM(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO ASC ;

DEPTNO SUM(SAL)
---------- ----------
10 9620
20 11960
30 10905
FROM EMP :-
------------

1 A 5000 10
2 B 3000 20
3 C 4000 30
4 D 6000 10
5 E 5000 20

GROUP BY DEPTNO :-
------------------

10
1 A 5000
4 D 6000

20
2 B 3000
5 E 5000

30
3 C 4000

SELECT DEPTNO,SUM(SAL) :-
-------------------------

10 11000
20 8000
30 4000

=> display job wise no of employees ?

SQL> SELECT JOB,COUNT(*)


FROM EMP
GROUP BY JOB ;

JOB COUNT(*)
--------- ----------
CLERK 4
SALESMAN 4
ANALYST 2
MANAGER 3
PRESIDENT 1
21-SEP-22

=> display year wise no of employees joined ?

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


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

YEAR COUNT(*)
---- ----------
1981 10
1983 1
1980 1
1982 2

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

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 ;

SCENARIO :-
------------

PERSONS
AADHARNO NAME AGE GENDER ADDR CITY STATE

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

SELECT STATE,COUNT(*)
FROM PERSONS
WHERE STATE IN ('AP','TS','KA','KL,'TN')
GROUP BY STATE
HAVING COUNT(*) > 50000000 ;

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

WHERE HAVING

1 selects specific rows selects specific groups

2 conditions applied conditions applied after


before group by group by

3 use where clause if use having clause


cond doesn't contain if cond contains
group function group function

=> display dept wise total sal where deptno = 10,20 and
total sal > 10000 ?

SELECT deptno,SUM(sal)
FROM emp
WHERE deptno IN (10,20)
GROUP BY deptno
HAVING SUM(sal) > 10000 ;

20 11960

=> display dept wise and with in dept job wise total sal ?

SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY deptno,job
ORDER BY deptno ASC ;

10 CLERK 1430
MANAGER 2940
PRESIDENT 5250

20 ANALYST 6300
CLERK 2090
MANAGER 3570

30 CLERK
MANAGER
SALESMAN

ROLLUP & CUBE :-


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

=> both functions are used to display subtotals and grand total

syntax :- GROUP BY ROLLUP(col1,col2,--)


GROUP BY CUBE(col1,col2,--)

ROLLUP :-
---------

=> rollup displays subtotals for each group and also displays
grand total.

SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY ROLLUP(deptno,job)
ORDER BY deptno ASC ;

10 CLERK 1430
MANAGER 2940
PRESIDENT 5250
9620 => subtotal

32485 => grand total

CUBE :-
------

=> CUBE displays subtotals for each group by column (deptno,job)


and also displays grand total.
SELECT deptno,job,SUM(sal) as totsal
FROM emp
GROUP BY CUBE(deptno,job)
ORDER BY deptno ASC ;

10 CLERK 1430
MANAGER 2940
PRESIDENT 5250
9620 => subtotal

analyst 6300 => subtotal


clerk 4565 => subtotal

32485 => grand total

Assignment :-
--------------

PERSONS
AADHARNO NAME AGE GENDER ADDR CITY STATE

1 display state wise population ?


2 display gender wise population ?
3 display age group wise population ?

1-20 ?
21-40 ?
41-60 ?
>60 ?

4 display state wise and with in state gender wise population


and display state wise subtotals and gender wise subtotals ?

5 display the states having more than 5CR population ?

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

JOINS
------

=> join is an operation performed to fetch data from two or more table.
=> in DBs related data stored in multiple tables , to combine data
stored in multiple tables we need to join those tables.

example :-
---------

source tables :-
----------------
orders customers
ordid ord_dt del_dt cid cid name addr
1000 10 10 A hyd
1001 11 11 B hyd
1002 12 12 C hyd

output :-

ordid ord_dt del_dt name addr


1000 A hyd
1001 B hyd

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

1 EQUI JOIN / INNER JOIN


2 OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER
3 NON EQUI JOIN
4 SELF JOIN
5 CROSS JOIN / CARTESIAN JOIN

EQUI JOIN / INNER 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.

join styles :-
--------------
1 Native style (oracle style)
2 ANSI style

Native style :-
---------------

SELECT columns
FROM tabnames
WHERE <join cond> ;

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

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

=> join cond determines which record of 1st table should be joined
with which record of 2nd table.

table1.commonfield = table2.commonfield

example :-

EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
1 A 20 10 ACCOUNTS NEW YORK
2 B 30 20 RESEARCH DALLAS
3 C 10 30 SALES CHICAGO
4 D 20 40 OPERATIONS BOSTON
5 E NULL

=> DISPLAY ENAME DNAME LOC ?


----- -------------
EMP DEPT

SELECT ENAME,DEPTNO,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO ;

A RESEARCH DALLAS
B SALES CHICAGO
C ACCOUNTS NEW YORK
D RESEARCH DALLAS
NOTE :- 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,DEPT D
WHERE E.DEPTNO = D.DEPTNO ;

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

SELECT E.ENAME,D.DNAME,D.LOC
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO /* join cond */
AND
D.LOC = 'NEW YORK' /* filter cond */ ;

23-sep-22

joining more than 2 tables :-


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

=> if no of tables increases no of join conditions also increases.


=> to join N tables N-1 join conditions required.

SELECT columns
FROM tablenames
WHERE join cond1
AND
join cond2
AND
join cond3 ;

example :-
----------

EMP DEPT LOCATIONS COUNTRIES


empid deptid locid country_id
ename dname city country_name
job locid state
sal country_id
deptid
=> display ENAME DNAME CITY STATE COUNTRY_NAME ?
----- ------ ------------ -------------
EMP DEPT LOCATIONS COUNTRIES

SELECT e.ename,
d.dname,
l.city,l.state,
c.country_name
FROM emp e,
dept d,
locations l,
countries c
WHERE e.deptid = d.deptid
AND
d.locid = l.locid
AND
l.country_id = c.country_id ;

ANSI style :- (American National Standard Institute)


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

=> introduced in oracle 9i.

=> ANSI style gurantees portability but Native Style doesn't


gurantees portability.

=> in ANSI style tablenames are seperated by keywords and


use ON clause for join conditions instead of WHERE clause.

SELECT E.ENAME,D.DNAME,D.LOC
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;

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

SELECT E.ENAME,D.DNAME,D.LOC
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE D.LOC = 'NEW YORK' ;

NOTE :- use ON clause of join conditions


use WHERE clause for filter conditions

OUTER JOIN :-
-------------

=> inner join returns only matching records but cannot return
unmatched records. To display unamtched records perform
outer join.

EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
1 A 20 10 ACCOUNTS NEW YORK
2 B 30 20 RESEARCH DALLAS
3 C 10 30 SALES CHICAGO
4 D 20 40 OPERATIONS BOSTON => unmatched
5 E 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(matched + unmatched) from left side table


and matching rows from right side table.

SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO(+) ;

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

A RESEARCH
B SALES
C ACCOUNTS
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,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO ;

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

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

FULL OUTER JOIN :-


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

=> returns all rows from both tables

SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO(+) ; => ERROR

=> Native style doesn't support full outer join only ANSI style
supports full outer join. To Peform full outer join in
Native style combine the outputs of left outer & right outer
by using UNION operator.

SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO(+)
UNION
SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO ;

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

24-sep-22
ANSI style :-
--------------

LEFT OUTER :-
-------------

SELECT E.ENAME,D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;

RIGHT OUTER JOIN :-


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

SELECT E.ENAME,D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;

FULL OUTER JOIN :-


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

SELECT E.ENAME,D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;

Displaying 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

NON-EQUI JOIN :-
---------------

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

=> here join condition is not based on "=" operator and it is based
on > < between operators.

example :-

EMP SALGRADE
EMPNO ENAME SAL GRADE LOSAL HISAL
1 A 3500 1 700 1000
2 B 2000 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 ?


------------- ------
EMP SALGRADE

SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP E,SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ;
A 3500 4
B 2000 2
C 5000 5
D 1500 2
E 2500 3

ANSI style :-
-----------------

SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP E JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL ;

=> display grade 3 employee list ?

SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP E JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE S.GRADE = 3 ;

joining more than two tables in ANSI style :-


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

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

display ENAME DNAME GRADE ?


----- ----- --------
EMP DEPT SALGRADE

SELECT E.ENAME,D.DNAME,S.GRADE
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL ;

EMP DEPT
EMPNO SAL DEPTNO DEPTNO DNAME
1 3000 10 10 ACCOUNTS
2 1500 20 20 RESEARCH
OUTPUT :- SALGRADE
1 3000 10 ACCOUNTS JOIN GRADE LOSAL HISAL
2 1500 20 RESEARCH 1 700 1000
2 1001 2000
3 2001 3000

1 3000 10 ACCOUNTS 3
2 1500 20 RESEARCH 2

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

=> joining a table to itself is called 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 declared


two times with different alias.

FROM EMP X,EMP Y

EMP X EMP Y
EMPNO ENAME MGR EMPNO ENAME MGR
1 A NULL 1
A NULL
2 B 1 2
B 1
3 C 1 3
C 1
4 D 2 4
D 2
5 E 3 5
E 3

=> in the above example table contains manager number


but to display manager name perform self join

SELECT X.ENAME,Y.ENAME AS MANAGER


FROM EMP X,EMP Y
WHERE X.MGR = Y.EMPNO ;

B A
C A
D B
E C

26-sep-22

ANSI style :-
------------

SELECT X.ENAME,Y.ENAME AS MANAGER


FROM EMP X JOIN EMP Y
ON X.MGR = Y.EMPNO ;

=> display employee reporting to BLAKE ?

SELECT X.ENAME,Y.ENAME AS MANAGER


FROM EMP X JOIN EMP Y
ON X.MGR = Y.EMPNO
WHERE Y.ENAME='BLAKE' ;

=> display employees earning more than their managers ?

SELECT X.ENAME,X.SAL,
Y.ENAME AS MANAGER,Y.SAL AS MGRSAL
FROM EMP X JOIN EMP Y
ON X.MGR = Y.EMPNO
WHERE X.SAL > Y.SAL ;

Question :-
-------------

TEAMS
ID COUNTRY
1 IND
2 AUS
3 RSA

write a query to display following output ?

IND VS AUS
IND VS RSA
AUS VS RSA

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


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

Assignment :-
--------------

=> list of employees earning same salary ?


=> list of employee joined on same day ?

CROSS JOIN / 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)

=> in cross join each record in 1st table joined with all the records
of 2nd table.

=> to perform cross join submit the join query without join condition

SELECT E.ENAME,D.DNAME
FROM EMP E,DEPT D ;

ANSI STYLE :-
---------------

SELECT E.ENAME,D.DNAME
FROM EMP E CROSS JOIN DEPT D ;

GROUP BY & JOIN :-


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

=> display dept wise total sal ? display dept names ?

SELECT D.DNAME,SUM(E.SAL)
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME ;
FROM EMP E INNER JOIN DEPT D :-
--------------------------------

EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 3000 20 10 ACCOUNTS NEW YORK
2 B 4000 30 20 RESEARCH DALLAS
3 C 5000 10 30 SALES CHICAGO
4 D 4000 20 40 OPERATIONS BOSTON
5 E 3000 10

ON E.DEPTNO = D.DEPTNO :-
--------------------------

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

GROUP BY D.DNAME :-
--------------------

ACCOUNTS
3 C 5000
5 E 3000

RESEARCH
1 A 3000
4 D 4000

SALES
2 B 4000

SELECT D.DNAME,SUM(E.SAL) :-
----------------------------

ACCOUNTS 8000
RESEARCH 7000
SALES 4000

=>
SALES
DATEID PRODID CUSTID QTY AMOUNT
26-SEP-22 100 10 1 1000

PRODUCTS
PRODID NAME PRICE CATEGORY
100 AAAA 1000 ELECTRONICS

CUST
CUSTID NAME ADDR COUNTRY
10 A AMPT IND

=> display category wise total amount ?


=> display country wise total amount ?
=> display year wise total amount ?
=> display year wise ,country wise,category wise total amount ?

1 SELECT p.category,SUM(s.amount)
FROM sales s INNER JOIN products p
ON s.prodid = p.prodid
GROUP BY p.category ;

3 SELECT TO_CHAR(dateid,'yyyy') as year,SUM(amount)


FROM sales
GROUP BY TO_CHAR(dateid,'yyyy') ;

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

27-sep-22

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 are performed between 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 same

SELECT job FROM emp WHERE deptno = 20 ;

CLERK
MANAGER
ANALYST
CLERK
ANALYST

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 3150
CLERK 880
CLERK 1045
CLERK 1210
MANAGER 3000
MANAGER 3420
SALESMAN 1437.5
SALESMAN 1725
SALESMAN 1840

Difference between UNION & JOIN ?

UNION JOIN

1 combines rows combines columns

2 performed between can be performed


two similar structures between two dissimilar
structures

3 horizontal(rows) merge vertical(columns) merge

scenario :-
------------

EMP_US
ENO ENAME DNO
1 A 10
2 B 20
DEPT
EMP_IND DNO DNAME LOC
ENO ENAME DNO 10 IT ??
10 K 10 20 HR ??
11 D 20

=> total employee list ?

SELECT * FROM EMP_US


UNION
SELECT * FROM EMP_IND ;

1 A 10
2 B 20
10 K 10
11 D 20

=> display employees working at US loc with dept details ?

SELECT E.*,D.*
FROM EMP_US E INNER JOIN DEPT D
ON E.DNO = D.DNO ;

=> total employee list 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 ;

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

diff b/w UNION & UNION ALL ?

UNION UNION ALL

1 duplicates are eliminated duplicates are not eliminated

2 result is sorted result is not sorted

3 slower faster

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

=> returns common values from the output of two select statements.

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

Question :-
-------------

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

Write outputs for the following operations ?

1 INNER JOIN
2 LEFT OUTER JOIN
3 RIGHT OUTER JOIN
4 FULL OUTER JOIN
5 UNION
6 UNION ALL
7 INTERSECT
8 MINUS

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

SUBQUERIES / NESTED QUERIES :-


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

=> a query in another query is called subquery or nested query.


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

Types of subqueries :-
---------------------

1 single row subqueries


2 multi row subqueries
3 co-related subqueries
4 inline views
5 scalar subqueries

single row subqueries :-


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

=> if inner query returns one value then it is called single rows subquery

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

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

examples :-

=> employees earning more than blake ?

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

=> employees who are senior to king ?

SELECT *
FROM emp
WHERE hiredate < (SELECT hiredate
FROM emp
WHERE ename='KING');

=> name of the employee earning max salary ?

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

=> group functions are not allowed in where clause and they are
allowed only in select,having clauses.

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

You might also like