SQL
SQL
Database :-
---------------
Types of Databases :-
------------------------------
=> organizations uses OLTP for storing day-to-day transactions and OLAP for
data analysis.
=> OLTP is for running business and OLAP is for to analyze business.
C create
R read
U update
D delete
DBMS :-
------------
USER------------------------DBMS----------DB
Evolution of DBMS :-
----------------------------
RDBMS :-
--------------
Information rule :-
-----------------------
=> according to information rule data must be organized in tables i.e. rows and
columns
CUSTOMERS
CID NAME ADDR => columns/fields/attributes
10 SACHIN MUM
11 RAHUL DEL
12 VIJAY HYD => row / record / tuple
=> every table must contain primary key to uniquely identify the records.
ex :- accno,empid,aadharno,panno,voterid
08-sep-23
RDBMS features :-
--------------------------
RDBMS softwares :-
-----------------------------
ORDBMS :-
-----------------
ORDBMS softwares :-
---------------------------
SQL SERVER
ORACLE
POSTGRESQL
=> sql server is basically rdbms product from microsoft and also supports ordbms
features and used to create and to manage database.
1 Analysis
2 Design
3 Development
4 Testing
5 Implementation
6 Maintenance
Design :-
---------------
Development :-
----------------------
Developers DBAs
09-sep-23
1 on premises server
2 cloud server
=> in " on cloud " db is deployed in the server managed by cloud service
provider
for ex amazon.
summary :-
what is db ?
what is dbms ?
what is rdbms ?
what is ordbms ?
db development life cycle ?
================================================================
SQL SERVER
-------------------
=> sql server is basically rdbms product from microsoft and also supports ordbms
features and used to create and to manage database.
=> sql server can be used for both development and administration.
versions :-
---------------
version year
1 SERVER
2 CLIENT
SERVER :-
---------------
1 DB
2 INSTANCE
CLIENT :-
-------------
=> client is also a system where users can
1 connect to server
2 submit requests to server
3 receive response from server
client tool :-
USER----SSMS-----------------------------------------SQL SERVER------DB
11-SEP-23
SQL :-
-----------
USER---SSMS--------------SQL------------------SQL SERVER-------DB
USER----SQLPLUS---------SQL------------------ORACLE------------DB
USER---MYSQLWORKBENCH-----SQL--------MYSQL----------DB
SQL
=> to connect to sql server open ssms and enter following details
12-sep-23
=> click OK
download :-
------------------
https://www.microsoft.com/en-in/sql-server/sql-server-downloads
https://computingforgeeks.com/
install-sql-server-developer-edition-on-windows-server/?expand_article=1
SSMS :-
-------------
download :-
------------------
https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-
ssms?view=sql-server-ver16
Datatypes in SQL SERVER :-
----------------------------------------
Datatypes
char(size) :-
------------------
ex :- NAME CHAR(10)
SACHIN-----
wasted
RAVI------
wasted
=> in char datatype extra bytes are wasted , so char is not recommend for
variable
length fields and char is recommended for fixed length fields.
ex :- gender char(1)
M
F
state_code char(2)
AP
TS
MH
country_code char(3)
IND
USA
varchar(size) :-
---------------------
=> varchar allows character data upto 8000 chars
=> recommended for variable length fields
ex :- NAME VARCHAR(10)
sachin-----
released
varchar(max) :-
---------------------
ex :- feedback varchar(max)
NOTE :-
------------
ex :- panno char(10)
vehno char(10)
emailid varchar(20)
pwd varchar(10)
NCHAR/NVARCHAR/NVARCHAR(MAX) :-
----------------------------------------------------------
=> allows unicode chars (65536 chars) that includes all ascii chars and chars
belongs to different languages.
Integer Types :-
---------------------
ex :- AGE TINYINT
EMPID SMALLINT
Numeric(p) :-
----------------
ex :- empid NUMERIC(4)
10
100
1000
10000 => INVALID
AADHARNO NUMERIC(12)
PHONE NUMERIC(10)
ACCNO NUMERIC(11)
13-sep-23
Numeric(p,s) / Decimal(p,s) :-
---------------------------------------
ex :- salary Numeric(7,2)
5000
5000.55
50000.55
500000.55 => not allowed
Currency types :-
-----------------------
922337203685477.5807
ex :- salary smallmoney
balance money
DATE :-
------------
ex :- DOB DATE
2003-03-10
LOGIN TIME
9:30:00
TXNDT DATETIME
2023-09-13 10:00:00
rules :-
----------
123emp invalid
emp 123 invalid
emp*123 invalid
emp_123 valid
ex :-
EMP
EMPID ENAME JOB SAL HIREDATE AGE GENDER
=> above command created table structure / definition / metadata that includes
columns,datatype and size.
SP_HELP <tabname>
ex :- SP_HELP emp
EMPID tinyint 1
ENAME varchar 10
JOB varchar 10
SAL smallmoney 4
HIREDATE date 3
AGE tinyint 1
GENDER char 1
1 single row
2 multiple rows
ex :-
inserting nulls :-
---------------------
method 1 :- (explicit)
---------------
method 2 :- (implicit)
----------------
Displaying Data :-
-------------------------
SQL = ENGLISH
QUERIES = SENTENCES
CLAUSES = WORDS
WHERE clause :-
-----------------------
=> where clause is used to get specific rows from table based on a condition
SELECT columns/*
FROM tabname
WHERE condition
condition :-
--------------
COLNAME OP VALUE
=> OP must be any relational operator like > >= < <= = <>
ex :-
SELECT *
FROM EMP
WHERE EMPID = 103
SELECT *
FROM EMP
WHERE SAL > 5000
SELECT *
FROM EMP
WHERE HIREDATE > '2020-12-31'
SELECT *
FROM EMP
WHERE HIREDATE < '2020-01-01'
compound condition :-
---------------------------------
SELECT *
FROM EMP
WHERE JOB='CLERK' OR JOB ='MANAGER'
SELECT *
FROM EMP
WHERE EMPID=100 OR EMPID=103
SELECT *
FROM EMP
WHERE GENDER='M' AND AGE > 30
=> employees joined in 2020 year ?
SELECT *
FROM EMP
WHERE HIREDATE >= '2020-01-01'
AND
HIREDATE <= '2020-12-31'
=> employees earning more than 5000 and less than 10000 ?
SELECT *
FROM EMP
WHERE SAL>5000
AND
SAL<10000
15-sep-23
=>
STUDENT
SID 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
Testing :-
-------------
IN operator :-
------------------
BETWEEN operator :-
-------------------------------
SELECT *
FROM EMP
WHERE HIREDATE NOT BETWEEN '2020-01-01' AND '2020-12-31'
Question :-
SELECT *
FROM EMP
WHERE SAL BETWEEN 10000 AND 5000
A ERROR
B RETURNS ROWS
C RETURNS NO ROWS
D NONE
ANS :-
NOTE :- use between operator with lower and upper but not with upper and lower
=> employees list working as clerk,manager and earning between 5000 and
10000 and joined in 2023 and gender must be m ?
SELECT *
FROM EMP
WHERE JOB IN ('CLERK','MANAGER')
AND
SAL BETWEEN 5000 AND 10000
AND
HIREDATE BETWEEN '2023-01-01' AND '2023-12-31'
AND
GENDER='M'
=> list of samsung,realme mobile phones price between 10000 and 20000 ?
PRODUCTS
PRODID NAME PRICE CATEGORY BRAND
SELECT *
FROM PRODUCTS
WHERE BRAND IN ('SAMSUNG','REALME')
AND
CATEGORY='MOBILES'
AND
PRICE BETWEEN 10000 AND 20000
LIKE operator :-
----------------------
wildcard chars :-
------------------------
SELECT *
FROM EMP
WHERE ENAME LIKE 's%'
SELECT *
FROM EMP
WHERE ENAME LIKE '%d'
16-sep-23
SELECT *
FROM EMP
WHERE ENAME LIKE '%a%'
=> employees where 'a' is the 2nd char in their name ?
SELECT *
FROM EMP
WHERE ENAME LIKE '_a%'
SELECT *
FROM EMP
WHERE ENAME LIKE '%a__'
SELECT *
FROM EMP
WHERE ENAME LIKE '____'
SELECT *
FROM EMP
WHERE ENAME LIKE '[arv]%'
SELECT *
FROM EMP
WHERE ENAME LIKE '[a-p]%'
SELECT *
FROM EMP
WHERE HIREDATE LIKE '_____10___'
SELECT *
FROM EMP
WHERE HIREDATE LIKE '2020%'
CUST
CID CNAME
10 sachin_tendulkar
11 virat%kohli
12 mahendra_singh_dhoni
SELECT *
FROM CUST
WHERE CNAME LIKE '%_%'
=> above query returns all customer records because "_" is treated as wildcard
char
but not treated as normal char , to overcome this problem user ESCAPE char
SELECT *
FROM EMP
WHERE CNAME LIKE '%\_%' ESCAPE '\'
SELECT *
FROM CUST
WHERE CNAME LIKE '%\%%' ESCAPE '\'
SELECT *
FROM CUST
WHERE CNAME LIKE '%\_%\_%' ESCAPE '\'
IS operator :-
-------------------
summary :-
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
19-sep-23
ORDER BY clause :-
----------------------------
=> order by clause is used to sort data based on one or more columns
either in ascending or in descending order.
SELECT columns
FROM tabname
[WHERE cond]
ORDER BY col1 ASC/DESC , -------
ex :-
SELECT *
FROM EMP
ORDER BY ENAME ASC
SELECT *
FROM EMP
ORDER BY SAL DESC
SELECT *
FROM EMP
ORDER BY HIREDATE ASC
=> 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 5000 20 2 B 6000 10
2 B 6000 10 5 E 3000 10
3 C 4000 30============> 4 D 7000 20
4 D 7000 20 1 A 5000 20
5 E 3000 10 6 F 8000 30
6 F 8000 30 3 C 4000 30
=> arrange employee list dept wise asc and with in dept hiredate wise asc ?
SELECT EMPNO,ENAME,HIREDATE,DEPTNO
FROM EMP
ORDER BY DEPTNO ASC,HIREDATE ASC
STUDENT
SNO SNAME M P C
1 A 80 90 70
2 B 60 70 50
3 C 90 80 70
4 D 90 70 80
3 C 90 80 70
4 D 90 70 80
1 A 80 90 70
2 B 60 70 50
=> display employee names and annual salaries and arrange list annual sal
wise desc order ?
order of execution :-
--------------------------
FROM
WHERE
SELECT
ORDER BY
DISTINCT clause :-
-------------------------
=> distinct clause eliminates duplicates from the select stmt output
DISTINCT colname
DISTINCT col1,col2,--
DISTINCT *
ex :-
ANALYST
CLERK
MANAGER
PRESIDENT
SALESMAN
10
20
30
10 CLERK
10 MANAGER
10 PRESIDENT
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
20-SEP-23
TOP clause :-
--------------------
ex :-
SELECT TOP 3 *
FROM EMP
ORDER BY SAL DESC
SELECT TOP 3 *
FROM EMP
ORDER BY HIREDATE ASC
summary :-
INSERT
UPDATE
DELETE
MERGE
SET IMPLICIT_TRANSACTIONS ON
UPDATE command :-
-----------------------------
UPDATE tabname
SET colname = value , colname = value ,----------
[WHERE cond]
ex :-
=> update employees comm with NULL whose comm <> null ?
NULL comparision IS
NULL assignment =
=> update sal with 2000 and comm with 800 whose empno = 7369 ?
UPDATE EMP
SET SAL = 2000 , COMM = 800
WHERE EMPNO = 7369
=> increment sal by 20% and comm by 10% those working as salesman and
joined in 1981 year ?
UPDATE EMP
SET SAL = SAL*1.2 , COMM = COMM *1.1
WHERE JOB='SALESMAN'
AND
HIREDATE LIKE '1981%'
PRODUCTS
prodid pname price category brand
UPDATE PRODUCTS
SET PRICE = PRICE*1.1
WHERE CATEGORY='mobiles'
AND
BRAND IN ('samsung','redmi','realme')
DELETE command :-
----------------------------
ex :-
DELETE
FROM EMP
WHERE HIREDATE BETWEEN '1981-04-01' AND '1981-06-30'
21-sep-23
CREATE
ALTER
DROP
TRUNCATE
=> DDL commands acts on table structure.
ALTER command :-
--------------------------
1 add columns
2 drop columns
3 modify a column
changing datatype
changing size
Adding columns :-
------------------------
=> after adding by default the new column is filled with NULLs , to insert data
into the new column use update command.
Droping column :-
-----------------------
Modifying a column :-
-----------------------------
DROP command :-
-------------------------
=> deletes all the data from table but keeps structure.
=> will empty the table.
=> releases memory allocated for table.
DELETE VS TRUNCATE :-
------------------------------------
DELETE TRUNCATE
1 DML DDL
5 slower faster
SP_RENAME :-
---------------------
SP_RENAME 'EMP','EMPLOYEES'
SP_RENAME 'EMPLOYEES.COMM','BONUS'
=> a function accepts some input performs some calculation and returns one value
Types of functions :-
---------------------------
1 date
2 string
3 numeric
4 conversion
5 special
6 analytical
7 aggregate
DATE functions :-
-------------------------
GETDATE() :-
-------------------
DATEPART() :-
--------------------
DATEPART(interval,date)
ex :-
jan-mar 1
apr-jun 2
jul-sep 3
oct-dec 4
22-sep-23
SELECT *
FROM EMP
WHERE DATEPART(YY,HIREDATE) IN (1980,1983,1985)
SELECT *
FROM EMP
WHERE DATEPART(MM,HIREDATE) IN (1,4,12)
SELECT *
FROM EMP
WHERE DATEPART(QQ,HIREDATE)=2
AND
DATEPART(YY,HIREDATE)=1981
DATENAME() :-
--------------------
MM DW
DATEPART 09 6
SELECT *
FROM EMP
WHERE DATENAME(DW,HIREDATE) = 'SUNDAY'
SELECT DATENAME(DW,'1947-08-15')
FORMAT() :-
---------------
FORMAT(date,'format')
scenario :-
SELECT *
FROM EMP
WHERE HIREDATE = GETDATE() => NO ROWS
SELECT *
FROM EMP
WHERE HIREDATE = FORMAT(GETDATE(),'yyyy-MM-dd')
2023-09-22 = 2023-09-22
DATEADD() :-
-------------------
DATEADD(interval,int,date)
EX :-
GOLD_RATES
DATEID RATE
2020-01-01 ?
2020-01-02 ?
2023-09-22 ?
1 SELECT *
FROM GOLD_RATES
WHERE DATEID = FORMAT(GETDATE(),'yyyy-MM-dd')
2 SELECT *
FROM GOLD_RATES
WHERE DATEID = FORMAT(DATEADD(DD,-1,GETDATE()),'yyyy-MM-dd')
3 SELECT *
FROM GOLD_RATES
WHERE DATEID = FORMAT(DATEADD(MM,-1,GETDATE()),'yyyy-MM-dd')
4 SELECT *
FROM GOLD_RATES
WHERE DATEID = FORMAT(DATEADD(YY,-1,GETDATE()),'yyyy-MM-dd')
SELECT *
FROM GOLD_RATES
WHERE DATEID BETWEEN FORMAT(DATEADD(MM,-1,GETDATE()),'yyyy-MM-dd')
AND
FORMAT(GETDATE(),'yyyy-MM-dd')
DATEDIFF() :-
--------------------
23-SEP-23
SELECT ENAME,
DATEDIFF(MM,HIREDATE,GETDATE())/12 AS YEARS,
DATEDIFF(MM,HIREDATE,GETDATE())%12 AS MONTHS
FROM EMP
EOMONTH() :-
----------------------
EOMONTH(DATE,INT)
STRING functions :-
----------------------------
UPPER() :-
---------------
UPPER(arg)
LOWER() :-
----------------
LOWER(arg)
LEN() :-
------------
LEN(arg)
SELECT *
FROM EMP
WHERE ENAME LIKE '____'
WHERE LEN(ENAME) = 4
LEFT() :-
------------
LEFT(STRING,NO OF CHARS)
RIGHT() :-
----------------
=> returns chars starting from right side
RIGHT(STRING,NO OF CHARS)
scenario :-
-----------------
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'
SUBSTRING() :-
------------------------
=> used to extract part of the string starting from specific position
SUBSTRING(string,start,length)
ex :-
REPLICATE() :-
----------------------
REPLICATE(char,length)
scenario :-
---------------
ACCOUNTS
ACCNO
12345678967
REPLICATE('X',4) + RIGHT(ACCNO,4)
25-SEP-23
REPLACE() :-
------------------
REPLACE(str1,str2.str3)
ex :-
SELECT *
FROM EMP
WHERE LEN(ENAME) - LEN(REPLACE(ENAME,'A','')) = 1
TRANSLATE() :-
---------------------
TRANSLATE(str1,str2,str3)
ex :-
e => a
l => b
o => c
NOTE :-
=> translate function can be used to encrypt data i.e. converting plain text to
cipher text
ex :-
SELECT ENAME,
TRANSLATE(SAL,'0123456789.','$bT*h@U%#^&') AS SAL
FROM EMP
SELECT
REPLACE(TRANSLATE('%@he*&ll^$o@#' ,'%@*&^$#','*******'),'*','')
--------------------------------------------------------------------
**he**ll**o**
O/P :- hello
STUFF() :-
-------------
STUFF(str1,start,length,str2)
ex :-
CHARINDEX() :-
-----------------------
CHARINDEX(char,string,[start])
scenario :-
CUST
CID CNAME
10 SACHIN TENDULKAR
11 VIRAT KOHLI
SELECT CID,
SUBSTRING(CNAME,1,CHARINDEX(' ',CNAME)-1) AS FNAME,
SUBSTRING(CNAME,CHARINDEX(' ',CNAME)+1,LEN(CNAME)) AS LNAME
FROM CUST
SUBSTRING(STRING,START,LENGTH)
Assignment :-
CUST
CID CNAME
10 SACHIN RAMESH TENDULKAR
11 MAHENDRA SINGH DHONI
26-sep-23
Numeric functions :-
--------------------------
rounding numbers :-
----------------------------
ROUND
CEILING
FLOOR
ROUND() :-
---------------
ROUND(number,decimal places)
ex :-
ROUND(38.5678,0) =>
38--------------------------38.5-------------------------------39
ROUND(38.3647,0) => 38
300-----------------------350-----------------------------400
380------------------------385---------------------------390
ROUND(386,-3) => 0
0---------------------------500-----------------------------1000
CEILING() :-
-----------------
CEILING(number)
FLOOR() :-
----------------
FLOOR(number)
conversion functions :-
-----------------------------
1 CAST
2 CONVERT
=> both functions are used to convert one datatype to another datatype
CAST() :-
------------
CAST(source-value as target-type)
CONVERT() :-
------------------
CONVERT(TARGET-TYPE, SOURCE-VALUE)
1 using convert we can display dates in different formats but not possible
using cast
2 using convert we can display money in different formats but not possible
using cast
Date styles :-
-----------------
CONVERT(VARCHAR,DATE,STYLE-NUMBER)
Money Styles :-
---------------------
CONVERT(VARCHAR,MONEY,STYLE-NUMBER)
Special functions :-
---------------------------
ISNULL() :-
----------------
ISNULL(arg1,arg2)
27-sep-23
Analytical Functions :-
------------------------------
=> find the 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
SELECT empno,ename,sal,
dense_rank() over (ORDER BY sal DESC) as rnk
FROM emp
1 rank function generates gaps but dense_rank will not generate gaps.
2 in rank function ranks are not in sequence but in dense_rank ranks are
always in sequence.
=> find ranks of the employees based on sal , if salaries are same then
ranking should be based on hiredate ?
SELECT empno,ename,hiredate,sal,
dense_rank() over (ORDER BY sal DESC,hiredate ASC)
FROM emp
PARTITION BY clause :-
--------------------------------
=> use partition by clause to find ranks with in group , for ex to find
ranks with dept first divide the table dept wise and apply rank/dense_rank
functions on each dept instead of applying it on whole table.
SELECT empno,ename,sal,deptno,
dense_rank() over (partition by deptno
order by sal desc) as rnk
FROM emp
10 5000 1
2450 2
1300 3
20 3000 1
3000 1
2975 2
2000 3
1100 4
ROW_NUMBER() :-
---------------------------
SELECT EMPNO,ENAME,SAL,
ROW_NUMBER() OVER (ORDER BY EMPNO ASC) AS RNO
FROM EMP
28-sep-23
SELECT EMPNO,ENAME,SAL,
LAG(SAL,1) OVER (ORDER BY EMPNO ASC) AS PREV_SAL
FROM EMP
SELECT ENAME,HIREDATE,
DATEDIFF(DD,
LAG(HIREDATE,1) OVER (ORDER BY HIREDATE ASC),
HIREDATE) AS DAYS
FROM EMP
=> these functions process group of rows and returns one value
MAX
MIN
SUM
AVG
COUNT
COUNT(*)
MAX() :-
-----------
MAX(arg)
MIN() :-
----------
MIN(arg)
SUM() :-
------------
=> returns total
29000--------------------29500-----------------------------30000
o/p :- 29,000.00
AVG() :-
------------
COUNT() :-
----------------
COUNT(*) :-
----------------
T1
F1
10
NULL
20
NULL
30
COUNT(F1) => 3
COUNT(*) => 5
SELECT COUNT(*)
FROM EMP
WHERE DATENAME(DW,HIREDATE)='SUNDAY'
NOTE :-
=> aggregate functions are not allowed in where clause and they are
allowed only in select,having clauses.
SELECT ENAME
FROM EMP
WHERE SAL = MAX(SAL) => ERROR
SELECT DEPTNO
FROM EMP
WHERE COUNT(*) = 3 => ERROR
date :- datepart,datename,dateadd,datediff,eomonth,format
char :-
upper,lower,len,left,right,substring,replicate,replace,translate,charindex
numeric :- round,ceiling,floor
conversion :- cast,convert
special :- isnull
analytical :- rank,dense_rank,row_number,lag,lead
aggregate :- max,min,sum,avg,count,count(*)
========================================================================
29-SEP-23
CASE STATEMENT :-
-------------------------------
1 simple case
2 searched case
simple case :-
------------------
CASE colname
WHEN value1 THEN return expr1
WHEN value2 THEN return expr2
----------------
ELSE return expr
END
SELECT ENAME,
CASE JOB
WHEN 'CLERK' THEN 'WORKER'
WHEN 'MANAGER' THEN 'BOSS'
WHEN 'PRESIDENT' THEN 'BIG BOSS'
ELSE 'EMPLOYEE'
END AS JOB
FROM EMP
UPDATE EMP
SET SAL = CASE DEPTNO
WHEN 10 THEN SAL+(SAL*0.1)
WHEN 20 THEN SAL+(SAL*0.15)
WHEN 30 THEN SAL+(SAL*0.2)
ELSE SAL+(SAL*0.05)
END
searched case :-
-----------------------
CASE
WHEN cond1 THEN return expr1
WHEN cond2 THEN return expr2
-------------------
ELSE return expr
END
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
SELECT SNO,
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 STUDENT
=>
T1
AMT
1000
-2000
3000
-500
-2000
output :-
AMT TRANS
1000 CREDIT
-2000 DEBIT
==============================================================
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
EMP
EMPNO ENAME SAL DEPTNO
1 A 3000 10
2 B 4000 20 GROUP BY 10 7000
3 C 2000 30 ===========> 20 9000
4 D 5000 20 30 2000
5 E 4000 10
detailed data summarized data
syn :-
SELECT columns
FROM tabname
[WHERE cond]
GROUP BY colname
[HAVING cond]
[ORDER BY col ASC/DESC]
Execution :-
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
02-OCT-23
10 9680.00
20 12535.00
30 11520.00
FROM EMP :-
-------------------
GROUP BY DEPTNO :-
--------------------------------
10 1 A 3000 10
5 E 4000 10
20 2 B 4000 20
4 D 5000 20
30 3 C 2000 30
10 7000
20 9000
30 2000
ANALYST 2
CLERK 4
MANAGER 3
PRESIDENT 1
SALESMAN 4
1980 1
1981 10
1982 2
1983 1
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.
WHERE VS HAVING :-
--------------------------------
WHERE HAVING
=> display dept wise no of employees where deptno = 10,20 and no of employees >
3 ?
20 5
PERSONS
AADHRNO NAME GENDER AGE ADDR CITY STATE
SELECT STATE,COUNT(*)
FROM PERSONS
WHERE STATE IN ('AP','TS','KA','KL','TN')
GROUP BY STATE
HAVING COUNT(*) > 50000000
Range grouping :-
--------------------------
SELECT CASE
WHEN SAL BETWEEN 0 AND 2000 THEN '0-2000'
WHEN SAL BETWEEN 2001 AND 4000 THEN '2001-4000'
WHEN SAL>4000 THEN 'ABOVE 4000'
END AS SALRANGE, COUNT(*) AS CNT
FROM EMP
GROUP BY CASE
WHEN SAL BETWEEN 0 AND 2000 THEN '0-2000'
WHEN SAL BETWEEN 2001 AND 4000 THEN '2001-4000'
WHEN SAL>4000 THEN 'ABOVE 4000'
END
03-OCT-23
=> display dept wise and with in dept job wise total salary ?
SELECT DEPTNO,JOB,SUM(SAL) AS TOTSAL
FROM EMP
GROUP BY DEPTNO,JOB
ORDER BY DEPTNO ASC
10 CLERK 1430
MANAGER 2750
PRESIDENT 5500
20 ANALYST 6900
CLERK 2185
MANAGER 3450
30 CLERK 1200
MANAGER 3840
SALESMAN 6840
=> display year wise and with in year quarter wise no of employees ?
1980 1 ?
2 ?
3 ?
4 ?
1981 1 ?
2 ?
3 ?
=> 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
CUBE :-
-----------
=> CUBE displays subtotals for each group by column (deptno,job) and also
displays grand total.
GROUPING_ID() :-
--------------------------
=> this functions accepts group by columns and returns subtotal belongs to
which group by column
ex :- GROUPING_ID(DEPTNO,JOB) =>
Assignment :-
-------------------
PERSONS
AADHRNO NAME GENDER AGE ADDR CITY STATE
=> display state wise and with in stage gender wise population and also
display state wise and gender wise subtotals ?
2 SALES
DATEID PRODID CUSTID QTY AMT
2018-01-01 100 10 1 2000
=> display year wise and with in year quarter wise total amount
and also display year wise subtotals ?
NOTE :-
=> column alias can be used in order by clause because order by clause
is executed after select.
summary :-
importance of group by
writing queries using group by
where vs having
displaying subtotals & grand total
rollup & cube
grouping_id
=================================================================
=> Integrity Constraints are rules to maintain Data Quality or Data Consistency.
=> used to prevent users from entering invalid data.
=> used to enforce rules like min bal must be 1000.
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 :-
------------------
ex :-
UNIQUE :-
-------------
ex :-
PRIMARY KEY :-
-----------------------
=> in tables one column must be there to uniquely identify and into that
column duplicates and nulls are not allowed , so declare that column
with primary key.
ex :-
=> only one primary key is allowed per table , if we want multiple primary keys
then declare one column with primary key and other columns with
unique not null.
candidate key :-
---------------------
=> while creating table secondary key columns are declared with unique not null.
CHECK :-
------------
syn :- CHECK(condition)
FOREIGN KEY :-
----------------------
EMP
EMPNO ENAME SAL DNO DNAME LOC
1 A 3000 10 HR BLR
2 10 HR BLR
3 10 HR BLR
=> to establish relationship take primary key of one table and add it to
another table as foreign key and declare with references constraint.
DEPT
DNO DNAME LOC
10 HR BLR
20 IT HYD
EMP
EMPNO ENAME SAL DNO REFERENCES DEPT(DNO)
1 A 4000 10
2 B 3000 20
3 C 5000 90 => INVALID
4 D 3000 10
5 E 2000 NULL
=> values entered in fk column should match with values entered in pk column.
=> after declaring foreign key a relationship is created between two tables
called parent/child relationship
Relationship Types :-
-----------------------------
1 one to one
2 one to many
3 many to one
4 many to many
=> to establish one to one relationship declare foreign key with unique constraint
ex :-
DEPT
DNO DNAME
10 HR
20 IT
MGR
MGRNO MNAME DNO REFERENCES DEPT(DNO) UNIQUE
1 A 10
2 B 20
=> to establish many to many relationship then create 3rd table and
in 3rd table take primary keys of both tables as foreign keys
ex :-
CUST PRODUCTS
CID NAME ADDR PRODID PNAME PRICE
1 A HYD 100 A 500
2 B BLR 101 B 200
SALES
CID PRODID QTY
1 100 1
1 101 2
2 100 1
2 101 3
06-oct-23
DEFAULT :-
-----------------
=> while inserting if we skip hiredate then sql server inserts default value
TABLE LEVEL :-
----------------------
=> use table level to declare constraints for multiple or combination of columns.
=> table level constraints are declared after declaring all columns
PRODUCTS
prodid pname price mfd_dt exp_dt
100 A 100 2023-10-01 2023-01-01 INVALID
ex :-
STUDENT COURSE
SID SNAME CID CNAME
------ ------
1 A 10 .NET
2 B 11 SQL
REGISTRATIONS
SID CID DOR FEE
----------------
1 10 ? ?
1 11 ? ?
2 10 ? ?
Question :-
----------------
SALES
DATEID PRODID CUSTID QTY AMT
2023-10-05 100 10 1 1000
2023-10-05 100 11 1 1000
2023-10-05 101 10 1 2000
2023-10-06 100 10 1 1000
ex :-
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
=> in the above table SID,CID combination should match with registrations table
SID,CID combination
A UNIQUE
B CHECK
C NOT NULL
D PRIMARY KEY
E FOREIGN KEY
ANS :- C
07-oct-23
WITH NOCHECK :-
--------------------------
=> if check constraint added "WITH NOCHECK" then sql server will not
validate existing data and it validates only new data.
Adding unique :-
-----------------------
Droping constraints :-
-------------------------------
EX :-
NOTE :-
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
TRANS
TRID TTYPE TDATE TAMT ACCNO REFERENCES ACCOUNTS(ACCNO)
1 W 100 ON DELETE CASCADE
2 D 100
=> parent row is deleted but child rows are not deleted but fk will be set to
null.
scenario :-
projects
projid name duration
100
101
emp
empno ename projid references projects (projid) on delete set null
1 100
2 101
=> parent row is deleted but child rows are not deleted but fk will be set to
default value.
summary :-
importance of constraints
types of constraints
declaring constraints
column level
table level
adding constraints
droping constraints
delete rules
==============================================================
JOINS
=====
=> join is an operation performed to display data from two or more tables.
ex :-
orders customers
ordid orddt deldt cid cid cname addr
1000 10 10 A HYD
1001 11 11 B HYD
Types of join :-
--------------------
=> 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 cond
join cond :-
------------------
=> based on the given join condition sql server joins the records of two tables
TABLE1.COMMONFIELD = TABLE2.COMMONFIELD
EX :-
EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
1 A 10 10 ACCOUNTS NEW YORK
2 B 20 20 RESEARCH
3 C 30 30 SALES
4 D 20 40 OPERATIONS
5 E NULL
SELECT ENAME,DNAME,LOC
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO
10-oct-23
NOTE :-
=> in join , Declare table alias and prefix column names with table alias for
two reasons
1 to avoid ambiguity
2 for faster execution
SELECT E.ENAME,E.DEPTNO,D.DNAME,D.LOC
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
SELECT E.ENAME,D.DNAME
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO /* join cond */
WHERE D.LOC = 'NEW YORK' /* filter cond */
SELECT E.ENAME,
D.DNAME,
L.CITY,L.STATE,
C.COUNTRY_NAME AS COUNTRY
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
INNER JOIN LOCATIONS AS L
ON D.LOCID = L.LOCID
INNER JOIN COUNTRIES AS C
ON L.COUNTRY_ID = C.COUNTRY_ID
OUTER JOIN :-
-------------------
=> inner join returns only matching records but will not return unmatched records
=> to display unmatched records perform outer join
EMP DEPT
EMPNO ENAME DEPTNO DEPTNO DNAME LOC
1 A 10 10 ACCOUNTS NEW YORK
2 B 20 20 RESEARCH
3 C 30 30 SALES
4 D 20 40 OPERATIONS => unmatched row
5 E NULL => unmatched row
1 LEFT JOIN
2 RIGHT JOIN
3 FULL JOIN
11-oct-23
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 AS E LEFT JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
=> returns all rows from emp and matching rows from dept
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
RIGHT JOIN :-
--------------------
=> returns all rows from right side table and matching rows from left side
table.
SELECT E.ENAME,D.DNAME
FROM EMP AS E RIGHT JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
=> returns all rows from dept and matching rows from emp
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
NULL OPERATIONS => unmatched from dept
FULL JOIN :-
----------------
SELECT E.ENAME,D.DNAME
FROM EMP AS E FULL JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
A ACCOUNTS
B RESEARCH
C SALES
D RESEARCH
E NULL => unmatched from emp
NULL OPERATION => unmatched from dept
SELECT E.ENAME,D.DNAME
FROM EMP AS E LEFT JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
WHERE D.DNAME IS NULL
E NULL
SELECT E.ENAME,D.DNAME
FROM EMP AS E RIGHT JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
WHERE E.ENAME IS NULL
NULL OPERATIONS
both tables :-
-------------------
SELECT E.ENAME,D.DNAME
FROM EMP AS E FULL JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
WHERE D.DNAME IS NULL
OR
E.ENAME IS NULL
E NULL
NULL OPERATIONS
scenario :-
EMP PROJECTS
EMPNO ENAME PROJID PROJID NAME DURATION
1 100 100 AAA
2 101 101 BBB
3 NULL 102 CCC
=> display employee details with project details and also display employees
not assigned to any projects ?
NON-EQUI JOIN :-
--------------------------
=> 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 5000 2 1001 2000
3 C 1500 3 2001 3000
4 D 2500 4 3001 4000
5 E 1000 5 4001 9999
SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP AS E JOIN SALGRADE AS S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
A 3000 3
B 5000 5
C 1500 2
D 2500 3
E 1000 1
=> display grade 3 employee list ?
SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP AS E JOIN SALGRADE AS S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE S.GRADE=3
SELECT E.ENAME,D.DNAME,S.GRADE
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
JOIN SALGRADE AS S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL
12-OCT-23
SELF JOIN :-
--------------------
ex :-
EMP
EMPID ENAME MGR
7369 VIJAY 7902
7499 ALLEN 7698
7566 JONES 7839
7698 BLAKE 7839
7839 KING NULL
7902 FORD 7566
=> above table contains manager number but to display manager name perform self
join
=> to perform self join the same table must be declared two times with different
alias
EMP X EMP Y
EMPID ENAME MGR EMPID ENAME MGR
7369 VIJAY 7902 7369 VIJAY 7902
7499 ALLEN 7698 7499 ALLEN 7698
7566 JONES 7839 7566 JONES 7839
7698 BLAKE 7839 7698 BLAKE 7839
7839 KING NULL 7839 KING NULL
7902 FORD 7566 7902 FORD 7566
VIJAY FORD
ALLEN BLAKE
JONES KING
BLAKE KING
FORD JONES
SELECT X.ENAME,X.HIREDATE,
Y.ENAME AS MANAGER,Y.HIREDATE AS MGRHIRE
FROM EMP AS X JOIN EMP AS Y
ON X.MGR = Y.EMPID
WHERE X.HIREDATE < Y.HIREDATE
Question :-
TEAMS
ID COUNTRY
1 IND
2 AUS
3 ENG
IND VS AUS
IND VS ENG
AUS VS ENG
TEAMS A TEAMS B
ID COUNTRY ID COUNTRY
1 IND 1 IND
2 AUS 2 AUS
3 ENG 3 ENG
CROSS JOIN :-
-----------------------
=> 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 records of 1st table joined
with
all records of 2nd table.
SELECT E.ENAME,D.DNAME
FROM EMP AS E CROSS JOIN DEPT AS D
13-OCT-23
ON E.DEPTNO = D.DEPTNO :-
------------------------------------------
EMP DEPT
EMPNO ENAME SAL DEPTNO DEPTNO DNAME
1 A 3000 10 10 ACCOUNTS
2 B 4000 20 20 RESEARCH
3 C 3000 30 30 SALES
4 D 5000 20 40 OPERATIONS
5 E 4000 10
output :-
1 A 3000 ACCOUNTS
2 B 4000 RESEARCH
3 C 3000 SALES
4 D 5000 RESEARCH
5 E 4000 ACCOUNTS
GROUP BY D.DNAME :-
---------------------------------
ACCOUNTS 1 A 3000
5 E 4000
RESEARCH 2 B 4000
4 D 5000
SALES 3 C 3000
ACCOUNTS 7000
RESEARCH 9000
SALES 3000
=>
SALES
DATEID PRODID CUSTID QTY AMT
2023-10-13 100 10 1 2000
PRODUCTS
PRODID PNAME PRICE CATEGORY
100 AAA 2000 ELECTRONICS
CUST
CUSTID NAME ADDR COUNTRY
10 KKK 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
=> in SQL set operations performed between records return by two queries
SELECT STATEMENT 1
UNION / UNION ALL / INTERSECT / EXCEPT
SELECT STATEMENT 2
Rules :-
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
UNION :-
--------------
ANALYST
CLERK
MANAGER
SALESMAN
ANALYST 3450.00
CLERK 920.00
CLERK 1200.00
CLERK 1265.00
MANAGER 3450.00
MANAGER 3480.00
SALESMAN 1560.00
SALESMAN 1800.00
SALESMAN 1920.00
UNION VS JOIN :-
-------------------------
UNION JOIN
scenario :-
--------------
EMP_US
ENO ENAME DNO
DEPT
EMP_IND DNO DNAME LOC
ENO ENAME DNO
SELECT E.*,D.*
FROM EMP_US AS E INNER JOIN DEPT AS D
ON E.DNO = D.DNO
SELECT E.*,D.*
FROM EMP_US AS E INNER JOIN DEPT AS D
ON E.DNO = D.DNO
UNION
SELECT E.*,D.*
FROM EMP_IND AS E INNER JOIN DEPT AS D
ON E.DNO = D.DNO
UNION ALL :-
-----------------
CLERK
MANAGER
ANALYST
CLERK
ANALYST
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK
3 slower faster
INTERSECT :-
-------------------
CLERK
MANAGER
EXCEPT :-
---------------
=> 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 join
3 right join
4 full join
5 union
6 union all
7 intersect
8 except
14-oct-23
=> if sub-query returns one value then it is called single row sub-query
SELECT columns
FROM tabname
WHERE colname OP (SELECT STATEMENT)
ex :-
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
aggregate 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 )
SELECT ENAME
FROM EMP
WHERE HIREDATE = (SELECT MIN(HIREDATE) FROM EMP )
SELECT MAX(SAL)
FROM EMP
WHERE SAL <> (SELECT MAX(SAL) FROM EMP)
SELECT ENAME
FROM EMP
WHERE SAL = ( SELECT MAX(SAL)
FROM EMP
WHERE SAL <> (SELECT MAX(SAL) FROM EMP))
NOTE :-
UPDATE EMP
SET SAL = SAL+(SAL*0.1)
WHERE HIREDATE = (SELECT MIN(HIREDATE) FROM EMP)
UPDATE EMP
SET SAL = CASE EMPNO
WHEN 7369 THEN (SELECT SAL FROM EMP WHERE EMPNO=7499)
WHEN 7499 THEN (SELECT SAL FROM EMP WHERE EMPNO = 7369)
END
WHERE EMPNO IN (7369,7499)
UPDATE EMP
SET SAL = CASE EMPNO
WHEN 7369 THEN 1600
WHEN 7499 THEN 800
END
WHERE EMPNO IN (7369,7499)
16-oct-23
Multi-row subqueries :-
------------------------------
=> if sub-query returns more than one value then it is called multi-row subquery
SELECT columns
FROM tabname
WHERE colname OP (SELECT STMT)
SINGLE MULTI
= IN
<> NOT IN
examples :-
subquery :-
-----------------
SELECT *
FROM EMP
WHERE DEPTNO IN ( SELECT DEPTNO
FROM DEPT
WHERE LOC IN ('NEW YORK','CHICAGO'))
join :-
---------
SELECT E.*
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
WHERE D.LOC IN ('NEW YORK','CHICAGO')
join :-
----------
SELECT E.ENAME,D.DNAME
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
WHERE D.LOC IN ('NEW YORK','CHICAGO')
subquery :-
-----------------
not possible
1 to display data from one table and condition based on another table
then we can use subquery or join
=> use ANY & ALL operators for > < comparision with multiple values
SELECT *
FROM EMP
WHERE SAL > ALL (SELECT SAL
FROM EMP
WHERE JOB='MANAGER')
-------------------------------------
2975,2850,2450
SELECT *
FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE JOB='MANAGER')
------------------------------------
2975,2850,2450
CO-RELATED subqueries :-
--------------------------------------
=> if inner query references values of outer query then it is called co-related
subquery.
=> execution starts from outer query and inner query is executed no of times
depends on no of rows return by outer query
=> use co-related subquery to execute subquery for each row return by outer query
example 1 :-
EMP
EMPNO ENAME SAL DEPTNO
1 A 5000 10
2 B 3000 20
3 C 4000 30
4 D 6000 20
5 E 2000 10
SELECT *
FROM EMP AS X
WHERE SAL = ( SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO = X.DEPTNO)
17-oct-23
EMP A EMP B
SAL SAL
5000 5000 3 > (0) TRUE
1000 1000 3 > (4) FALSE
3000 3000 3 > (1) TRUE
2000 2000 3 > (3) FALSE
2975 2975 3 > (2) TRUE
Derived Tables :-
------------------------
=> subqueries in FROM clause are called derived tables
SELECT columns
FROM (SELECT STATEMENT) AS <ALIAS>
[WHERE COND]
default order :-
-------------------
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
Example 1 :-
SELECT empno,ename,sal,
dense_rank() over (order by sal desc) as rnk
FROM emp
above query returns ranks of all the employees but to display top 5 employees
SELECT empno,ename,sal,
dense_rank() over (order by sal desc) as rnk
FROM emp
WHERE rnk <= 5 => ERROR
SELECT *
FROM (SELECT empno,ename,sal,
dense_rank() over (order by sal desc) as rnk
FROM emp) AS E
WHERE rnk <= 5
SELECT *
FROM E
WHERE RNK <= 5
SELECT *
FROM (SELECT deptno,sal,
dense_rank() over (partition by deptno
order by sal desc) as rnk
FROM emp ) AS E
WHERE rnk <= 3
10 5000 1
2450 2
1300 3
20 3000 1
3000 1
2975 2
1100 3
18-oct-23
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
NOTE :- in derived tables outer query cannot be DML and it must be always
SELECT
CTE :-
---------
=> using CTE we can give name to the query output and we can refer that
name in another query like SELECT/INSERT/UPDATE/DELETE.
=> in derived tables outer query cannot be DML but in CTEs outer query can be
DML
WITH
<CTE-NAME1>
AS
(SELECT STATEMENT)
<CTE-NAME2>
AS
(SELECT STATEMENT)
EX :-
WITH E
AS
(SELECT EMPNO,ENAME,SAL ,
ROW_NUMBER() OVER (ORDER BY EMPNO ASC) AS RNO
FROM EMP)
DELETE FROM E WHERE RNO<=3
EMP44
ENO ENAME SAL
1 A 5000
2 B 6000
3 C 7000
1 A 5000
2 B 6000
SELECT ENO,ENAME,SAL,
ROW_NUMBER() OVER (PARTITION BY ENO,ENAME,SAL
ORDER BY ENO,ENAME,SAL ) AS RNO
FROM EMP44
1 A 5000.00 1
1 A 5000.00 2
2 B 6000.00 1
2 B 6000.00 2
3 C 7000.00 1
WITH E
AS
(SELECT ENO,ENAME,SAL,
ROW_NUMBER() OVER (PARTITION BY ENO,ENAME,SAL
ORDER BY ENO,ENAME,SAL ) AS RNO
FROM EMP44)
DELETE FROM E WHERE RNO>1
Assignment :-
T1
AMT
1000
-200
2000
-800
3000
-500
output :-
POS NEG
1000 -200
2000 -800
3000 -500
2 T1 T2
F1 C1
1 A
2 B
3 C
OUTPUT :-
1 A
2 B
3 C
3
DEPTNO FIRST_MAX SECOND_MAX
10 ? ?
20 ? ?
30 ? ?
scalar subqueries :-
---------------------------
SELECT (subquery1),(subquery2),--------------
FROM tabname
WHERE cond
ex 1 :-
EMP DEPT
14 4
ex 2 :-
10 8750.00
20 10075.00
30 6550.00
10 8750.00 25375
20 10075.00 25375
30 6550.00 25375
19-OCT-23
select stmt
where
order by
distinct
top
functions
group by & having
joins
set operators
subqueries
=================================================================
PIVOT operator :-
-------------------------
SELECT columns
FROM (SELECT required data) AS <ALIAS>
PIVOT
(
AGGR-EXPR FOR COLNAME IN (V1,V2,V3,--)
) AS <PIVOT_TBL_NAME>
ORDER BY COLNAME ASC/DESC
Ex :-
10 20 30
ANALYST ? ? ?
CLERK ? ? ?
MANAGER ? ? ?
SALESMAN ? ? ?
SELECT *
FROM (SELECT DEPTNO,JOB,SAL FROM EMP) AS E
PIVOT
(
SUM(SAL) FOR DEPTNO IN ([10],[20],[30])
) AS PIVOT_TBL
ORDER BY JOB ASC
Ex 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_TBL
ORDER BY YEAR ASC
ex 3 :-
STUDENT
SNO SNAME SUBJECT MARKS
1 A MAT 70
1 A PHY 60
1 A CHE 80
2 B MAT 60
2 B PHY 50
2 B CHE 40
output :-
creates new table with name EMP11 and copies rows & cols from emp to emp11
MERGE command :-
--------------------------
syn :-
Ex :-
CUSTT
CID CNAME CADDR
1 A HYD
2 B MUM
CUSTS
CID CNAME CADDR
1 A BLR => UPDATED
2 B MUM
3 C DEL => INSERTED
=>
EMPS EMPT
EMPID ENAME SAL EMPID ENAME SAL
1 A 5000 1 A
2 B 6000 2 B
3 C 7000 3 C
method 1
method 2
Database Transactions :-
----------------------------------
=> a transaction is a unit of work that contains one or more dmls and must be
saved as a whole or must be cancelled as a whole.
ex :- money transfer
acct1-----------------------1000--------------------------acct2
update1 update2
(bal=bal-1000) (bal=bal+1000)
=> every transaction must gurantee a property called atomocity i.e. all or none
if txn contains multiple operations , if all are successful then it must be
saved,
if one of the operation failes then entire txn must be cancelled.
=> the following commands provided by sql server to control the transaction
called TCL commands.
=> a txn begins implicitly with dml command and ends implicitly with commit.
=> a user can also start txn by using "BEGIN TRANSACTION" command.
and ends explicitly with COMMIT / ROLLBACK command.
ex 1 :-
if txn ends with COMMIT then it is called successful txn and operations are
saved
ex 2 :-
=> if txn ends with ROLLBACK then it is called aborted txn and operations are
cancelled
ex 3 :-
SELECT * FROM A
10
20
30
40
SAVE TRANSACTION :-
--------------------------------
=> we can declare save transaction and we can cancel upto the save transaction
=> using save transaction we can cancel part of the txn
SELECT * FROM A
10
20
27-OCT-23
DB Security :-
-------------------
SERVER (LOGINS)
DATABASE (USERS)
TABLES (PRIVILEGES)
ROWS & COLS (VIEWS)
=> click OK
USE [master]
GO
CREATE LOGIN [NARESH] WITH PASSWORD=N'123'
GO
creating user in db :-
---------------------------
=> click OK
USE [DB6PM]
GO
CREATE USER [VIJAY] FOR LOGIN [NARESH]
GO
SERVER
SA
NARESH
DB6PM
DBO (SA)
EMP
DEPT
CUST
STUDENT
VIJAY (NARESH)
PRIVILEGES :-
----------------------
DBO :-
VIJAY :-
REVOKE command :-
---------------------------
DBO :-
================================================================
TABLES
VIEWS
SYNONYMS
SEQUENCES
INDEXES
STORED PROCEDURES
FUNCTIONS
TRIGGERS
28-OCT-23
VIEWS :-
----------
1 to provide security
2 to reduce complexity
=> view provides another level of security i.e. row & col level , with the help
of views we can grant specific rows & cols to users.
1 simple views
2 complex views
simple views :-
-----------------
Ex :-
CREATE VIEW V1
AS
SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP
=> sql server creates view v1 and stores query but not query output
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
VIJAY :-
-----------
=> if view created with "WITH CHECK OPTION" then any DML command
through view violates where condition that DML is not accepted.
CREATE VIEW V3
AS
SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP
WHERE DEPTNO=20
WITH CHECK OPTION
VIJAY :-
-----------
Complex views :-
-----------------------
=> with the help of views complex queries can be converted into simple queries
ex 1 :-
CREATE VIEW CV1
AS
SELECT E.EMPNO,E.ENAME,E.SAL,
D.DEPTNO,D.DNAME,D.LOC
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPTNO = D.DEPTNO
after creating view whenever we want data from emp & dept tables then
execute the following simple query
ex 2 :-
=> whenever we want dept wise total salary then execute the following simple query
simple complex
Droping view :-
--------------------
DROP VIEW V1
WITH SCHEMABINDING :-
------------------------------------
=> if view created with schemabinding then sql server will not allow user
to drop table if any view exists on the table.
ex :-
30-OCT-23
Synonyms :-
-----------------
=> if tablename is lengthy then we can give a simple and short name to
the table called synonym and after creating synonym instead of using
tablename we can use synonym name in select/insert/update/delete
queries.
1 SELECT * FROM E
2 UPDATE E SET COMM = 500 WHERE EMPNO = 7369
Question :-
synonym alias
1 permanent not permanent
Droping synonym :-
---------------------------
DROP SYNONYM E
SEQUENCES :-
--------------------
Example 1 :-
CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 5
using sequence :-
-----------------------
SID SNAME
1 A
2 B
3 C
4 D
5 E
Example 2 :-
CREATE SEQUENCE S2
START WITH 100
INCREMENT BY 1
MAXVALUE 999
Example 3 :-
BILL
BILLNO BDATE
NIT/1023/1 ??
NIT/1023/2 ??
CREATE SEQUENCE S3
START WITH 1
INCREMENT BY 1
MAXVALUE 9999
31-OCT-23
USING CYCLE :-
-----------------------
=> sequence 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 max and after reaching max then it will reset to min.
CREATE SEQUENCE S5
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE
Droping sequence :-
----------------------------
DROP SEQUENCE S1
INDEXES :-
---------------
=> indexes are created on columns and that column is called index key.
Types of Indexes :-
--------------------------
EMP 3000
SAL
3000
1000 2000 4000
2000
4000
3000 1000 * 2500 * 4000 * 5000 *
1500 1500 * 3000 *,*
2500 2000 *
5000
=> when we submit query to sql server ,it uses following methods to locate the
record
1 TABLE SCAN
2 INDEX SCAN
=> in TABLE SCAN sql server scans complete table i.e. each and every row.
=> in INDEX SCAN on avg sql server scans only half of the table , so index
scan is faster than table scan.
composite index :-
------------------------
20
10 30
=> sql server uses above index when where cond based on deptno
01-NOV-23
UNIQUE index :-
-----------------------
=> unique index doesn't allow duplicate values into the column on which index
is created.
G Q
ADAMS * JAMES * MARTIN * SCOTT *
ALLEN * JONES * MILLER * SMITH *
BLAKE * WARD *
=> primary key / unique columns are automatically indexed by sql server ,
sql server creates a unique index on primary key / unique columns and
unique index doesn't allow duplicates so primary key / unique also doesn't
allow duplicates.
CLUSTERED INDEX :-
-------------------------------
=> a non clustered index stores pointers to actual records where as clustered
index stores
actual records
50
30 70
10 A 40 C 60 D 80 B
1 SELECT * FROM CUST => sql server goes to index and access all the leaf
nodes
from left to right
10 A
40 C
60 D
80 B
2 SELECT * FROM CUST WHERE CID=40 => sql server goes to index and find
the entry with cid=40 and return
the record from index
NOTE :-
SP_HELPINDEX EMP
Droping index :-
-----------------------
SERVER
DATABASE
TABLE
ROWS & COLS
CONSTRAINTS
INDEXES
TRIGGERS
VIEW
SYNONYMS
SEQUENCES
========================================================================
Basic programming
conditional stmts
loops
cursors
error handling
stored procedures
functions
triggers
dynamic sql
Features :-
---------------
1 Improves performance :-
----------------------------------
=> in T-SQL , sql commands can be grouped into one block and we submit
that block to sql server, so in T-SQL no of requests & response between
user and sql server are reduced and performance is improved.
3 supports loops :-
------------------------
=> T-SQL supports loops like while , with the help of loops we can execute
sql commands repeatedly multiple times.
=> in T-SQL , if any statement causes error then we can handle that error and
we can display our own simple and user friendly message.
=> in T-SQL a big program can be divided into small modules with the help of
procedures and functions.
6 supports reusability :-
--------------------------------
=> T-SQL programs can be stored in db and applications which are connected
to db can reuse T-SQL programs
1 Anonymous Blocks
2 Named Blocks
stored procedures
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 = 'HELLO'
SET @d = GETDATE()
PRINT statement :-
--------------------------
EX :- PRINT 'HELLO'
PRINT @x
Ex 1 :-
Ex 2 :-
=> write a prog to input date and print day of the week ?
DECLARE @d DATE
SET @d = '2024-01-01'
PRINT DATENAME(DW,@d)
Ex 3 :-
=> write a prog to input name and print first name and last name ?
DECLARE @n VARCHAR(20) , @f VARCHAR(20),@l VARCHAR(20)
SET @n = 'sachin tendulkar'
SET @f = SUBSTRING(@n,1,CHARINDEX(' ',@n)-1)
SET @l = SUBSTRING(@n,CHARINDEX(' ',@n)+1,LEN(@n))
PRINT @f
PRINT @l
SUBSTRING(string,start,len)
CHARINDEX(char,string,[start])
=> to perform operations over db execute SQL commands from t-sql program.
=> the following commands are executed from T-SQL program.
1 DML (INSERT,UPDATE,DELETE,MERGE)
2 DQL (SELECT)
3 TCL (COMMIT,ROLLBACK,SAVE TRANSACTION)
ex :-
SELECT @n = ENAME,
@s = SAL
FROM EMP
WHERE EMPNO = 110
03-nov-23
=> write a prog to input empno and print name & salary ?
Conditional statements :-
----------------------------------
1 IF-ELSE
2 MULTI-IF
3 NESTED 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 ?
DECLARE @eno INT ,@amt MONEY,@sal MONEY
SET @eno = 107
SET @amt = 2500
BEGIN TRANSACTION
UPDATE emp SET sal = sal + @amt WHERE empno = @eno
SELECT @sal = sal FROM emp WHERE empno = @eno
IF @sal>5000
ROLLBACK
ELSE
COMMIT
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 C 20000
@@rowcount :-
--------------------
Atomocity :-
---------------
=> atomocity means all or none , if txn contains multiple operations if all are
succssful then it must be committed , if one of the operation fails then entire
txn must be cancelled.
=> write a prog to input sno and calculate total,avg,result and insert into result
table ?
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT
WHILE LOOP :-
----------------------
WHILE(cond)
BEGIN
statements
END
DECLARE @x INT = 1
WHILE(@x<=20)
BEGIN
PRINT @x
SET @x = @x+1
END
2024-01-01 ??
2024-01-02 ??
2024-12-31 ??
06-NOV-23
=> write a prog to print only sundays between two given dates ?
input :- NARESH
output :-
N
A
R
E
S
H
input :- NARESH
output :-
N
NA
NAR
NARE
NARES
NARESH
=> write a prog to input string and print reverse of that string ?
input :- NARESH
output :- HSERAN
CURSORS :-
------------------
1 declare cursor
2 open cursor
3 fetch records from cursor
4 close cursor
5 deallocate cursor
Declaring cursor :-
-------------------------
ex :-
Opening cursor :-
------------------------
OPEN <cursor-name>
EX :- OPEN C1
EX :-
=> a fetch stmt fetches one row at a time but to process multiple rows fetch stmt
should be executed multiple times, so fetch stmt should be in a loop.
Closing cursor :-
----------------------
CLOSE <cursor-name>
EX :- CLOSE C1
Deallocating cursor :-
--------------------------
DEALLOCATE <cursor-name>
ex :- DEALLOCATE C1
@@FETCH_STATUS :-
--------------------------------
=> system variable that returns status of fetch stmt i.e. successful or failed
07-NOV-23
=> write a prog to calculate total sal without using sum function ?
=> write a prog to calculate max sal without using max function ?
smith,allen,ward,jones,martin,-----------
REPLACE(str1,str2,str3)
STUFF(str1,start,len,str2)
=> write a prog to calculate all the students total,avg,result and insert into
result
table ?
STUDENT
SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
RESULT
SNO TOTAL AVG RESULT
DECLARE C1 CURSOR FOR SELECT SNO,S1,S2,S3 FROM STUDENT
DECLARE @SNO INT,@S1 INT,@S2 INT,@S3 INT
DECLARE @TOTAL INT,@AVG DECIMAL(5,2),@RES CHAR(4)
OPEN C1
FETCH NEXT FROM C1 INTO @SNO,@S1,@S2,@S3
WHILE(@@FETCH_STATUS=0)
BEGIN
SET @TOTAL = @S1 + @S2 + @S3
SET @AVG = @TOTAL/3
IF @S1>=35 AND @S2>=35 AND @S3>=35
SET @RES='PASS'
ELSE
SET @RES='FAIL'
INSERT INTO RESULT VALUES(@SNO,@TOTAL,@AVG,@RES)
FETCH NEXT FROM C1 INTO @SNO,@S1,@S2,@S3
END
CLOSE C1
DEALLOCATE C1
1 80 90 70
2 30 60 50
08-NOV-23
SCROLLABLE CURSOR :-
------------------------------------
=> forward only cursor supports only FETCH NEXT statement but scrollable
cursor supports the following fetch statements.
EX :-
===============================================================
1 syntax errors
2 logical errors
3 runtime errors
=> errors that are raised during program execution are called runtime errors
ex :- declare @x tinyint
set @x = 1000 => runtime error
print @x
=> if any statement causes runtime error then sql server displays error message ,
to replace system generated message with our own simple and user
friendly message then we need to handle that runtime error.
BEGIN TRY
statements => statements causes exception
END TRY
BEGIN CATCH
statements => statements handles exception
END CATCH
=> in try block if any statement causes exception then control transferred to
catch block and executes the statements catch block.
ex :-
09-nov-23
severity level :-
---------------------
state :-
-----------
example 1 :-
=> write a prog to increment specific employee sal by specific amt and
sunday updates are not allowed ?
example 2 :-
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 C 20000
SP_DROPMESSAGE 50001
10-NOV-23
1 stored procedures
2 functions
3 triggers
SUB-PROGRAMS :-
---------------------------
1 stored procedures
2 functions
Advantages :-
-------------------
1 modular programming :-
----------------------------------
=> with the help of procedures & functions a big T-SQL program can be
divided into small modules.
2 reusability :-
-------------------
=> procedures & functions can be called from front-end applications like
java,.net and procedures reduces no of requests going to db and improves
performance.
4 improves performance :-
--------------------------------
STORED PROCEDURES :-
-------------------------------------
=> a procedure is a named T-SQL block that accepts some input and performs
some action on db and may or may not returns a value.
=> procedures are created to perform one or more dml operations on tables
parameters :-
-------------------
1 INPUT (DEFAULT)
2 OUTPUT
main procedure
A--------------------------------------> X (INPUT)
B <---------------------------------------- Y (OUTPUT)
Execution :-
1 from ssms
2 from t-sql program
3 front-end applications
from ssms :-
-----------------
EXECUTE raise_salary
Execution :-
----------------
11-NOV-23
Execution :-
----------------
DECLARE @s MONEY
EXECUTE raise_salary 100,1000,@s OUTPUT
PRINT @s
=> while execution if we don't pass value to @amt then sql server assigns
default value.
Execution :-
DECLARE @s MONEY
EXECUTE raise_salary 100 ,default,@s OUTPUT
PRINT @s
DECLARE @s MONEY
EXECUTE raise_salary @eno=100,@newsal=@s OUTPUT
PRINT @s
ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
EXECUTION :-
DECLARE @b MONEY
EXECUTE DEBIT 100,15000,@b OUTPUT
PRINT @b
13-NOV-23
=> create procedure that accepts deptno and returns list of employees working for
that dept ?
Execution :-
Assignment :-
=> when predefine functions not meeting our requirements then we create
our own functions called user define functions.
=> a function is also a named T-SQL block that accepts some input
and performs some calucation and must return a value.
1 for calculations
2 to fetch data from table
syntax :-
Example 1 :-
Execution :-
1 sql commands
2 another t-sql program
3 front-end applications
Execute :-
Example 1 :-
=> create a function that accepts deptno and returns list of employees
working for that dept ?
Execution :-
Example 2 :-
=> create following procedures & functions to implement variou bank txns ?
ACCOUNTS
ACCNO ACTYPE BAL
TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
CREATE SEQUENCE S1
START WITH 1
INCREMENT BY 1
MAXVALUE 99999
PROCEDURES FUNCTIONS
SCALAR TABLE
Droping :-
---------------
===============================================================
16-nov-23
TRIGGERS :-
-------------------
=> a trigger is also a named T-SQL block like procedure but executed implicitly
by sql server whenever user submits DML commands.
1 to control dmls
2 to enforce complex rules & validations
3 to audit day-to-day operations on tables
AFTER triggers :-
-------------------------
=> if trigger is after then sql server executes the trigger after executing dml
INSTEAD OF triggers :-
--------------------------------
=> if trigger is instead of then sql server executes the trigger instead of
executing dml
example 1 :- create trigger to not to allow dmls on emp table on sunday ?
Testing :-
Testing :-
Testing :-
Testing :-
UPDATE EMP SET EMPNO = 999 WHERE EMPNO = 100 => error
17-NOV-23
Magic Tables :-
---------------------
1 INSERTED
2 DELETED
=> These tables are called magic tables because they are created and deleted
automatically
=> data affected by dml commands copied to magic tables.
=> record user is trying to insert is copied to inserted table.
=> record user is trying to delete is copied to deleted table.
=> record user is trying to update is copied to both inserted & deleted tables.
Testing :-
UPDATE EMP SET SAL = 500 WHERE EMPNO = 100 => ERROR
=> create trigger to insert details into emp_resign when employee resigns ?
EMP_RESIGN
EMPNO ENAME HIREDATE DOR
Testing :-
INSTEAD OF trigger :-
--------------------------------
=> if trigger is instead of then sql server executes the trigger instead of
executing dml
ex :- create trigger to not to allow more than 4 employees per dept ?
EMP33
ENO ENAME DNO
1 A 10
2 B 10
3 C 10
4 D 10
5 E 10 => NOT ALLOWED
Testing :-
AFTER INSTEAD OF
IF COND IF COND
BEGIN RAISERROR
ROLLBACK ELSE
RAISERROR DML
END
SELECT x.name,y.name
FROM SYS.triggers AS X INNER JOIN sys.tables AS Y
ON X.parent_id= y.object_id
18-nov-23
Auditing :-
---------------
ex :-
EMP_AUDIT
UNAME OPERATION OPTIME NEW_ENO NEW_ENAME NEW_SAL OLD_ENO OLD_ENAME
OLD_SAL
CREATE TABLE EMP_AUDIT
(
UNAME VARCHAR(10),
OPERATION VARCHAR(10),
OPTIME DATETIME,
NEW_ENO INT,
NEW_ENAME VARCHAR(10),
NEW_SAL MONEY,
OLD_ENO INT,
OLD_ENAME VARCHAR(10),
OLD_SAL MONEY
)
Testing :-
------------
==========================================================================
Dynamic SQL :-
----------------------
=> SQL commands generated at runtime are called dynamic sql commands
=> Dynamic sql is useful when we don't know tablenames and column names until
runtime
=> Dynamic sql that you want to execute should be passed as a string to EXEC.
Execution :-
----------------
20-NOV-23
==========================================================================
BACKUP :-
---------------
21-NOV-23
Temporary Tables :-
---------------------------
=> Temporary tables exists upto the session , once session closes temporary
tables are
deleted automatically.
=> Local Temp Tables are accessed with in the db in which it is created
Method 1 :-
METHOD 2 :-
SELECT * INTO #TEMP FROM EMP
=> Global Temporary Tables created in one connection and can be accessed in
another connection
Table variable :-
----------------------
DECLARE @t TABLE
(
ENO INT,
ENAME VARCHAR(10),
SAL MONEY
)
INSERT INTO @t
SELECT EMPNO,ENAME,SAL FROM EMP
SELECT * FROM @t
IDENTITY :-
-------------------
SID SNAME
1 A
2 B
3 C
4 D
22-nov-23
Normalization :-
----------------------
=> Normalization is set of rules and each rule is called one normal form.
1NF
2NF
3NF
BCNF
4NF
5NF
Ex :-
BILL
BILLNO BDATE CCODE NAME ADDR ICODE NAME RATE QTY VALUE
TBILL
1000 22- 100 A HYD 1
1000 22- 100 A HYD 2
3
20
1NF :-
---------
BILL
BILLNO BDATE CCODE NAME ADDR ICODE NAME RATE QTY VALUE
TBILL
s s s s s m
m m m m s
=> in the above table some attributes are single valued and some attributes are
multi valued
so the table is not according to 1NF , so decompose the table as follows
BILL
BILLNO BDATE CCODE NAME ADDR TBILL
------------
BILL_ITEMS
BILLNO ICODE NAME RATE QTY VALUE
-----------------------
1000 1 A 50
1000 2
1000 3
1001 1 A 50
1001 2
1002 1 A 50
=> in the above table when icode is repeated name & rate are also repeated ,
so
apply 2NF to reduce redundency.
2NF :-
---------
1 if it is in 1NF
2 if there are no partial dependencies in it
partial dependency :-
----------------------------
R(A,B,C,D) A => pk
TABLE 1 :-
BILL
BILLNO BDATE CCODE NAME ADDR TBILL according to 2NF
------------
TABLE 2 :-
BILL_ITEMS
BILLNO ICODE NAME RATE QTY VALUE
-----------------------
=> above table contains partial dependency , so table is not according to 2NF ,
so
decompose the table as follows
TABLE 2 :-
ITEMS
ICODE NAME RATE
----------
TABLE 3 :-
BILL_ITEMS
BILLNO ICODE QTY VALUE
-------------------------
3NF :-
---------
1 if it is in 2NF
2 if there are no transitive dependencies in it
Transitive dependecy :-
------------------------------
R(A,B,C,D) A => pk
TABLE 1 :-
BILL
BILLNO BDATE CCODE NAME ADDR TBILL according to 2NF
------------
CUST
CCODE NAME ADDR
-----------
BILL
BILLNO BDATE TBILL CCODE
-----------
TABLE 2 :-
ITEMS
ICODE NAME RATE
----------
TABLE 3 :-
BILL_ITEMS
BILLNO ICODE QTY VALUE
-------------------------
AFTER 3NF :-
CUST
CCODE NAME ADDR
-----------
BILL
BILLNO BDATE CCODE TBILL
-----------
ITEMS
ICODE NAME RATE
---------
BILL_ITEMS
BILLNO ICODE QTY VALUE
-----------------------
========================================================================
=> both operators are used to check whether record exists in the table or not
SELECT columns
FROM tabname
WHERE EXISTS (SELECT STATEMENT)
Example :-
CUSTS CUSTT
CID NAME ADDR CID NAME ADDR
1 A HYD 1 A HYD
2 B MUM 2 B MUM
3 C DEL
SELECT *
FROM CUSTS AS S
WHERE EXISTS (SELECT * FROM CUSTT WHERE CID = S.CID)
SELECT *
FROM CUSTS AS S
WHERE NOT EXISTS (SELECT * FROM CUSTT WHERE CID = S.CID)
using IN , NOT IN :-
----------------------------
SELECT *
FROM CUSTS
WHERE CID IN (SELECT CID FROM CUSTT)
1 A HYD
2 B MUM
SELECT *
FROM CUSTS
WHERE CID NOT IN (SELECT CID FROM CUSTT)
1
2
3 C DEL
sql server recommends EXISTS ,NOT EXISTS instead of IN, NOT IN because EXISTS,
NOT EXISTS gives good performance than IN,NOT IN
in T-SQL :-
-------------------
Assignment :-
-------------------
DEPT EMP
DNO DNAME LOC EMPNO ENAME SAL DNO
10 HR 1 A 4000 10
20 IT 2 B 3000 20
30 SALES
Roles
SUMMARY :-