SQL Full Class Notes
SQL Full Class Notes
=> update the employee sal with 2000 and comm with 500
whose empno=7369 ?
UPDATE emp
SET sal=2000 , comm=500
WHERE empno=7369
UPDATE emp
SET sal = sal + (sal*0.2) , comm = comm + (comm*0.1)
WHERE job='SALESMAN'
AND
hiredate LIKE '1981%'
scenario :-
PRODUCTS
prodid pname price category brand
UPDATE products
SET price = price + (price*0.1)
WHERE category='mobile phones'
AND
brand IN ('samsung','redmi','realme')
DELETE command :-
------------------
CREATE
ALTER
DROP
TRUNCATE
1 add columns
2 drop column
3 modify a column
incr/decr field size
changing datatype
Adding column :-
----------------
Droping column :-
-----------------
Modifying a column :-
----------------------
30-SEP-22
DROP command :-
---------------
TRUNCATE command :-
-------------------
=> deletes all the data from table but keeps structure.
=> will empty the table.
=> releases memory allocated for table.
=> when truncate command is executed sql server goes to memory and
releases all the pages allocated for table , when pages are
released then data stored in the pages also deleted.
DELETE VS TRUNCATE :-
---------------------
DELETE TRUNCATE
1 DML DDL
5 slower faster
SP_RENAME 'oldname','newname'
SP_RENAME 'EMP','EMPLOYEES'
SP_RENAME 'EMPLOYEES.COMM','BONUS'
IDENTITY :-
-----------
syn :- IDENTITY(SEED,INCR)
example :-
CID NAME
100 A
101 B
102 C
DELETE VS TRUNCATE :-
--------------------
DELETE TRUNCATE
CUST CUST
CID NAME CID NAME
100 100
101 101
102 102
01-oct-22
DBCC CHECKIDENT(tablename,reseed,value)
EX :- DBCC CHECKIDENT('CUST',RESEED,99)
NOTE :-
-------
=> by default sql server will not allow explicit value into identity
column
CID NAME
200 B
=====================================================================
Types of functions :-
----------------------
1 DATE
2 STRING
3 MATHEMATICAL
4 CONVERSION
5 SPECIAL
6 ANALYTICAL
7 AGGREGATE
DATE functions :-
-----------------
1 GETDATE() :-
--------------
2 DATEPART() :-
----------------
DATEPART(INTERVAL,DATE)
1 SUNDAY
7 SATURDAY
1 JAN-MAR
2 APR-JUN
3 JUL-SEP
4 OCT-DEC
SELECT *
FROM emp
WHERE DATEPART(mm,hiredate) IN (1,4,12)
SELECT *
FROM emp
WHERE DATEPART(yy,hiredate)%4=0
SELECT *
FROM emp
WHERE DATEPART(DW,hiredate)=1
SELECT *
FROM emp
WHERE DATEPART(yy,hiredate) = 1981
AND
DATEPART(qq,hiredate) = 2
FORMAT :-
---------
FORMAT(date,'format')
2022-10-01 = 2022-10-01
10-oct-22 :-
DATENAME() :-
--------------
MM DW
DATEPART 10 2
DATEDIFF() :-
--------------
DATEDIFF(interval,date1,date2)
SELECT ENAME,
DATEDIFF(MM,HIREDATE,GETDATE())/12 AS YEARS,
DATEDIFF(MM,HIREDATE,GETDATE())%12 AS MONTHS
FROM EMP
SELECT *
FROM emp
WHERE DATEDIFF(yy,hiredate,GETDATE()) > 40
DATEADD() :-
------------
DATEADD(interval,int,date)
SELECT DATEADD(DD,10,GETDATE()) => 2022-10-20
SELECT DATEADD(DD,-10,GETDATE()) => 2022-09-30
SELECT DATEADD(MM,2,GETDATE()) => 2022-12-10
SCENARIO :-
-----------
GOLD_RATES
DATEID RATE
2015-01-01 ??
2015-01-02 ??
2022-10-09 ??
2022-10-10 ??
EOMONTH() :-
-----------
=> returns end of the month i.e. last day of the month
EOMONTH(DATE,INT)
Questions :-
-----------
STRING functions :-
--------------------
UPPER() :-
----------
UPPER(arg)
LOWER() :-
----------
LOWER(arg)
11-oct-22
LEN() :-
-----------
LEN(arg)
SELECT *
FROM emp
WHERE ename LIKE '_____'
WHERE LEN(ename)=5
SUBSTRING() :-
---------------
SUBSTRING(string,start,length)
SELECT empno,ename,
LEFT(ename,3) + LEFT(empno,3) + '@tcs.com' as emailid
FROM emp
UPDATE emp
SET emailid = LEFT(ename,3) + LEFT(empno,3) + '@tcs.com'
REPLICATE() :-
--------------
REPLICATE(char,len)
scenario :-
------------
ACCOUNTS
ACCNO
1234567891234
REPLICATE('X',4) + RIGHT(ACCNO,4)
REPLACE() :-
------------
REPLACE(str1,str2,str3)
TRANSLATE() :-
--------------
TRANSLATE(str1,str2,str3)
e => a
l => b
o => c
SELECT ename,
TRANSLATE(sal,'0123456789.','$hP*t&U@#%^') as sal
FROM emp
Assignment :-
output :- hello
2
CUST
CID NAME
10 sachin tendulkar
11 virat kohli
12-oct-22
CHARINDEX() :-
--------------
CHARINDEX(char,string,[start])
SELECT *
FROM emp
WHERE CHARINDEX('a',ename) <> 0
MATHEMATICAL FUNCTIONS :-
-------------------------
POWER(3,2) => 9
SQRT(16) => 4
SQUARE(5) => 25
ABS(-10) => 10
ABS(10) => 10
SIGN(10) => 1
SIGN(-10) => -1
SIGN(10-10) => 0
6 rounding numbers :-
ROUND :-
---------
ROUND(number,decimal places)
ROUND(38.5678,0) => 39
38-----------------38.5-------------------39
300---------------350------------------400
380---------------385-------------------390
ROUND(386,-3) => 0
0------------------500---------------------1000
SELECT ROUND(4567,-1),ROUND(4567,-2),ROUND(4567,-3)
CEILING() :-
------------
CEILING(number)
FLOOR() :-
----------
FLOOR(number)
conversion functions :-
------------------------
=> used to convert one datatype to another datatype
1 CAST
2 CONVERT
CAST :-
--------
CAST(source-expr as target-type)
SELECT ename + ' earns ' + sal FROM emp => ERROR
SELECT ename + ' joined on ' + CAST(hiredate AS VARCHAR) + ' as ' + job FROM
emp
CONVERT() :-
------------
CONVERT(TARGET-TYPE,SOURCE-EXPR)
CONVERT(VARCHAR,DATE,STYLE-NUMBER)
display ENAME,HIREDATE ?
display hiredate in mm/dd/yyyy format ?
FORMAT :-
----------
FORMAT(DATE,FORMAT)
13-oct-22
CONVERT(VARCHAR,MONEY/SMALLMONEY,STYLE-NUMBER)
SMITH 800.00
ALLEN 1,600.00
special functions :-
--------------------
ISNULL() :-
-----------
ISNULL(arg1,arg2)
SELECT ENAME,SAL,
ISNULL(CAST(COMM AS VARCHAR),'NO COMM') AS COMM
FROM EMP
Analytical Functions / window functions :-
-------------------------------------------
=> display ranks of the employees based on sal and highest paid
employee should get 1st rank ?
SELECT EMPNO,ENAME,SAL,
RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP
1 rank function generates gaps but dense_rank will not generate gaps.
SELECT ename,hiredate,sal,
DENSE_RANK() OVER (ORDER BY sal DESC,hiredate ASC) as rnk
FROM emp
Assignment :-
------------
STUDENT
SNO SNAME M P C
1 A 80 90 70
2 B 60 50 40
3 C 90 80 70
4 D 90 70 80
=> find ranks of the students based on total 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 and apply
rank functions on each dept instead of applying it on whole table.
SELECT ename,sal,deptno,
dense_rank() over (partition by deptno
order by sal desc) as rnk
FROM emp
king 5000.00 10 1
clark 2450.00 10 2
miller 1300.00 10 3
ford 3000.00 20 1
scott 3000.00 20 1
jones 2975.00 20 2
adams 1100.00 20 3
14-oct-22
ROW_NUMBER() :-
----------------
SELECT EMPNO,ENAME,SAL,
ROW_NUMBER() OVER (ORDER BY SAL DESC) AS RNO
FROM EMP
AGGREGATE FUNCTIONS :-
----------------------
=> these functions process group of rows and returns one value.
MAX() :-
--------
MAX(arg)
MIN() :-
--------
MIN(arg)
SUM() :-
---------
SUM(arg)
29000------------29050-----------------29100
SELECT
CONVERT(VARCHAR,ROUND(SUM(SAL),-2),1)
FROM EMP
SELECT SUM(SAL)
FROM EMP
WHERE JOB='MANAGER'
SUM(SAL+COMM) = 4500
SUM(SAL) = 12000
AVG() :-
--------
AVG(arg)
COUNT(*) :-
-----------
NOTE :-
15-oct-22
date :- getdate,datepart,datename,dateadd,datediff,eomonth
string :- upper,lower,len,left,right,substring,charindex,
replicate,replace,translate
math :- power,sqrt,square,abs,sign,round,ceiling,floor
conv :- cast,convert
special :- isnull
analytical :- rank,dense_rank,row_number
aggregate :- min,max,sum,avg,count
CASE statement :-
-----------------
1 simple case
2 searched case
simple case :-
---------------
SELECT ENAME,
CASE DEPTNO
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'RESEARCH'
WHEN 30 THEN 'SALES'
ELSE 'UNKNOWN'
END AS DNAME
FROM EMP
UPDATE EMP
SET SAL = CASE JOB
WHEN 'CLERK' THEN SAL+(SAL*0.1)
WHEN 'SALESMAN' THEN SAL+(SAL*0.15)
WHEN 'MANAGER' THEN SAL+(SAL*0.2)
ELSE SAL+(SAL*0.05)
END
searched case :-
-----------------
=> use searched case when conditions not based on "=" operator.
CASE
WHEN COND1 THEN RETURN EXPR1
WHEN COND2 THEN RETURN EXPR2
-----------
ELSE RETURN EXPR
END
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,SNAME,
S1+S2+S3 AS TOTAL,
(S1+S2+S3)/3 AS AVG,
CASE
WHEN S1>=35 AND S2>=35 AND S3>=35 THEN 'PASS'
ELSE 'FAIL'
END AS RESULT
FROM EMP
17-oct-22
GROUP BY clause :-
------------------
=> GROUP BY clause used to group rows based on one or more columns
to calculate min,max,sum,avg,count for each group.
emp
empno ename sal deptno
1 A 5000 10
2 B 4000 20 GROUP BY 10 8000
3 C 6000 30=====================> 20 9000
4 D 5000 20 30 6000
5 E 3000 10
syntax :-
---------
SELECT columns
FROM tabname
[WHERE cond]
GROUP BY <colname>,-----
[HAVING cond]
[ORDER BY <colname> ASC/DESC,---]
execution :-
----------
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
FROM emp :-
-----------
emp
empno ename sal deptno
1 A 5000 10
2 B 4000 20
3 C 6000 30
4 D 5000 20
5 E 3000 10
GROUP BY deptno :-
-------------------
10
1 A 5000
5 E 3000
20
2 B 4000
4 D 5000
30
3 C 6000
10 8000
20 9000
30 6000
1980 1
1981 10
1982 2
1983 1
April 1
December 2
February 2
June 1
May 1
November 1
September 2
SELECT deptno,COUNT(*)
FROM emp
WHERE COUNT(*) > 3
GROUP BY deptno => ERROR
=> SQL SERVER 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
FROM emp :-
-----------
emp
empno ename sal deptno
1 A 5000 10
2 B 4000 20
3 C 6000 20
4 D 5000 20
5 E 3000 10
6 F 2000 20
GROUP BY deptno :-
-------------------
10
1 A 5000
5 E 3000
20
2 B 4000
3 C 6000
4 D 5000
6 F 2000
20
2 B 4000
3 C 6000
4 D 5000
6 F 2000
SELECT deptno,COUNT(*) :-
--------------------------
20 4
18-oct-22
SELECT job,COUNT(*)
FROM emp
WHERE job IN ('clerk','manager')
GROUP BY job
HAVING COUNT(*) > 3
scenario :-
----------
PERSONS
AADHARNO NAME GENDER AGE ADDR CITY STATE
=> find the southern states having more than 5cr population ?
SELECT state,COUNT(*)
FROM persons
WHERE state IN ('AP','TS','KL','KA','TN')
GROUP BY state
HAVING COUNT(*) > 50000000
WHERE VS HAVING :-
-------------------
WHERE HAVING
10 CLERK 1430.00 1
10 MANAGER 2940.00 1
10 PRESIDENT 5250.00 1
20 ANALYST 6300.00 2
20 CLERK 2090.00 2
20 MANAGER 3570.00 1
30 CLERK 1045.00 1
30 MANAGER 3420.00 1
30 SALESMAN 6440.00 4
=> both functions are used to display subtotals and grand total
GROUP BY ROLLUP(COL1,COL2,---)
GROUP BY CUBE(COL1,COL2,-----)
ROLLUP :-
----------
=> rollup displays subtotals for each group and also displays grand total
10 CLERK 1430.00 1
10 MANAGER 2940.00 1
10 PRESIDENT 5250.00 1
10 NULL 9620.00 3 => SUBTOTAL
20 ANALYST 6300.00 2
20 CLERK 2090.00 2
20 MANAGER 3570.00 1
20 NULL 11960.00 5 => SUBTOTAL
CUBE :-
--------
scenario :-
-----------
PERSONS
AADHARNO NAME GENDER AGE ADDR CITY STATE
=> display state wise and with in state gender wise population
and display state wise and gender wise subtotals ?
SELECT state,gender,count(*)
FROM persons
GROUP BY CUBE(state,gender)
ORDER BY state ASC,gender ASC
AP MALE ?
FEMALE ?
? => state subtotal
TS MALE ?
FEMALE ?
19-oct-22
GROUPING_ID() :-
----------------
GROUPING_ID(deptno,job)
summary :-
importance of group by
where vs having clause
rollup & cube
grouping_id
======================================================================
Integrity Constraints :-
------------------------
1 NOT NULL
2 UNIQUE
3 PRIMARY KEY
4 CHECK
5 FOREIGN KEY
6 DEFAULT
1 column level
2 table level
column level :-
---------------
=> if constraints are declared immediately after declaring column
then it is called column level.
NOT NULL :-
------------
example :-
UNIQUE :-
---------
example :-
PRIMARY KEY :-
--------------
example :-
-----------
=> because empid doesn't allow duplicates and nulls so using empid
we can uniquely identify the employees.
20-oct-22
candidate key :-
----------------
VEHICLE
VEHNO VNAME MODEL PRICE CHASSISNO
=> while creating table secondary keys are declared with UNIQUE & NOT NULL.
CHECK :-
--------
=> use check constraint when rule based on condition.
CHECK(condition)
EMAILID VARCHAR2(30)
CHECK(EMAILID LIKE '%@%'
AND
(
EMAILID LIKE '%.COM'
OR
EMAILID LIKE '%.CO'
OR
EMAILID LIKE '%.IN'
))
FOREIGN KEY :-
-------------
PROJECTS
projid name duration cost client
100 A 5 YEARS 300 TATA MOTORS
101 B 4 YEARS 250 DBS BANK
102 C 3 YEARS 200 L&T
EMP
empid ename sal projid REFERENCES PROJECTS(PROJID)
1 K 4000 100
2 J 5000 101
3 D 3000 999 => INVALID
4 V 2000 100
5 M 3000 NULL
=> values entered in foreign key column should match with values
entered in primary key column.
Assignment :-
ACCOUNTS
ACCNO ACTYPE BAL
Rules :-
--------
TRANSACTIONS
TRID TTYPE TAMT TDATE ACCNO
Rules :-
-------
Types of Relationships :-
-------------------------
example :- (1:1)
----------
DEPT
DNO DNAME
10 HR
20 IT
MGR
MGRNO MNAME DNO REFERENCES DEPT(DNO) UNIQUE
1 A 10
2 B 20
3 C 10 => INVALID
=> in the above example one dept is managed by one manager and
one manager manages one dept so relationship between two
tables is 1:1
example :-
----------
PRODUCTS CUSTOMERS
prodid pname price cid name addr
100 A 1000 10 X HYD
101 B 2000 11 K HYD
=> relationship between products and customer is many to many
because one product can be purchased by many customers and
one customer can purchase many products.
=> to establish many to many, create 3rd table and add primary keys
of both tables as foreign keys
SALES
DATEID PRODID CUSTID QTY AMOUNT
15/ 100 10
15/ 100 11
15/ 101 10
22-oct-22
2 entities tables
3 attributes fields
BANK
CCODE NAME ADDR
-----
BRANCH
BRANCH_ID NAME ADDR CCODE(FK)
---------
LOANS
LOAN_ID LOAN_TYPE AMOUNT BRANCH_ID(FK) CUSTID(FK)
-------
ACCOUNTS
ACCNO ACTYPE BAL BRANCH_ID(FK) CUSTID(FK)
------
CUSTOMERS
CUSTID NAME PHONE ADDR
------
DEFAULT :-
----------
empno hiredate
100 2022-10-22
101 2022-01-01
102 NULL
TABLE LEVEL :-
--------------
PRODUCTS
prodid pname mfd_dt exp_dt
100 A 2022-10-22 2022-01-01 => INVALID
example :-
STUDENT COURSE
SID NAME CID NAME
--- ----
1 A 10 SQL
2 B 11 .NET
REGISTRATIONS
SID CID DOR FEE
1 10 ? ?
1 11 ? ?
2 10 ? ?
25-oct-22
composite foreign key :-
------------------------
REGISTRATIONS
SID CID DOR FEE
----------
1 10 ? ?
1 11 ? ?
2 10 ? ?
CERTIFICATES
CERTNO DOI SID CID
1000 ? 1 10
1001 ? 1 11
1002 ? 2 11 => INVALID
A UNIQUE
B CHECK
C NOT NULL
D PRIMARY KEY
E FOREIGN KEY
ANS :- C
=> because some of the employee salaries are less than 3000
while adding constraint sql server also validates
existing data
WITH NOCHECK :-
---------------
=> if check constraint added with "WITH NOCHECK" then sql server
will not validate existing data and it validates new data.
=> primary key can be added only to not null column but cannot be
added nullable column.
=> add foreign key to dno that references dept table primary key
i.e. deptno ?
Droping constraints :-
----------------------
EX :-
DELETE rules :-
----------------
ON DELETE NO ACTION :-
----------------------
scenario :-
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
LOANS
ID TYPE AMT ACCNO
1 H 30 100
2 C 10 100
ON DELETE CASCADE :-
--------------------
scenario :-
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO REFERENCES ACCOUNTS(ACCNO)
1 W ? 2000 100 ON DELETE CASCADE
2 D ? 5000 100
EMPNO DNO
1 NULL
2 NULL
scenario :-
------------
PROJECTS
projid pname duration
100
101
EMP
empid name projid
1 100
2 100
EMPNO DNO
1 20
2 20
update rules :-
---------------
ON UPDATE NO ACTION
ON UPDATE CASCADE
ON UPDATE SET NULL
ON UPDATE SET DEFAULT
summary :-
27-oct-22
JOINS :-
--------
=> join is an operation performed to fetch data from two or more tables
example :-
ORDERS CUSTOMERS
ordid orddt deldt 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 Inner join between the two tables there must be a
common field and name of the common field need not to be
same and pk-fk relationship is not compulsory.
SELECT columns
FROM tab1 INNER JOIN tab2
ON join condition
join condition :-
-----------------
=> based on the given join condition sql server joins the records of
two tables.
table1.commonfield = table2.commonfield
example :-
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 3000 10 10 ACCTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 3000 20 40 OPERATIONS
5 E 2000 NULL
SELECT ename,sal,dname,loc
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno
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.dname,d.loc
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno /* join condition */
WHERE d.loc = 'NEW YORK' /* filter condition */
28-oct-22
SELECT e.ename,
d.dname,
l.city,l.state,
c.country_name
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno
INNER JOIN locations l
ON d.locid = l.locid
INNER JOIN countries c
ON l.country_id = c.country_id
outer join :-
-------------
=> inner join returns only matching records but won't return
unmatched records but to display unmatched records perform
outer join.
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 3000 10 10 ACCTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 3000 20 40 OPERATIONS => unmatched
5 E 2000 NULL => unmatched
1 LEFT JOIN
2 RIGHT JOIN
3 FULL JOIN
LEFT 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 LEFT JOIN dept d
ON e.deptno = d.deptno
=> above query returns all rows from emp and matching rows from dept
A ACCT
B RESEARCH
C SALES
D ACCT
E NULL => unmatched from emp
RIGHT JOIN :-
------------
=> returns all rows from right side table and matching rows from
left side table.
SELECT e.ename,d.dname
FROM emp e RIGHT JOIN dept d
ON e.deptno = d.deptno
A ACCTS
B RESEARCH
C SALES
D RESEARCH
NULL OPERATIONS => unmatched from dept
FULL JOIN :-
-----------
SELECT e.ename,d.dname
FROM emp e FULL JOIN dept d
ON e.deptno = d.deptno
A ACCTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
NULL OPERATIONS => unmatched from dept
SELECT e.ename,d.dname
FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE d.dname IS NULL
E NULL
SELECT e.ename,d.dname
FROM emp e RIGHT 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 JOIN dept d
ON e.deptno = d.deptno
WHERE e.ename IS NULL
OR
dname IS NULL
E NULL
NULL OPERATIONS
29-oct-22
=> non equi join is performed between the tables not sharing a
common field.
EMP SALGRADE
EMPNO ENAME SAL GRADE LOSAL HISAL
1 A 3000 1 700 1000
2 B 1000 2 1001 2000
3 C 5000 3 2001 3000
4 D 2000 4 3001 4000
5 E 2500 5 4001 9999
SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP E JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
A 3000 3
B 1000 1
C 5000 5
D 2000 2
E 2500 3
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
A 3000 3
E 2500 3
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
execution :-
EMP SALGRADE
EMPNO ENAME DEPTNO SAL GRADE LOSAL HISAL
1 A 10 3000 1 700 1000
2 B 20 1000 2 1001 2000
3 C 30 5000 3 2001 3000
4 3001 4000
5 4001 9999
result :-
DEPT
EMPO ENAME DEPTNO SAL GRADE DEPTNO DNAME LOC
1 A 10 3000 3 10 ACCTS
2 B 20 1000 1 20 RESEARCH
3 C 30 5000 5 30 SALES
result :-
1 A 10 3000 3 ACCTS
2 B 20 1000 1 RESEARCH
3 C 30 5000 5 SALES
STEP 3 :- (SELECT)
A ACCTS 3
B RESEARCH 1
C SALES 5
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.
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
B A
C A
D B
31-oct-22
Question :-
-----------
TEAMS
ID COUNTRY
1 IND
2 AUS
3 NZ
IND VS AUS
IND VS NZ
AUS VS NZ
TEAMS A TEAMS B
ID COUNTRY ID COUNTRY
1 IND 1 IND
2 AUS 2 AUS
3 NZ 3 NZ
A.ID = B.ID A.ID <> B.ID A.ID > B.ID A.ID < B.ID
=> cross join returns cross product or cartesian product of two tables
A = 1,2
B = 3,4
=> if cross join performed between two tables then all the records
of 1st table joined with all the records of 2nd table.
=> to perform cross join submit the join query without join condition
SELECT e.ename,d.dname
FROM emp e CROSS JOIN dept d
FROM :-
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME LOC
1 A 3000 10 10 ACCTS NEW YORK
2 B 4000 20 20 RESEARCH
3 C 5000 30 30 SALES
4 D 3000 20 40 OPERATIONS
5 E 2000 10
ON e.deptno = d.deptno :-
---------------------------
1 A 3000 10 ACCTS
2 B 4000 20 RESEARCH'
3 C 5000 30 SALES
4 D 3000 20 RESEARCH
5 E 2000 10 ACCTS
GROUP BY d.dname :-
-------------------
ACCTS
1 A 3000
5 E 2000
RESEARCH
2 B 4000
4 D 3000
SALES
3 C 5000
ACCTS 5000
RESEARCH 7000
SALES 5000
Questions :-
------------
SALES
DATEID PRODID CUSTID QTY AMOUNT
2022-10-31 100 10 1 1000
PRODUCTS
PRODID PNAME PRICE CATEGORY
100 AAA 1000 ELECTRONICS
CUSTOMERS
CUSTID NAME ADDR COUNTRY
10 KK HYD IND
=======================================================================
SET operators :-
----------------
UNION
UNION ALL
INTERSECT
EXCEPT
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 EXCEPT B = 3,4
B EXCEPT A = 5,6
SELECT STATEMENT 1
UNION/UNION ALL/INTERSECT/EXCEPT
SELECT STATEMENT 2
01-NOV-22
Rules :-
UNION :-
---------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
ANALYST
CLERK
MANAGER
SALESMAN
UNION VS JOIN :-
----------------
UNION JOIN
scenario :-
------------
EMP_US
EMPNO ENAME DNO
100 A 10
101 B 20
DEPT
EMP_IND DNO DNAME
EMPNO ENAME DNO 10 HR
200 K 10 20 IT
201 X 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
INTERSECT :-
------------
=> returns common values from the output of two select statements
CLERK
MANAGER
EXCEPT :-
---------
=> returns values from 1st query output and not present in 2nd query
output
ANALYST
======================================================================
0 means 1900-01-01
DATEADD(interval,int,date)
Types of subqueries :-
---------------------
=> if inner query returns one value then it is called single row subquery
SELECT columns
FROM tabname
WHERE colname OP (SELECT STATEMENT)
03-nov-22
co-related subqueries :-
-------------------------
=> here execution starts from outer query and inner query is
executed no of times depends on no of rows return by outer query.
steps :-
--------
example 1 :-
----------
EMP
EMPNO ENAME SAL DEPTNO
1 A 3000 10
2 B 5000 20
3 C 4000 30
4 D 3000 20
5 E 6000 10
SELECT *
FROM emp a
WHERE sal > (SELECT AVG(sal)
FROM emp
WHERE deptno = a.deptno)
SELECT *
FROM emp a
WHERE sal = (SELECT MAX(sal)
FROM emp
WHERE deptno = a.deptno)
example 3 :-
-------------
EMP A EMP B
SAL SAL
5000 5000
1000 1000
3000 3000
2000 2000
4000 4000
DERIVED TABLES :-
-----------------
SELECT columns
FROM (SELECT statement) <alias>
WHERE cond
04-nov-22
=> by default sql sever executes the clauses in the following order
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
example 1 :-
-------------
SELECT *
FROM (SELECT ename,sal*12 as annsal FROM emp) AS E
WHERE annsal>20000
example 2 :-
------------
=> display ranks of the employees based on sal and highest paid
employee should get 1st rank ?
SELECT ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP
SELECT ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP
WHERE rnk<=5 => ERROR
SELECT *
FROM (SELECT ENAME,SAL,
DENSE_RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP ) AS E
WHERE RNK<=5
example 3 :-
SELECT *
FROM (SELECT empno,ename,sal,ROW_NUMBER() over (order by empno asc) as rno
FROM emp ) AS E
WHERE rno<=5
WHERE rno=5
WHERE rno%2=0
SELECT *
FROM (SELECT empno,ename,sal,ROW_NUMBER() over (order by empno asc) as rno
FROM emp ) AS E
WHERE rno>=(SELECT COUNT(*)-2 FROM EMP)
DELETE
FROM (SELECT empno,ename,sal,ROW_NUMBER() over (order by empno asc) as rno
FROM emp ) AS E
WHERE rno<=3 => ERROR
CTE :-
-------
WITH <name>
AS
(SELECT STATEMENT)
SELECT/INSERT/UPDATE/DELETE
Example :-
WITH E
AS
(SELECT empno,ename,
ROW_NUMBER() OVER (ORDER BY empno ASC) as rno
FROM emp)
DELETE FROM E WHERE rno<=5
05-nov-22
EMP66
ENO ENAME SAL
1 A 5000
2 B 6000
1 A 5000
2 B 6000
3 C 7000
step 1 :-
SELECT ENO,ENAME,SAL,
ROW_NUMBER() OVER (PARTITION BY ENO,ENAME,SAL
ORDER BY ENO ASC) AS RNO
FROM EMP66
1 A 5000 1
1 A 5000 2
2 B 6000 1
2 B 6000 2
3 C 7000 1
WITH E
AS
(SELECT ENO,ENAME,SAL,
ROW_NUMBER() OVER (PARTITION BY ENO,ENAME,SAL
ORDER BY ENO ASC) AS RNO
FROM EMP66)
DELETE FROM E WHERE RNO>1
Questions :-
-------------
1
T1
AMT
1000
-500
2000
-1000
3000
-800
OUTPUT :-
POS NEG
1000 -500
2000 -1000
3000 -800
2
T1 T2
F1 C1
1 A
2 B
3 C
OUTPUT :-
1 A
2 B
3 C
scalar subqueries :-
-------------------
=> use scalar subquery to show the query output in seperate column
example 1 :-
EMP DEPT
9 4
example 2 :-
example 3 :-
10 8750
20 7100
30 5300
10 8750 21150
20 7100 21150
30 5300 21150
Question :-
--------
PRODUCTS
prodid pname price category brand
SALES
dateid prodid custid qty amount
OUTPUT :-
07-nov-22
PIVOT operator :-
-----------------
example :-
10 20 30
ANALYST ?? ?? ??
CLERK ?? ?? ??
MANAGER ?? ?? ??
SALESMAN ?? ?? ??
syntax :-
SELECT columns
FROM (SELECT required data) AS <ALIAS>
PIVOT
(
AGGR-EXPR FOR COLNAME IN (V1,V2,V3,--)
) AS <ALIAS>
ORDER BY COLNAME ASC/DESC
example :-
SELECT *
FROM (SELECT deptno,job,sal FROM emp) AS E
PIVOT
(
SUM(sal) FOR deptno IN ([10],[20],[30])
) AS PIVOT_EXPR
ORDER BY job ASC
example 2 :-
------------
1 2 3 4
1980 ? ? ? ?
1981 ? ? ? ?
1982 ? ? ? ?
1983 ? ? ? ?
SELECT *
FROM (SELECT DATEPART(YY,HIREDATE) AS YEAR,
DATEPART(QQ,HIREDATE) AS QRT,
EMPNO
FROM EMP) AS E
PIVOT
(
COUNT(EMPNO) FOR QRT IN ([1],[2],[3],[4])
) AS PIVOT_EXPR
ORDER BY YEAR ASC
example 3 :-
STUDENT
SNO SNAME SUBJECT MARKS
1 A MAT 80
1 A PHY 50
1 A CHE 60
2 B MAT 70
2 B PHY 40
2 B CHE 50
output :-
SELECT *
FROM STUDENT
PIVOT
(
SUM(MARKS) FOR SUBJECT IN ([MAT],[PHY],[CHE]))
) AS PIVOT_EXPR
ORDER BY SNO ASC
UNPIVOT operator :-
--------------------
STUDENT
SNO SNAME MAT PHY CHE
1 A 80 90 70
2 B 60 50 40
OUTPUT :-
SELECT SNO,SNAME,SUBJECT,MARKS
FROM STUDENT
UNPIVOT
(
MARKS FOR SUBJECT IN ([MAT],[PHY],[CHE])
) AS UNPIVOT_EXPR
ORDER BY SNO ASC
======================================================================
=> the new table is created with rows and columns return by query
MERGE command :-
-----------------
E => EXTRACT
T => TRANSFORM
L => LOAD
syntax :-
08-nov-22
example :-
CUSTS
CID NAME ADDR
1 A HYD
2 B MUM
CUSTT
CID NAME ADDR
1 A HYD
2 B MUM
CUSTS
CID NAME ADDR
1 A BLR => UPDATED
2 B MUM
3 C DEL => INSERTED
=======================================================================
DB SECURITY :-
--------------
DB OBJECTS :-
-------------
TABLES
VIEWS
SYNONYMS
SEQUENCES
INDEXES
PROCEDURES
FUNCTIONS
TRIGGERS
VIEWS :-
---------
1 for security
2 to reduce complexity
1 simple views
2 complex views
simple views :-
----------------
example :-
CREATE VIEW V1
AS
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP
SELECT * FROM V1
=> when above query submitted to sql server it executes the
query as follows.
VIJAY :-
---------
1 SELECT * FROM V1
CREATE VIEW V2
AS
SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP
WHERE DEPTNO=20
=> user "VIJAY" can access only the employees belongs to 20th dept
complex views :-
-----------------
=> with the help of views complex queries are converted into simple
queries
Example 1 :-
=> after creating view whenever we want data from emp & dept tables
instead of writing join query write the simple query as follows
SELECT * FROM CV1
Example 2 :-
Droping view :-
--------------
DROP VIEW V1
=> if we drop base table what about views created on base table ?
WITH SCHEMABINDING :-
---------------------
=> if view created with "SCHEMABINDING" then sql server will not
users to drop base table if any view exists on the base table.
Rules :-
--------
CREATE VIEW V5
WITH SCHEMABINDING
AS
SELECT DEPTNO,DNAME,LOC FROM DBO.DEPT
10-NOV-22
SYNONYMS :-
------------
1 SELECT * FROM E
Question :-
------------
SP_RENAME 'EMP','E'
SYNONYM ALIAS
Droping synonym :-
----------------
DROP SYNONYM E
SEQUENCES :-
-------------
syntax :-
CREATE SEQUENCE <NAME>
[START WITH <VALUE>]
[INCREMENT BY <VALUE>]
[MAXVALUE <VALUE>]
[MINVALUE <VALUE>]
[CYCLE/NOCYCLE]
[CACHE <SIZE>]
example 1 :-
CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 5
SID NAME
1 A
2 B
3 C
4 D
5 E
CREATE SEQUENCE S2
START WITH 100
INCREMENT BY 1
MAXVALUE 999
example 3 :-
INVOICE
INVNO INVDT
NIT/1122/1 2022-11-10
/2
CREATE SEQUENCE S3
START WITH 1
INCREMENT BY 1
MAXVALUE 9999
INVNO INVDT
NIT/1122/1 2022-11-10 08:37:44.010
NIT/1122/2 2022-11-10 08:37:46.987
NIT/1122/3 2022-11-10 08:37:48.450
11-nov-22
CYCLE/NOCYCLE :-
----------------
=> if sequence created with NOCYCLE then it starts from start with
and generates upto max and after reaching max then it stops.
=> if sequence created with CYCLE then it starts from start with
and generates upto to max and after reaching max then it
reset to min
CREATE SEQUENCE S5
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE
CACHE 4
CACHE size :-
--------------
Droping sequence :-
------------------
DROP SEQUENCE S1
INDEXES :-
-----------
=> indexes are created on columns and that column is called index key
Types of Indexes :-
-------------------
1 Non Clustered
simple
composite
unique
2 Clustered
1 TABLE SCAN
2 INDEX SCAN
=> in table scan sql server scans complete table i.e. each and every
record but in index scan on avg sql server scans only half of the
table.
12-nov-22
composite index :-
------------------
EMP
DEPTNO JOB
20 CLERK
30 SALESMAN
10 MANAGER
20 ANALYST
30 SALESMAN
10 CLERK
20 CLERK
30 CLERK
20
10 30
UNIQUE INDEX :-
----------------
=> unique index doesn't allow duplicate values into the column
on which index is created.
G Q
CLUSTERED INDEX :-
-------------------
example :-
50
30 70
10 A 40 C 60 D 80 B
10 A
40 C
60 D
80 B
NOTE :-
SP_HELPINDEX <tabname>
ex :- SP_HELPINDEX EMP
Droping index :-
-----------------
SERVER
DATABASE
TABLES
ROWS & COLS
CONSTRAINTS
INDEXES
TRIGGERS
VIEWS
SYNONYMS
SEQUENCES
PROCEDURES
FUNCTIONS
======================================================================
1 improves performance :-
---------------------------
=> in TSQL, sql commands can be grouped into one block and we
submit that block to sql server , so in TSQL no of requests
and response between user and sql server are reduced and
performance is improved.
3 supports loops :-
-------------------
=> tsql supports looping statements like while , using loops we can
executes statements repeatedly multiple times.
=> in TSQL , if any statement causes error then we can handle that
error and we can display our own simple and user friendly
messages.
5 supports reusability :-
--------------------------
6 supports security :-
-----------------------
=> because these programs are stored in db so only authorized
users can execute these programs.
TSQL programming :-
--------------------
basic programming
conditional statements
loops
cursors
error handling
stored procedures
stored functions
triggers
dynamic sql
1 anonymous blocks
2 named blocks
stored procedures
stored functions
triggers
Anonymous blocks :-
-------------------
1 DECLARE
2 SET
3 PRINT
DECLARE statement :-
--------------------
ex :- DECLARE @x INT
DECLARE @s VARCHAR(10)
DECLARE @d DATE
SET statement :-
------------------
ex :- SET @x = 100
SET @s = 'abc'
SET @d = GETDATE()
PRINT statement :-
-------------------
PRINT 'hello'
PRINT @x
example 1 :-
example 2 :-
DECLARE @d DATE
SET @d = '2023-01-01'
PRINT DATENAME(dw,@d)
output :- sunday
1 DML (INSERT,UPDATE,DELETE,MERGE)
2 DQL (SELECT)
3 TCL (COMMIT,ROLLBACK,SAVETRANSACTION)
=> in tsql , we get data from db tables and copy that values into
variables declared in tsql program.
SELECT @var1=col1,
@var2=col2
FROM tabname
WHERE condition
example :-
16-nov-22
=> write a prog to input empno and print name & salary ?
conditional statements :-
-------------------------
1 IF-ELSE
2 MULTI-IF
3 NESETD-IF
IF-ELSE :-
----------
IF COND
BEGIN
STATEMENTS
END
ELSE
BEGIN
STATEMENTS
END
MULTI-IF :-
-----------
IF COND1
BEGIN
STATEMENTS
END
ELSE IF COND2
BEGIN
STATEMENTS
END
ELSE IF COND3
BEGIN
STATEMENTS
END
ELSE
BEGIN
STATEMENTS
END
NESTED-IF :-
------------
IF COND
BEGIN
IF COND
BEGIN
STATEMENTS
END
ELSE
BEGIN
STATEMENTS
END
END
ELSE
BEGIN
STATEMENTS
END
=> write a prog to input empno and increment sal by specific amount
and after increment if sal exceeds 5000 then cancel that
increment ?
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 S 20000
=> write a prog to transfer amount from one account to another account ?
NOTE :-
=> every transaction must gurantee a property called atomocity i.e. all or none
if transaction contains multiple operations if all are successful then it
must be
saved , if any of the operation fails then entire transaction must be
cancelled.
@@ROWCOUNT :-
------------------------
WHILE loop :-
-------------------
DECLARE @x int = 1
WHILE(@x<=20)
BEGIN
PRINT @x
SET @x = @x+1
END
2023-01-01 sunday
2023-01-02 ???
2023-12-31 ???
314469