Professional Documents
Culture Documents
Oracle
Oracle
Oracle
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 :-
-----------
SELECT *
FROM emp
WHERE empid = 103 ;
SELECT *
FROM emp
WHERE ename='vijay' ;
SELECT *
FROM emp
WHERE ename='VIJAY' ; => no rows selected
SELECT *
FROM emp
WHERE hiredate > 2020 ; => ERROR
SELECT *
FROM emp
WHERE hiredate > '31-DEC-2020' ;
SELECT *
FROM emp
WHERE hiredate < '01-JAN-2020' ;
SELECT *
FROM emp
WHERE dno<>20 ;
compound condition :-
---------------------
SELECT *
FROM emp
WHERE ename='vijay' OR ename='sachin' ;
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 ;
SELECT *
FROM emp
WHERE hiredate >= '01-JAN-2020'
AND
hiredate <= '31-DEC-2020' ;
scenario :-
-----------
1
CUST
cid name age gender city
2
STUDENTS
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 ;
26-aug-22
IN operator :-
--------------
examples :-
-------------
SINGLE MULTI
= IN
<> NOT IN
BETWEEN operator :-
-------------------
Question :-
-----------
A ERROR
B RETURNS ROWS
C RETURNS NO ROWS
D NONE
ANS :- C
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
SELECT *
FROM cust
WHERE gender='m'
AND
city IN ('hyd','blr','mum')
AND
age BETWEEN 20 AND 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 :-
----------------
wildcard chars :-
-----------------
DD-MON-YY
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
=> above query returns all the customer records because "_"
is treated as wildcard char , to overcome this problem
use escape character.
IS operator :-
-----------------
USER_TABLES :-
--------------
ALL_USERS :-
------------
ALIAS :-
--------
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
INSERT
UPDATE
DELETE
INSERT ALL
MERGE
UPDATE command :-
------------------
EX :-
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' ;
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 :-
-----------------
ex :-
FLASHBACK :-
------------
SELECT *
FROM emp
AS OF TIMESTAMP (SYSDATE - INTERVAL '5' MINUTE);
step 1 :-
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.
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.
Question 1 :-
-------------
Question 2 :-
------------
ALTER command :-
---------------
1 add columns
2 drop columns
3 rename column
4 modify a column
incr/decr field size
changing datatype
Adding columns :-
-------------------
=> after adding by default the new column is filled with NULLs,
use update command to insert data into the new column.
Droping column :-
------------------
renaming a column :-
--------------------
rename alias
Modifying a column :-
--------------------
DROP command :-
---------------
ex :-
=> 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.
SQL>SHOW RECYCLEBIN ;
FLASHBACK command :-
---------------------
=> table is restored with columns and rows that exists before drop.
PURGE command :-
----------------
=> 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.
=> 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
DELETE VS TRUNCATE :-
----------------------
DELETE TRUNCATE
6 slower faster
RENAME :-
---------
ex :-
====================================================================================
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
1 NOT NULL
2 UNIQUE
3 PRIMARY KEY
4 CHECK
5 FOREIGN KEY
6 DEFAULT
1 column level
2 table level
column level :-
---------------
NOT NULL :-
-----------
UNIQUE :-
---------
PRIMARY KEY :-
---------------
Example :-
=> because primary key doesn't allow duplicates & nulls so using
primary key column we can uniquely identify the records.
candidate key :-
----------------
ex :-
VEHICLE
VEHNO NAME MODEL PRICE CHASSISNO
=> while creating table seconday keys are declared with UNIQUE & NOT NULL
03-sep-22
CHECK :-
----------
syntax :- CHECK(condition)
MOD(10,2) => 0
MOD(10,3) => 1
FOREIGN KEY :-
----------------
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.
05-sep-22
Types of Relationships :-
------------------------
=> 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.
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
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
=> while inserting if we skip hiredate then oracle inserts default value.
empid hiredate
100 05-SEP-22
101 01-JAN-22
102
06-SEP-22
ACCOUNTS
ACCNO ACTYPE BAL
RULES :-
--------
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
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.
PRODUCTS
prodid pname mfd_dt exp_dt
100 A 06-sep-22 01-jan-22 => invalid
=> 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
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 ??? ??
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
A UNIQUE
B CHECK
C NOT NULL
D PRIMARY KEY
E FOREIGN KEY
ANS :- C
07-sep-22
add check constraint to emp table with cond sal >= 3000 ?
NOVALIDATE :-
-------------
=> add foreign key to dno that references dept table primary key
i.e. dno ?
USER_CONSTRAINTS :-
-------------------
CONSTRAINT_NAME
CONSTRAINT_TYPE
TABLE_NAME
SEARCH_CONDITION
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
Droping constraints :-
----------------------
NOTE :-
CASCADE option :-
-----------------
08-SEP-22
DELETE RULES :-
---------------
1 ON DELETE NO ACTION (DEFAULT)
2 ON DELETE CASCADE
3 ON DELETE SET NULL
=> delete rules specifies how child rows are affected if parent
row is deleted.
ON DELETE NO ACTION :-
----------------------
SCENARIO :-
-----------
ACCOUNTS
ACCNO BAL
100 10000
101 20000
LOANS
ID TYPE AMT ACCNO
1 H 30 100
2 C 10 100
ON DELETE CASCADE :-
---------------------
=> if parent row is deleted , along with parent child rows are
also deleted.
SCENARIO :-
-----------
ACCOUNTS
ACCNO BAL
100 10000
101 20000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
1 W 20/ 1000 100
2 D 25/ 2000 100
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
SUMMARY :-
==================================================================
Types of Functions :-
---------------------
1 STRING
2 MATHEMATICAL
3 DATE
4 CONVERSION
5 SPECIAL
6 ANALYTICAL
7 AGGREGATE
STRING functions :-
-------------------
UPPER() :-
----------
UPPER(arg)
what is DUAL ?
LOWER() :-
----------
LOWER(arg)
INITCAP() :-
------------
INITCAP(arg)
LENGTH() :-
----------
LENGTH(arg)
LENGTH('hello') => 5
09-SEP-22
SUBSTR() :-
-----------
=> used to extract part of the string starting from specific position
SUBSTR(string,start,[length])
***
****
*****
scenario :-
ACCOUNTS
ACCNO
123456789428
LPAD('X',4,'X')||SUBSTR(ACCNO,-4,4)
'A'||'B' => AB
REPLACE() :-
------------
REPLACE(str1,str2,str3)
TRANSLATE() :-
--------------
=> used to translate one char to another char
TRANSLATE(str1,str2,str3)
e => a
l => b
o => c
hello #5*%y!
SELECT ENAME,
TRANSLATE(SAL,'0123456789','$Bt*p@H^k%') as sal
FROM emp ;
o/p :- hello
SELECT
REPLACE(
TRANSLATE('@#he%*ll^$o@^','@#%*^$','******'),'*','')
FROM DUAL ;
=================================================================
10-sep-22
MATHEMATICAL FUNCTIONS :-
-------------------------
MOD(NUM1,NUM2)
MOD(10,2) => 0
SELECT *
FROM emp
WHERE MOD(sal,100)=0 ;
ROUNDING NUMBERS :-
------------------
ROUND
TRUNC
CEIL
FLOOR
38.5678 => 39
38.56
38.567
ROUND :-
--------
ROUND(number,[decimal places])
ROUND(38.5678) => 39
38----------------38.5------------------39
300------------------350--------------------400
380------------------385----------------------390
ROUND(386,-3) => 0
0--------------------500--------------------1000
TRUNC :-
---------
TRUNC(number,[decimal places])
TRUNC(38.9) => 38
38------------------------39
300---------------------400
CEIL() :-
---------
CEIL(number)
CEIL(3.1) => 4
FLOOR() :-
---------
FLOOR(number)
FLOOR(3.9) => 3
===================================================================
DATE FUNCTIONS :-
-----------------
ADD_MONTHS() :-
--------------
ADD_MONTHS(DATE,MONTHS)
SCENARIO :-
-----------
GOLD_RATES
DATEID RATE
01-JAN-16 ?
02-JAN-16 ?
10-SEP-22 ?
answers :-
---------
MONTHS_BETWEEN() :-
------------------
MONTHS_BETWEEN(DATE1,DATE2)
MONTHS_BETWEEN(SYSDATE,'10-SEP-21') => 12
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)) AS EXPR
FROM EMP ;
12-sep-22
SELECT ENAME,
FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) AS YEARS,
MOD(FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)),12) AS MONTHS
FROM EMP ;
LAST_DAY() :-
--------------
LAST_DAY(DATE)
SELECT ADD_MONTHS(LAST_DAY(SYSDATE),-1)+1
FROM DUAL ;
==================================================================
Conversion Functions :-
------------------------
implicit conversion :-
---------------------
example 1 :-
example 2 :-
explicit conversion :-
----------------------
1 TO_CHAR
2 TO_DATE
3 TO_NUMBER
TO_CHAR(DATE,FORMAT) (DATE=SYSDATE)
FORMATS :-
-----------
YYYY 2022
YY 22
YEAR TWENTY TWENTY-TWO
MM 09
MON SEP
MONTH SEPTEMBER
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
output :-
09/12/2022 12:19:15
SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'d') IN (1,7) ;
SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'mm') IN (1,4,12) ;
SELECT *
FROM emp
WHERE TO_CHAR(hiredate,'yyyy') = 1981
AND
TO_CHAR(hiredate,'q') = 2 ;
14-sep-22
SELECT *
FROM emp
WHERE MOD(TO_CHAR(hiredate,'YYYY'),4) = 0 ;
TO_CHAR(NUMBER,'FORMAT')
Formats :-
----------
9 represents a digit
0 represents a digit
G thousand seperator
D decimal seperator
L currency symbol
C currency
smith $800
allen $1,600
SQL> SELECT
TO_CHAR(TO_DATE('15-AUG-1947','DD-MON-YYYY'),'DAY')
FROM DUAL ;
O/P :- FRIDAY
TO_NUMBER(NUMERIC STRING,'FORMAT')
Examples :-
------------
SQL>SELECT 1000 + '5,000' FROM DUAL ; => ERROR
SELECT
TO_NUMBER('$6,000','L9G999') + TO_NUMBER('USD5,000','C9G999')
FROM DUAL ;
O/P :- 11000
15-sep-22
Special Functions :-
--------------------
NVL() :-
--------
NVL(arg1,arg2)
ASCII() :-
----------
ASCII(CHAR)
ASCII('A') => 65
ASCII('a') => 97
CHR() :-
---------
CHR(ASCII VALUE)
CHR(65) => A
CHR(97) => a
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 ;
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL<=10 ;
for(level=1;level<=10;level++)
{
print level;
}
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;
}
1 ?
2 ?
65 A
97 a
255 ?
SELECT LEVEL,CHR(LEVEL)
FROM DUAL
CONNECT BY LEVEL<=255;
SELECT LPAD('*',LEVEL,'*')
FROM DUAL
CONNECT BY LEVEL<=10 ;
*
**
***
**********
*
***
*****
*******
input :- NARESH
output :-
N
A
R
E
S
H
INPUT :- NARESH
output :-
N
NA
NAR
NARE
NARES
NARESH
01-JAN-23 ?
02-JAN-23 ?
31-DEC-23 ?
16-sep-22
Analytical Functions :-
-----------------------
=> 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 ;
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 ;
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 ?
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.
SELECT ename,sal,deptno,
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rnk
FROM emp ;
ROW_NUMBER() :-
---------------
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
=> These functions process group of rows and returns one value
MIN(arg)
SUM(arg)
29000---------29050----------29100
SELECT TO_CHAR(ROUND(SUM(sal),-2),'L99G999')
FROM emp ;
o/p :- $29,000
SELECT SUM(sal)
FROM emp
WHERE job='MANAGER' ;
=> display totsal and include comm ?
SUM(SAL) = 12000
SUM(SAL+COMM) = 3500
SUM(SAL) = 12000
SUM(SAL+NVL(COMM,0)) = 12500
AVG(arg)
COUNT(*) :-
-----------
SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate,'yyyy')=1981;
SELECT COUNT(*)
FROM emp
WHERE TO_CHAR(hiredate,'dy') = 'sun'
d 1
dy sun
day sunday
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
1 CASE statement
2 DECODE function
CASE statement :-
------------------
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
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 ;
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 like
> < >= <= between in like etc.
CASE
WHEN COND1 THEN RETURN EXPR1
WHEN COND2 THEN RETURN EXPR2
----------
ELSE RETURN EXPR
END
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) 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 :-
----------------------------------
Example :-
=========================================================================
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 ;
Examples :-
------------
SELECT *
FROM emp
ORDER BY ename ASC ;
=> arrange employee list sal wise desc order ?
SELECT *
FROM emp
ORDER BY sal DESC ;
NOTE :-
--------
SELECT *
FROM emp
ORDER BY 6 DESC ;
=> above query sorts data based on 6th column i.e. sal.
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
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
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
4 D 6000 10 MANAGER
5 E 5000 20 CLERK
2 B 4000 10 MANAGER
1 A 3000 20 CLERK
=====================================================================
DISTINCT clause :-
-----------------
JOB
---------
CLERK
SALESMAN
ANALYST
MANAGER
PRESIDENT
DEPTNO
----------
30
10
20
DEPTNO JOB
---------- ---------
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
GROUP BY clause :-
-------------------
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
syntax :- Execution :-
--------
examples :-
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
JOB COUNT(*)
--------- ----------
CLERK 4
SALESMAN 4
ANALYST 2
MANAGER 3
PRESIDENT 1
21-SEP-22
YEAR COUNT(*)
---- ----------
1981 10
1983 1
1980 1
1982 2
SELECT deptno,COUNT(*)
FROM emp
WHERE COUNT(*) > 3
GROUP BY deptno ; => ERROR
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno
HAVING COUNT(*) > 3 ;
SCENARIO :-
------------
PERSONS
AADHARNO NAME AGE GENDER ADDR CITY STATE
SELECT STATE,COUNT(*)
FROM PERSONS
WHERE STATE IN ('AP','TS','KA','KL,'TN')
GROUP BY STATE
HAVING COUNT(*) > 50000000 ;
WHERE VS HAVING :-
-------------------
WHERE HAVING
=> 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
=> both functions are used to display subtotals and grand total
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
CUBE :-
------
10 CLERK 1430
MANAGER 2940
PRESIDENT 5250
9620 => subtotal
Assignment :-
--------------
PERSONS
AADHARNO NAME AGE GENDER ADDR CITY STATE
1-20 ?
21-40 ?
41-60 ?
>60 ?
============================================================================
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 :-
Types of joins :-
----------------
=> 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
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
=> 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
SELECT columns
FROM tablenames
WHERE join cond1
AND
join cond2
AND
join cond3 ;
example :-
----------
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 ;
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' ;
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
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
=> 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
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 ;
SELECT E.ENAME,D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;
SELECT E.ENAME,D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO ;
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
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
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 ;
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 ;
SELECT columns
FROM tab1 JOIN tab2
ON join cond
JOIN tab3
ON join cond ;
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 :-
------------
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
B A
C A
D B
E C
26-sep-22
ANSI style :-
------------
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
IND VS AUS
IND VS RSA
AUS VS RSA
Assignment :-
--------------
=> cross join returns cross product or cartesian product of two tables
A = 1,2
B = 3.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 ;
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
1 SELECT p.category,SUM(s.amount)
FROM sales s INNER JOIN products p
ON s.prodid = p.prodid
GROUP BY p.category ;
=====================================================================================
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 :-
--------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
UNION :-
--------
ANALYST
CLERK
MANAGER
SALESMAN
ANALYST 3150
CLERK 880
CLERK 1045
CLERK 1210
MANAGER 3000
MANAGER 3420
SALESMAN 1437.5
SALESMAN 1725
SALESMAN 1840
UNION JOIN
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
1 A 10
2 B 20
10 K 10
11 D 20
SELECT E.*,D.*
FROM EMP_US E INNER JOIN DEPT D
ON E.DNO = D.DNO ;
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 :-
------------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
3 slower faster
INTERSECT :-
-----------
=> returns common values from the output of two select statements.
CLERK
MANAGER
MINUS :-
--------
=> returns values present in 1st query output and not present in
2nd query output
Question :-
-------------
T1 T2
F1 C1
1 1
2 2
3 3
10 40
20 50
30 60
1 INNER JOIN
2 LEFT OUTER JOIN
3 RIGHT OUTER JOIN
4 FULL OUTER JOIN
5 UNION
6 UNION ALL
7 INTERSECT
8 MINUS
============================================================================
Types of 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 :-
SELECT *
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename='BLAKE') ;
SELECT *
FROM emp
WHERE hiredate < (SELECT hiredate
FROM emp
WHERE ename='KING');
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