0% found this document useful (0 votes)
7 views148 pages

Ash

This document provides information on database management systems and SQL. It discusses topics such as DBMS software, data types, database architectures, CRUD operations, transaction processing, database modeling with tables and keys, and SQL. Databases are used to organize and store data in an accessible way. A DBMS acts as an interface to create, manage and query the data in databases. SQL is the standard language used to communicate with relational database management systems.

Uploaded by

lm9696668
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views148 pages

Ash

This document provides information on database management systems and SQL. It discusses topics such as DBMS software, data types, database architectures, CRUD operations, transaction processing, database modeling with tables and keys, and SQL. Databases are used to organize and store data in an accessible way. A DBMS acts as an interface to create, manage and query the data in databases. SQL is the standard language used to communicate with relational database management systems.

Uploaded by

lm9696668
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 148

29-03-2022

==============
DBMS------Database Management System

BI --BUSINESS INTELLIGENCE----POWER BI , MSBI ,TABLEAUE


Data Scientist-----python/R/matlab---MACHINE LEARNING, DEEP LEARNING.....
Web development----.NET, PHP, DJANGO, JAVA
SQL DEVELOPER------ 3/4 YEARS OF EXPERIENCE
SQL DBA----------------CLOUD TECHNOLOGY......

DATA--------DATA IS EVERY WHERE

BUSINESS GENERATES DATA

FLIPKART---AMAZON ----MANTRA....

EVERY BUSINESS WILL HAVE SOME OBJECTS OR ENTITIES ---- EMPLOYEES, CUSTOMERS, PRODUCTS

DATABASE------A DATABASE IS AN ORGANIZED COLLECTION OF DATA SO THAT IT CAN BE EASILY


ACCESSED AND
MANAGED.

======================================================================================
====================
DATABASE --- A PLACE TO STORE THE DATA ---DIRECTLY WE CAN NOT STORE DATA INSIDE
DATABASE ---WE NEED AN
INTERFACE------WHICH IS DBMS SOFTWARE

SQL SERVER ----A DBMS SOFTWARE----WE WILL CREATE AND MANAGE THE DATABASE WITH HELP OF
DBMS

SQL SERVER -- RELATIONAL DATABASE MANAGEMENT SYSTEM ---MR. CODD ----DATA IS STORED IN
FORM OF RELATIONS
RELATION ---TABLE
======================================================================================
========================
CLIENT SERVER ARCHITECTURE
1. SERVER
2. CLIENT

SERVER:
=========
1. SERVER IS A SYSTEM WHERE SQL SERVER IS INSTALLED AND RUNNING
2. INSIDE THE SERVER, SQL SERVER MANAGES THE DATABASES
3. SQL SERVER RECEIVES REQUESTS FROM CLIENT AND PROCESS THE REQUEST

CLIENT:
========
CLIENT IS A SYSTEM WHERE USER CAN:
1. CONNECT TO THE SERVER
2. SUBMIT YOUR REQUESTS TO SERVER SELECT * FROM EMPLOYEE
3.RECEIVES RESPONSE FROM SERVER

CLIENT TOOL ---SSMS

AT DEVELOPER SYSTEM WE NEED SSMS


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

TYPES OF DATABASES
1. OLTP DB(ONLINE TRANSACTION PROCESSING)
2.OLAP DB(ONLINE ANALYTICAL PROCESSING)

OLTP --------FOR STORING DAY TO DAY TRANSACTIONS ----MINIMAL REDUNDANCY OF DATA---


NORMALIZED STRUCTURE
FOR ANALYSIS PURPOSE OLTP IS NOT GOOD
OLAP ------ OLAP IS GOOD FOR ANALYSIS PURPOSE

30-03-2022
===============================================================================
CRUD: DAY TO DAY OPERATIONS ON DB INCLUDES ---CREATE, READ, UPDATE , DELETE
===============================================================================

DATA ----- TEMPORARY MEMORY --RAM----------VARIABLES


DATA ------PERMANENT STORAGE ---HDD, SSD----FILES, DATABASE
=================================================================================

DATA MAY BE OF TWO TYPES


1. STRUCTURED DATA--------WE WILL HAVE A DATA IN FORM ROW AND COLUMNS------SQL
DATABASES ARE GOOD FOR MANAGING
2. UNSTRUCTURED DATA ----VIDEOS, IMAGES, SOCIAL MEDIA POST, MOBILE ACTIVITY----NoSQL
DATABASES ARE GOOD FOR MANAGING
====================================================================================
DBMS-----
IT IS A SOFTWARE USED TO CREATE AND MANAGE YOUR DATABASES
IT ACTS AS AN INTERFACE BETWEEN AN END USER AND A DATABASE WHICH ALLOWS USER TO
CREATE, READ , UPDATE AND DELETE
DATA IN THE DATABASES
FMS
HDBMS
NDBMS

RDBMS --E.F.CODD
ORDBMS --- OBJECT RELATIONAL DBMS (ADDED THE CONCEPTS OF OOPS + RDBMS)
OOPS --REUSABILITY ------INHERITANCE, CLASSES, OBJECTS.......

GOD DECIDED TO CREATE HUMAN ----CLASS ----A BLUE PRINT -------TWO EYES ---TWO LEGS ---
WALK ..TALK ....LEARN
OBJECT-----
PRAVEER, NARAYAN. SANTOSH...TARUN

RDBMS --------
ORACLE----ORACLE SQL
SQL SERVER -----MICROSOFT SQL
DB2 -------------IBM SQL
MYSQL ---------ORACLE SQL
POSTGRESQL----POSTGRESSQL FORUM DEVELOPMENT ---OPEN SOURCE SQL

ORDBMS--
ORACLE
SQL SERVER
POSTGRESQL

==============================================================================
RDBMS FEATURES:
1. Easy to access and manipulate data
2. less redundancy ---less duplicate data
3. More security
4. supports data integrity-- data quality.. the term data integrity referes to the
accuracy and consistancy of the data
domain integrity--colum data types , range of values are acceptable
entity integrity-- in each table there should be no duplicate row
referential integrity----for every entry in fk there should be matching entry in pk
5. supports data sharing
6. supports transaction

transaction ----- a logical unit of work----an action or series of action carried out
by an user or an application program which
reads or updates
the content of database
======================================================================================
========

PRODUCTS
PRODUCTKEY PRODUCTNAME FLAVOR WEIGHT
1 BOURNVITA CHOCKLATE 1KG
2. BOURNVITA CHOCKLATE 500GM
3. BOURNVITA VANILLA 1KG
4. HORLICKS CHOCKLATE 1KG

CUSTOMER
CUSTOMERKEY CUSTOMERNAME CUSTOMERMOBILE CUSTOMERADD
1 PRAVEER 87XX
NOIDA
2. NARAYAN 98XX
BHUV
3. SANTOSH 94XX
HYD

SALES
DATE CUSTOMERKEY PRODUCTKEY QTY UNITCOST
22FEB 2 4
1 500
22FEB 1 1
2 300
22FEB 5 1
3 100
======================================================================================
============

RDBMS -- RELATIONAL DATABASE MANAGEMENT SYSTEM


E.F.CODD
1. IN RDBMS ...THE DATA SHOULD BE ORGANIZED IN TABLES----RELATIONS(TABLES)---- IN FORM
OF ROWS AND COLUMS -- STRUCTURED
2. EVERY TABLE MUST CONTAIN A KEY TO UNIQUELY IDENITIFY THE RECORDS

PRODUCTS
PRODUCTKEY PRODUCTNAME FLAVOR WEIGHT
1 BOURNVITA CHOCKLATE 1KG
2. BOURNVITA CHOCKLATE 500GM
3. BOURNVITA VANILLA 1KG
4. HORLICKS CHOCKLATE 1KG

TABLE(RELATION) -- PRODUCTS --ENTITY----


COLUMNS -----FIELDS/ATTRIBUTES/COLUMNS--------NAME AND ITS TYPE
ROWS-------- ROW/RECORD/TUPLE

RDBMS IS BASED ON RELATIONAL MODEL-----SET THEORY AND PREDICATE LOGIC

SET----- AN UNORDERED COLLECTION OF DISTINCT DATA/OBJECT


ORDER OF COLUM DOES NOT MATTER.--> COLUMN WILL BE RECOGNIZED BY ITS NAME
ORDER OF ROW DOES NOT MATTER -----> ROW WILL BE RECOGNIZE BY PRIMARY KEY
WE CAN NOT HAVE DUPLICATE ROW

PREDICATE LOGIC ---A PREDICATE IS A PROPERTY OR AN EXPRESSION THAT EITHER HOLDS OR


DOES NOT HOLD
IN SIMPLER WORDS , IS EITHER TRUE OR FALSE

WE CAN SET COLUM DATA TYPE


WE CAN SET SALARY RULES.....
======================================================================================
=========================
31-03-2022
TSQL-Transact SQL
=>SQL STANDS FOR STRUCTURED QUERY LANGUAGE
=> SEQUEL===> STRUCTURED ENGLISH QUERY LANGUAGE
=> IT IS A LANGUAGE USED TO COMMUNICATE WITH RDBMS SOFTWARE ----SQL SERVER, ORACLE
,MYSQL..POSTGRESQL
=>USER COMMUNICATE WITH RDBMS SOFTWARE BY SENDING COMMANDS CALLED QUERIES
=> A QUERY IS A COMMAND OR INSTRUCTION SUBMITTED TO RBMS SOFTWARE TO PERFORM SOME
OPERATIONS ON DATABASE
=>SQL IS COMMON TO ALL THE RDBMS SOFTWARES
=>SQL IS BOTH AN ANSI AND ISO STANDARD LANGUAGE
=> TSQL - MICROSOFT'S OWN VARIANT OF SQL
=TSQL IS BOTH THE SUBSET AND SUPERSET OF SQL
======================================================================================
============================
SQL DEVELOPER SQL DBA
CREATING TABLES INSTALLATION OF
SQL SERVER
CREATE VIEWS CREATE
DATABASES
CREATE SYNONYMS CREATE LOGINS
CREATE SEQUENCES DB BACKUP AND
RESTORE
CREATE INDEXES DB EXPORT AND
IMPORT
CREATED STORED FUNCTIONS DB UPGRADATION AND MIGRATION
CREATE TRIGGERS DB MIRRORING
(COPY DB TO DIFFERENT LOC) & REPLICATION(COPYING DATA AND DATABASE OBJECTS
CREATE STORED PROCEDURES FROM ONE DB TO ANOTHER DB)
WRITE QUERIES PERFORMANCE
TUNING
======================================================================================
===================================
YOU CAN INSTALL 50 INSTANCE OF THE SQL SERVER ON ONE SYSETM
TO PROPER UTILIZE THE RESOURCES

OUT OF 50 ----ONLY 1 CAN BE DEFUALT INSTANCE AND REST 49 HAS TO BE NAMED INSTANCE
OUT OF 50 ----I CAN MAKE ALL 50 TO BE NAMED INSTANCE

DEFAULT INSTANCE ---COMPUTER'S NAME--- YOU CAN HAVE ONLY 1 DEFAULT INSTANCE ----
PRAVEER(COMPUTER NAME)---IPADDRESS
NAMED INSTANCE ------YOU WILL GIVE NAME TO THE INSTANCE-----------
PRAVEER\AMAZON,,,,,PRAVEER\FLIPKART
======================================================================================
========================================
AUTHENTICATION

WINDOWS AUTHENTICATION ---USER IDENITY IS CONFIRMED BY WINDOWS

SQL SERVER AUTHENTICATION---WE HAVE TO PROVIDE LOGINDETAILS AND PASSWORDS

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

WHEN EVER WE WILL CREATE A DB TWO FILES ARE CREATED


1. PRIMARY DATA FILE-- IT STORES THE OBJECTS LIKE TABLES,VIEWS , STORED PROC etc AND
THEIR ASSOCIATED DATA
IT IS ALSO KNOWN AS MASTER DATA FILE and HAS
EXTENSION OF (.mdf)
2. TRANSACTION LOG FILE-- IT CAPTURES YOUR COMMANDS ..INSERT, UPDATE ,DELETE ...IT IS
USED FOR RECOVERY PURPOSE
IT HAS ENTENSION (.ldf)
======================================================================================
=====================================
01-04-2022

WHEN WE CREATE A DB A FILE GROUP IS CREATED ---PRIMARY FILE GROUP


PRIMARY GROUP WILL HAVE PRIMARY DATA FILE

FILE GROUP ----STORES DATA FILES

WE CAN HAVE SEVERAL DATA FILES AS WELL SEVERAL FILE GROUPS AS WELL SEVERAL LOG FILES
IT IS RECOMMENDED TO HAVE JUST ONE LOG FILE WE CAN HAVE MULTIPLE DATA FILES
MULTIPLE DATA FILES ---- PERFORMANCE AND BACK UP

SECONDARY DATA FILES HAVE EXTENSION (.ndf)==> n means no master data files
.mdf
.ndf
.ldf

PRIMARY FILE GROUP MAY CONTAIN --PRIMARY DATA FILE AND ALSO SECONDARY DATA FILES IF
CREATED
WE CAN HAVE SEVERAL FILE GROUPS----EVERY FILE GROUP CAN STORE DATA FILES

PAGE ------SIZE 8 KB
EXTENT ----8 CONTIGUOUS PAGES FORM A EXTENT------64KB
UNIFORM EXTENT-----ALL PAGES OF AN EXTENT ARE ASSIGNED TO SINGLE OBJECT
MIXED EXTENT(RARE)-------ONE PAGE FOR ONE OBJECT

======================================================================================
============================
COLUMN OF A TABLE , VARIABLE OR ANY EXPRESSION WILL HAVE SOME KIND OF DATA TYPE

1. BY SPECIFYING DATA TYPE ----WE CAN SPECIFY WHAT KIND OF DATA IS TO BE STORED
2. BY SPECIFYING DATA TYPE --- WE ALSO SPECIFY ACTUALLY HOW MEMORY WILL BE OCCUPIED
EVERY DATA TYPE MAY OCCUPY DIFFERENT MEMORY SIZE
======================================================================================
===============================
STRING/CHARACTER DATA TYPE
1. NON UNICODE / STANDARD DATA ---A-Z, a-z 0-9 , special characters (256 characters)
2 UNICODE CHARACTERS--- 65536 characters ---WE CAN HAVE CHARACTERS OF OTHER LANGUAGES
AS WELL

======================================================================================
==============================
1.NON UNICODE / STANDARD DATA -

=>ONE BYTE IS USED FOE EACH CHARACTER IN CHAR AND VARCHAR


=> TWO EXTRA BYTES ARE NEEDED IN VARIABLE LENGTH STRINGS FOR OVERHEAD FOR EXAMPLE IN
VARCHAR AND VARCHAR(MAX)

char(n) n bytes Fixed-length string of characters where n


is the number of bytes
ranging from 1 to 8000. default
value of n is 1

varchar(n) Variable-length string of characters


where n is the maximum
number of bytes ranging from 1
to 8000.

varchar(max) character data upto 2GB

EXAMPLE: NAME CHAR(10)


MOBILE CHAR(10)
ADHAR CHAR(10)
NAME VARCHAR(10)
======================================================================================
========================
CHAR(n)

=> IT IS FIXED LENGTH STRING DATA TYPE


=> IT CONSUMES n BYTES SPECIFIED IN CHAR(n)
=>IN CHAR(n) --n BYTES ARE RESEARVED BY SYSTEM..
=>SO IF INPUT IS LESS THAN n CHARACTERS THEN EXTRA MEMORY IS WAISTED
=>CHAR IS GOOD FOR FIXED LENGTH STRING LIKE POSTAL CODE, MOBILE NUMBER , ADHAR NO.

=> SO IF CHAR(10) IS CHOSEN FOR LET SAY NAME --- NAME CHAR (10) THEN 10 BYTES WILL
BE REASERVED
=>> NOW IF NAME IS 'PRAVEER' THEN STILL 10 BYTES ARE USED..THAT MEANS 3 BYTES ARE
WAISTED
=> SIMILARLY IF NAME IS 'ANU' THEN STILL 10 BYTES ARE USED THAT MEANS 7 BYTES ARE
WAISTED
=>
=> MAXIMUM CHARACTERS CHAR CAN HAVE IS 8000 AS MAX IT CAN HAVE 8000 BYTES
=> IF YOU PASS MORE THAN N CHARACTERS WHILE INSERTING DATA YOU WILL GET AN ERROR

POSTALCODE CHAR(6)
MOBILE CHAR(10)
GENDER CHAR(1)
CHAR(50)
======================================================================================
===============================
VARCHAR(n)
=> IT IS VARIABLE LENGTH DATA TYPE

=>NUMBER OF TOTAL BYTES USED, DEPENDS ON ACTUAL NUMBER OF CHARACTERS INSERTED RATHAR
THEN
MAX LENGTH SPECIFIED AS n IN VARCHAR(n)
=>EXTRA BYTES ARE RELEASED..SO BETTER UTILIZATION OF MEMORY
=>TWO BYTES ARE NEEDED IN VARCHAR FOR OVERHEAD

=> LET SAY => EXAMPLE1:


NAME VARCHAR(10) ==> SO MAX CHARACTERS IT CAN HAVE IS 10 AS
USES 1 BYTE FOR EACH CHARACTER
NOW SUPPOSE ACTUAL NAME STORED IS 'ANU' , SO TOTAL BYTES
USED WILL BE:
3BYTES FOR NAME + 2 BYTES OF OVERHEAD = 5 BYTES IN TOTAL

EXAMPLE2:
NAME VARCHAR(8) ==> SO MAX CHARACTERS IT CAN HAVE IS 8 AS
USES 1 BYTE FOR EACH CHARACTER
NOW SUPPOSE ACTUAL NAME STORED IS 'RAMA' , SO TOTAL BYTES
USED WILL BE:
4 BYTES FOR NAME + 2 BYTES OF OVERHEAD =6 BYTES

=>MAXIMUM CHARACTERS VARCHAR CAN HAVE IS 8000 AS MAX IT CAN HAVE 8000 BYTES
=> IF YOU PASS MORE THAN N CHARACTERS YOU WILL GET AN ERROR

=> DONT USE VARCHAR FOR THE COLUMN WHICH TENDS TO UPDATE OR CHANGE FREQUENTLY

ADDRESS VARCHAR(40)

170 MMIG AGRA 13 HNO .43, GALI NO 43, AREA - NEAR CHOWS,
BORIWALI, MUMBAI PRAVEER SHARMA
DRESS CHAR(100) HNO .43, GALI NO 43, AREA - NEAR CHOWS,
BORIWALI, MUMBAI
PRAVEER
=============================================================================
======================
04-04-2022
VARCHAR(MAX) ---- WHEN THE CHARACTER LIMIT EXCEEDS 8000 USE VARCHAR(MAX)
IT CAN STORE CHARACTERS DATA UPTO 2GB
======================================================================================
=================
UNICODE CHARACTERS-- 65536 CHARACTERS--WE CAN HAVE CHARACTERS OF OTHER LANGUAGES AS
WELL
=>NCHAR(N), NVARCHAR(N) AND NVARCHAR(MAX) ARE USED FOR UNICODE DATA

=>BUT UNICODE USES 2 BYTES FOR EACH CHARACTER

N STANDS FOR NATIONAL LANGUAGE CHARCTER SET


-------------------------------------------------------
NCHAR(N) -- FIXED LENGTH STRING OF UNICODE CHARACTERS WHERE N IS THE NUMBER OF BYTE
PAIRS RANGING FROM 1-4000

NCHAR(5)--- -5 UNICODE CHARACTERS ---5 BYTE PAIRS ----10 BYTES WILL BE RESEARVED
=> LIKE CHAR(N) EXTRA MEMORY IS WAISTED IN NCHAR(N)
--------------------------------------------------------------------------------------
----------------------------------------------

NVARCHAR(N)--- Variable-length string of Unicode characters where n is the maximum


number of byte-pairs ranging from 1 to 4000
=> EXTRA BYTES WILL BE RELEASED
=> TWO BYTES ARE NEEDED IN NVARCHAR(N) FOR OVERHEAD

MAXIMUM NUMBER OF BYTE - PAIRS RANGE FROM 1-4000


--------------------------------------------------------------------------------------
------------------------
NVARCHAR(MAX)----- IT CAN STORE UNICODE CHARACTER DATA UPTO 2GB

--------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
========================================================================
Binary Types :-
---------------
=> binary types allows binary data that includes audio,video,images etc
They describe data objects being represented in the internal format of the system.
They are used to store bit strings. For this
reason, the values are entered using hexadecimal numbers.

BINARY
VARBINARY
VARBINARY(MAX)

binary :-
---------
BINARY(N)

=> allows binary data upto 8000 bytes


=> extra bytes are wasted
ex :- photo binary(1000)

varbinary :-
-------------
VARBINARY(N)

=> allows binary data upto 8000 bytes


=> extra bytes are released
ex :- photo varbinary(1000)

varbinary(max) :-
-----------------
VARBINARY(MAX)
=> allows binary data upto 2GB
ex :- photo varbinary(max)

======================================================================================
=======
Integer: Integer data types hold numbers that are whole, or without a decimal point.

bigint 8 bytes Large integers from -


9,223,372,036,854,775,808 through
9 ,223,372,036,854, 775,807.
int 4 bytes Integers from -2,147,483,648 through
2,147,483,647.
smallint 2 bytes Small integers from -32,768 through 32,767.
tinyint 1 byte Very small positive integers from 0
through 255.
bit 1 byte Integers with a value of 1 or 0 or NULL

SQL Server optimizes storage of BIT columns. If a table has 8 or fewer bit columns,
SQL Server stores them as 1 byte.
If a table has 9 up to 16 bit columns, SQL Server stores them as 2 bytes, and so on.

ex :- age TINYINT
empid SMALLINT
aadharno BIGINT

======================================================================================
==================
Currency--
money 8 bytes Monetary values with four
decimal places from
-922,337,203,685,477.5808
through
922,337,203,685,477.5807.

smallmoney 4 bytes Monetary values with four decimal


places
from -214,748.3648
through 214,748.3647.

EX : SALARY SMALLMONEY
BAL MONEY
======================================================================================
=========================
DECIMAL(p,s) :-
----------------
=> Allows real numbers i.e. numbers with decimal part
p => precision => total no of digits allowed.The default precision is 18 and maximum
38.
s => scale => no of digits allowed after decimal. The default value of scale is 0.
Ex of Precision: 3457.78543 ---------- Precision =9
Ex of Scale: 3457.78543 ---------- Scale = 5

Precision Stored Memory


1-9 5 bytes
10-19 9 bytes
20-28 13 bytes
29-38 17 bytes
ex :- SALARY DECIMAL(7,2)
5000=> 5000.00
5000.50 => 5000.50
50000.50 => 50000.50
50000.507=>50000.51

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

DATE- TIME DATA TYPE

date 3 BYTES Dates only (no time


part) from January 1, 0001 through December 31, 9999.
time(n) 3 -5 BYTES Times only (no date part)
from 00:00:00.0000000 through

23:59:59.9999999, with an accuracy of .0000001 seconds. n is the number


of digits
from 0 to 7 that are used for fractional second precision.
datetime 8 BYTES January 1, 1753, through
December 31, 9999 with time values
00:00:00
through 23:59:59.997

datetime2(n) 6-8 BYTES Dates from January 1, 0001


through December 31, 9999 with time values
from
00:00:00.0000000 through 23:59:59.9999999.

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

SQL_VARIANT :

This Data type can be used to store values of various data types at the same time,
such as numeric values, strings, and date values.
The sql_variant data type allows a table column or a variable to hold values of any
data type with a maximum length of 8000 bytes
Example :
value SQL_VARIANT ,

======================================================================================
===========
Xml:
Xml Stores XML formatted data. Maximum 2GB

======================================================================================
============
ROWVERSION
You can use timestamp columns to build custom data replication and synchronization
solutions.
If you update a row, the ROWVERSION column gets a new value:
============================================================================
large value data types:
varchar(max)
nvarchar(max)
varbinary(max)
========================================================================
CREATING A TABLE
===============

CREATE TABLE <TABLENAME> ( COLNAME1 DATATYPE(SIZE),


COLNAME2, DATATYPE(SIZE))

RULES:
ALWAYS RECOMMENDED TO START TABLE NAME WITH ALPHABET
128 CHARS CAN BE USED FOR TABLE NAME
128 CHARS CAN BE USED FOR COLUMN NAME
WE CAN HAVE 1024 COLUMN IN A TABLE

EXAMPLE:
CREATE A TABLE WITH FOLLOWING STRUCTURE

CREATE INSIDE A DEFAULT SCHEMA----


TABLENAME--EMP
COLUMN NAMES ARE THESE: EMPID ENAME JOB SAL AGE HIREDATE

CREATE TABLE emp (


empid TINYINT,
ename VARCHAR(20),
job VARCHAR(10),
sal SMALLMONEY,
age TINYINT,
hiredate DATE)

THE ABOVE COMMAND CREATE TABLE STRUCTURE/DEFINITION/METADATA WHICH INCLUDES ,


COLUMNS, DATATYPE , SIZE.

--------------------------------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------------------------------
-------------------------------------------------------------
SP_HELP

=> THE COMMAND TO SEE STRUCTURE OF OBJECT--

SP_HELP <TABLE NAME>


SP_HELP emp
--------------------------------------------------------------------------------------
-------------------------------------------

INSERT DATA INTO THE TABLE


=> "INSERT" COMMAND IS USED TO INSERT THE DATA INTO THE TABLE
=> USING INSERT WE CAN INSERT SINGLE ROW OR MULTIPLE ROWS--
--------------------------------------------------------------------------------------
--------------------------

INSERTING SINGLE ROW

INSERT INTO emp VALUES(100, 'SACHIN','CLERK',5000,35, '2021-12-01');


INSERT INTO emp VALUES(101, 'VIJAY','ANALYST',8000,30, GETDATE());

INSERTING MULTIPLE ROWS

INSERT INTO emp VALUES(102, 'BHARAT','MANAGER',9000,28, '2020-05-15'),


(103, 'SINDHU','CLERK',4000,20,
GETDATE());
--------------------------------------------------------------------------------------
----------------------------
INSERTING NULLS
=> NULLS MEANS MISSING VALUES
=> NULLS CAN ALSO BE ASSUMED AS BLANK OR EMPTY VALUE
=> NULLS CAN BE INSERTED INTO THE TABLE IN TWO WAYS

METHOD1
INSERT INTO emp VALUES(104, 'AJAY', NULL,NULL,30, GETDATE());

METHOD2
INSERT INTO emp(empid, ename, age,hiredate) VALUES(105, 'RAMA', 28, '2019-10-05');
=> REMAINING TWO FIELDS FILLED WITH NULLS
======================================================================================
=====
06-04-2022
OPERATORS IN SQL SERVER
1. ARITHMATIC OPERATORS => + , -. *, / , %(REMAINDER)
2. RELATIONAL OPERATORS => >,<,>=,<=, =, <>(NOT EQUAL)
3. LOGICAL OPERATORS => AND, OR , NOT
4. SPECIAL OPERATORS => BETWEEN, IN, LIKE, IS, ANY, ALL, EXISTS, PIVOT
5. SET OPERATORS=> UNION, UNION ALL, INTERSECT, EXCEPT

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

RETRIEVE OR FETCH THE DATA FROM TABLE


-----------------------------------------------------------
=> SELECT COMMAND IS USED TO FETCH THE DATA FROM THE TABLE
=> USING SELECT COMMAND WE CAN FETCH ALL THE COLUMNS OR SPECIFIC COLUMNS
=> USING SELECT COMMAND WE CAN FETCH ALL THE ROWS OR SPECIFIC ROW

EXAMPLE: SELECT * FROM TABLE NAME


=> THIS COMMAND WILL FETCH ALL COLUMNS AND ALL ROWS OF THE TABLE

=> DISPLAY ALL THE DATA FROM emp TABLE

SELECT * FROM emp;

=> DISPLAY EMPLOYEE NAMES AND THEIR SALARIES FROM EMP TABLE.

SELECT ename, sal FROM emp;

=> DISPLAY EMPLOYEE NAMES AND THEIR AGE FROM EMP TABLE.

SELECT ename,age FROM emp;


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

WHERE CLAUSE

=> IT IS USED TO GET SPECIFIC ROW OR ROWS FROM THE TABLE BASED ON A CERTAIN CONDITION

SELECT COLUMNS FROM TABLE WHERE CONDITION

=> CONDITION SHOULD BE SOME EXPRESSION/RELATION WHICH SHOULD RESULT IN TRUE OR FALSE
=> FOR EVERY ROW OF TABLE, CONDITION WILL BE EVALUATED, NOW IF CONDITION IS TRUE,
CORRESPONDING ROW IS SELECTED
BUT IF CONDITION IS FALSE THAT ROW IS NOT SELECTED

=> DISPLAY THE DETAILS OF EMPLOYEE WHOSE empid IS 103.

SELECT * FROM emp WHERE empid = 103;

=> DISPLAY THE DETAILS OF THE EMPLOYEE WHOSE NAME IS vijay.

SELECT * FROM emp WHERE ename = 'vijay';

=> DISPLAY THE DETAILS OF EMPOLYEES EARNING MORE THAN 5000

SELECT * FROM emp WHERE sal > 5000;

=> DISPLAY EMPLOYEE DETAILS OF THOSE WHO JOINED AFTER 2020.

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

=> DISPLAY EMPLOYEE DETAILS WHO JOINED BEFORE 2020

SELECT * FROM emp WHERE hiredate < '2020-01-01';

======================================================================================
=========
COMPOUND CONDITIONS

=> DISPLAY DETAILS OF EMPLOYEES WHO ARE WORKING AS CLERK AND EARNING MORE THAN 4000?
=> DISPLAY DETAILS OF EMPLOYEES WORKING AS CLERK, MANAGER

OR OPERATOR
WHERE COND1 OR COND2 OR COND3 OR COND4

=> EVEN IF SINGLE CONDITION IS TRUE OUTPUT WILL BE TRUE


=> FOR OUTPUT TO BE TRUE ATLEAST ONE OF THE CONDITION HAS TO BE TRUE

COND1 COND2 RESULT


FALSE FALSE FALSE
FALSE TRUE TRUE
TRUE FALSE TRUE
TRUE TRUE TRUE

AND OPERATORS
WHERE COND1 AND COND2 AND COND3 AND COND4

=> FOR OUTPUT TO BE TRUE ALL OF THE CONDITION HAVE TO BE TRUE


=>EVEN IF SINGLE CONDITION IS FALSE OUTPUT WILL BE FALSE
=> => ALL CONDITIONS SHOULD MET SIMULATANEOUSLY

COND1 COND2 RESULT


FALSE FALSE FALSE
FALSE TRUE FALSE
TRUE FALSE FALSE
TRUE TRUE TRUE
======================================================================================
========================

=> DISPLAY DETAILS OF EMPLOYEES WHO ARE WORKING AS CLERK AND EARNING MORE THAN 4000?

AS BOTH CONIDITION THAT JOB = CLERK AND SALARY > 4000 HAS TO BE MEET SIMULTANEOUSLY --
--> AND OPERATOR WILL BE USED

SELECT * FROM emp WHERE job = 'CLERK' AND SAL > 4000;

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

=> DISPLAY DETAILS OF EMPLOYEES WORKING AS CLERK, MANAGER

SELECT * FROM emp WHERE job = 'CLERK' OR job = 'MANAGER';

======================================================================================
================================
=> DISPLAY THE EMPLOYEE DETAILS WHOSE empid = 100,103, 105

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

======================================================================================
===============================
=> DISPLAY EMPLOYEE DETAILS EARNING MORE THAN 5000 AND LESS THAN 10000

SELECT * FROM emp WHERE sal > 5000 AND sal < 10000;

======================================================================================
==================================
=>DISPLAY EMPOYEE DETAILS WHO JOINED IN 2020

SELECT * FROM emp WHERE HIREDATE >= '2020-01-01' AND HIREDATE <= '2020-12-31';

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

IN OPERATOR
=> WE USE IN OPERATOR FOR LIST COMPARISION
=> WE USE IN OPERATOR FOR '=' COMPARISION WITH MULTIPLE VALUES

WHERE COLNAME IN (V1,V2,V3....) = > (COLNMAE = V1 OR COLNAME = V2 OR COLNAME =V3....)

=> DISPLAY THE EMPLOYEE DETAILS WHOSE empid = 100,103, 105

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

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

=> DISPLAY EMPLOYEE DETAILS WORKING AS CLERK , MANAGER

SELECT * FROM emp WHERE job = 'CLERK' OR job = 'MANAGER';

SELECT * FROM emp WHERE job IN('CLERK', 'MANAGER');

NOT IN
=======

=>=> DISPLAY EMPLOYEE DETAILS NOT WORKING AS CLERK , MANAGER

SELECT * FROM emp WHERE job NOT IN('CLERK', 'MANAGER');


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

BETWEEN OPERATOR

=> WE USE BETWEEN OPERATOR FOR RANGE COMPARISION

SELECT * FROM TABLE WHERE COL1>=V1 AND COL1<=V2

SELECT * FROM TABLE WHERE COL1 BETWEEN V1 AND V2

=>DISPLAY EMPOYEE DETAILS WHO JOINED IN 2020

SELECT * FROM emp WHERE HIREDATE >= '2020-01-01' AND HIREDATE <= '2020-12-31';

SELECT * FROM emp WHERE HIREDATE BETWEEN '2020-01-01' AND '2020-12-31';

=>DISPLAY EMPOYEE DETAILS WHO DID NOT JOIN IN 2020

SELECT * FROM emp WHERE HIREDATE NOT BETWEEN '2020-01-01' AND '2020-12-31';

=> DISPLAY EMPLOYEE DETAILS EARNING BETWEEN 5000 AND 10000

SELECT * FROM emp WHERE sal BETWEEN 5000 AND 10000;

======================================================================================
=============================
07 -04-2022

PRODUCTS TABLE
=============================================
========================================================================
CREATE TABLE PRODUCTS(PID TINYINT, PNAME VARCHAR(20), PRICE SMALLMONEY, CATEGORY
VARCHAR(20), BRAND VARCHAR(20))
======================================================================================
============================

INSERT INTO PRODUCTS VALUES (1, 'REALME2', 8000, 'MOBILE',


'REALME'),

(2, 'REALME2PRO', 10000, 'MOBILE', 'REALME'),


(3, 'REALME2PROMAX', 14000, 'MOBILE',
'REALME'),
(4, 'REALME3MAX', 18000, 'MOBILE', 'REALME'),
(5, 'REDMI9', 9000, 'MOBILE', 'REDMI'),
(6, 'REDMI10', 12000, 'MOBILE', 'REDMI'),
(7, 'REDMIH', 14000, 'MOBILE', 'REDMI'),
(8, 'REDMI11', 15000, 'MOBILE', 'REDMI'),
(9, 'REDMIDUAL', 18000, 'MOBILE', 'REDMI'),
(10, 'SAMSUNGV1', 12000, 'MOBILE', 'SAMSUNG'),
(11, 'SAMSUNGJ2', 8000, 'MOBILE', 'SAMSUNG'),
(12, 'HONOR2', 13500, 'MOBILE', 'HONOR'),
(13, 'HONOR3', 15500, 'MOBILE', 'HONOR'),
(14, 'APPLEIPHONE4', 33500, 'MOBILE',
'APPLE'),
(15, 'APPLEIPHONE5', 43500, 'MOBILE',
'APPLE'),
(16, 'VIVO', 14500, 'MOBILE', 'VIVO'),
(17, 'BOSSV2', 9500, 'HEADPHONE', 'BOSS'),
(18, 'BOSSV3', 12500, 'HEADPHONE', 'BOSS'),
(19, 'MITV1', 12500, 'TV', 'REDMI'),
(20, 'MITV2', 17500, 'TV', 'REDMI')

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

=> DISPLAY THE LIST OF MOBILE PHONES WHOSE PRICE RANGE BETWEEN 10000 AND 15000
--AND BRAND SHOULD BE REALME, SAMSUNG, REDMI
======================================================================================
==========================
SELECT * FROM PRODUCTS WHERE CATEGORY = 'MOBILE'
AND PRICE BETWEEN 10000 AND 15000
AND BRAND IN ('REALME', 'SAMSUNG', 'REDMI')

======================================================================================
==============================
=> DISPLAY EMPLOYEE DETAILS WORKINGS AS CLERK , MANAGER AND EARNING BETWEEN 5000 AND
10000 AND JOINED IN 2021.

SELECT * FROM emp WHERE job IN ('CLERK', 'MANAGER')


AND
sal BETWEEN 5000 AND 10000
AND
hiredate BETWEEN '2021-01-01' AND
'2021-12-31'
======================================================================================
===============================
STUDENT

SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 70 60
3 C 45 25 70

=> DISPLAY THE DETAILS OF THE STUDENTS WHO ARE PASSED


=> PASSING MEANS PASSED IN ALL THE SUBJECTS
=> MIN MARKS = 35 IN EVERY SUBJECT IS PASSING CRITERIA

CREATE TABLE STUDENTS (SNO TINYINT, SNAME VARCHAR(20), S1 TINYINT, S2 TINYINT, S3


TINYINT)

INSERT INTO STUDENTS VALUES(1, 'A', 80, 90, 70),


(2, 'B', 30,70,60),
(3,'C', 45,25,70);

SELECT * FROM STUDENTS WHERE S1>=35 AND S2>=35 AND S3>=35


======================================================================================
============================
LIKE OPERATOR

=> USED FOR PATTERN COMPARISON


SELECT * FROM TABLENAME WHERE COLNAME LIKE PATTERN

% => 0 OR MANY CHARACTERS


_ => FOR EXACTLY ONE CHARACTER

==============================================================================
=> DISPLAY THE DETAILS OF THE EMPLOYEES WHOSE NAME STARTS WITH 'S'?
SELECT * FROM emp WHERE ename LIKE 'S%';

==============================================================================
=> DISPLAY THE DETAILS OF THE EMPLOYEES WHOSE NAME ENDS WITH 'S'?
SELECT * FROM emp WHERE ename LIKE '%S';

==============================================================================
=> DISPLAY THE DETAILS OF THE EMPLOYEES WHO NAME CONTAINS 'S'.

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

==============================================================================
=> DISPLAY THE DETAILS OF THE EMPLOYEES WHERE 3RD CHARACTERS IN THEIR NAME SHOULD BE
'a'

SELECT * FROM emp WHERE ename LIKE '__a%'

==============================================================================
=> DISPLAY THE DETAILS OF THE EMPLOYEES WHERE 'a' IS 3rd CHARACTER FROM THE LAST IN
THEIR NAME

SELECT * FROM emp WHERE ename LIKE '%a__'


==================================================================================
DISPLAY THE DETAILS OF THE EMPLOYEES WHO JOINED IN 2020

SELECT * FROM emp WHERE HIREDATE >= '2020-01-01' AND HIREDATE <= '2020-12-31';

SELECT * FROM emp WHERE HIREDATE BETWEEN '2020-01-01' AND '2020-12-31';

SELECT * FROM emp WHERE HIREDATE LIKE '2020%'


===================================================================================
DISPLAY EMPOLYEE DETAILS WHERE NAME STARTS FROM 'a', 'j','s'
SELECT * FROM emp WHERE ename LIKE 'a%'
OR ename LIKE 'j%'
OR ename LIKE 's%'

SELECT * FROM emp WHERE ename LIKE '[ajs]%'


=====================================================================================
DISPLAY THE EMPOYEE DETAILS WHERE NAME STARTS WITH 'a' - 'p'

SELECT * FROM emp WHERE ename LIKE '[a-p]%'

=====================================================================================
IS OPERATOR
It is not possible to test for NULL values with comparison operators, such as =, <, or
<>.

===> IS OPERATOR IS USED FOR NULL COMPARISON

WHERE COLNAME = NULL ===> NOT POSSIBLE


WHERE COLNAME <> NULL ===> NOT POSSIBLE

FOR NULL COMPARISON WE USE => IS NULL


=> IS NOT NULL

SELECT * FROM STUDENTS WHERE S1 IS NULL


SELECT * FROM STUDENTS WHERE S1 IS NOT NULL
======================================================================================
=======
08-04-2022
DISPLAY THE DETAILS OF EMPLOYEES WHOSE SALARY IS NOT YET DECIDED

SELECT * FROM emp WHERE sal IS NULL

FROM EMP1 TABLE SHOW ME THE RECORDS WHOSE MANAGER IS NOT YET DECIDED

SELECT * FROM emp1 WHERE MGR IS NULL

FROM EMP1 TABLE DISPLAY THE RECORDS OF EMPLOYEES WHOSE COMMISSION IS NULL

SELECT * FROM emp1 WHERE COMM IS NULL

FROM EMP1 TABLE DISPLAY THE RECORDS OF EMPLOYEES WHO TAKE COMMISION

SELECT * FROM emp1 WHERE COMM IS NOT NULL


======================================================================================
====
ORDER BY

=>IF WE FETCH SOME RECORDS FROM THE TABLE WITHOUT ANY SORTING THEN THERE ORDER IS NOT
GUARRANTEED

=>BUT IF WANT THE FETCHED RECORDS IN A PARTICULAR ORDER WE NEED SORTING..

=>FOR SORTING WE USE ORDER BY CLAUSE

=> ORDER BY CLAUSE IS USED TO SORT THE DATA BASED ON ONE OR MORE COLUMS OR BY AN
EXPRESSION

COMPLETE SELECT STATEMENT MAY HAVE ==> SELECT FROM WHERE GROUP BY HAVING ORDER BY

BUT THE ACTUAL EXECUTION WILL BE => FROM WHERE GROUP BY HAVING SELECT ORDER BY

SELECT COLUMNS FROM TABLE NAME ORDER BY COL1 [ASC/DESC], [COL2] [ASC/DESC].........

DEFAULT ORDER IS ASC

===> DISPLAY THE EMPLOYEE LIST NAME WISE IN ASCENDING ORDER from EMP1 TABLE

SELECT * FROM emp1 ORDER BY ename ASC

===> DISPLAY THE EMPLOYEE LIST SALARY WISE IN DESCENDING ORDER from EMP1 TABLE AND
ONLY SHOW THEIR NAME AND SALARY

SELECT ename, sal FROM emp1 ORDER BY sal DESC

===> DISPLAY THE EMPLOYEE LIST AS PER THEIR SENIORITY LEVEL from EMP1 IN DESCENDING
ORDER

SELECT * FROM emp1 ORDER BY HIREDATE ASC

=--> DISPLAY THE EMPLOYEE LIST DEPT WISE ASC AND WITH IN THE DEPARTMENT SALARY WISE
DESC

SELECT * FROM emp1 ORDER BY DEPTNO ASC,SAL DESC

======================================================================================
========================
=> IN FROM EVERY STUDENT IN STUDENT1 TABLE ALSO SHOW THEIR TOTAL MARKS

SELECT *, MATH + PHY + CHEM AS TOTAL FROM STUDENT1

=> DISPLAY THE DETAILS OF THE STUDENTS IN ORDER OF THEIR TOTAL MARKS IN DESCENDING
ORDER

SELECT *, MATH + PHY + CHEM AS TOTAL FROM STUDENT1 ORDER BY MATH + PHY + CHEM DESC

SELECT *, MATH + PHY + CHEM AS TOTAL FROM STUDENT1 ORDER BY TOTAL DESC

======================================================================================
======================
DISPLAY THE DETAILS OF THE STUDENTS IN ORDER OF THEIR TOTAL MARKS IN DESCENDING
ORDER, INCASE THERE IS TIE THEN SORT BY
MATHS IN DESC, IN CASE OF FURTHER TIE SORT BY PHY DESC

SELECT *, MATH + PHY + CHEM AS TOTAL FROM STUDENT1 ORDER BY TOTAL DESC,math DESC,phy
DESC

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

DISPLAY AVERAGE MARKS OF EACH STUDENT IN FRONT OF HIM/HER AND ALSO SORT THE RESULT AS
PER THEIR AVERAGE MARKS DESC

SELECT *, (MATH + PHY + CHEM)/3 AS 'AVG' FROM STUDENT1 ORDER BY 'AVG' DESC
======================================================================================
===========================

=> DISPLAY EMPLOYEES WORKING AS CLERK, MANAGER AND ARRANGE THE LIST SAL WISE DESC
ORDER

SELECT * FROM emp1 WHERE job IN ('CLERK', 'MANAGER') ORDER BY SAL DESC
======================================================================================
==============================
11-04-2022

DISTINCT
===========

=> USED TO ELIMINATE THE DUPLICATES FROM THE SELECT STATEMENT OUTPUT

SELECT DISTINCT COL1, COL2, .....FROM TABLENAME [WHERE ] [ORDER BY]

=> DISPLAY THE COUNTRIES WHERE ASIANPAINTS IS OPERATING..ENSURING THAT THERE IS NO


DUPLICATE

SELECT DISTINCT COUNTRY FROM ASIANPAINTS;

=>=> DISPLAY THE CITIES WHERE ASIANPAINTS IS OPERATING..ENSURING THAT THERE IS NO


DUPLICATE

SELECT DISTINCT CITY FROM ASIANPAINTS;

=>=> DISPLAY THE COUNTRY AND CITIES WHERE ASIANPAINTS IS OPERATING..ENSURING THAT
THERE IS NO DUPLICATE

SELECT DISTINCT COUNTRY, CITY FROM ASIANPAINTS;

=> IT WILL DISPLAY THE DISTINCT EXISITING COMBINATION OF COUNTRY AND CITY

=> DISPLAY THE DIFFERENT CITIES IN INDIA WHERE ASIAN PAINTS IS OPERATING
SELECT DISTINCT CITY FROM ASIANPAINTS WHERE COUNTRY = 'INDIA';

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

=> ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
NOT ALLOWED=>SELECT DISTINCT COUNTRY, CITY FROM ASIANPAINTS ORDER BY ENAME
=> ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

ALLOWED =>
SELECT DISTINCT COUNTRY, CITY FROM ASIANPAINTS ORDER BY CITY
======================================================================================
================
TOP CLAUSE

=> LIMITING THE NUMBER OF RECORDS

=> DISPLAY TOP 5 ROW FROM EMP1

SELECT TOP 5 * FROM EMP1

=> IT WILL GIVE ME 5 ROWS FROM EMP1 DEPENDING ON ACCESS OF SQL SERVER

=> TO GUARRANTY UR RESULT ..YOU SHOULD SORT THEM AND FOR SORTING WE USE ORDER BY

=> DISPLAY THE TOP 5 SALARIES AND THE CORRESPONDING EMPLOYEE NAMES FROM EMP1 TABLE

SELECT TOP 5 ENAME, SAL FROM EMP1 ORDER BY SAL DESC

=> => DISPLAY THE TOP 10 PERCENT SALARIES AND THE CORRESPONDING EMPLOYEE NAMES FROM
EMP1 TABLE

SELECT TOP 10 PERCENT ENAME, SAL FROM EMP1 ORDER BY SAL DESC
===============================================================================

TOP WITH TIES---

RETURNS TWO OR MORE ROWS THAT TIES FOR LAST PLACE IN LIMITED RESULT SET

SELECT TOP 2 WITH TIES ENAME, SAL FROM EMP1 ORDER BY SAL DESC;

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

OFFESET -FETCH
================

=> IT NEEDS ORDER BY CLAUSE

OFFSET ---HOW MANY ROWS TO SKIP -----FOR OFFEST FETCH IS NOT MANDATORY
FETCH ---HOW MANY ROWS TO FETCH AFTER OFFSET----- BUT FOR FETCH OFFSET IS MANDATORY

=> WITHOUT FETCH === SELECT ENAME, SAL, JOB FROM EMP1 ORDER BY SAL DESC OFFSET 1 ROWS

=> WITH FETCH = > SELECT ENAME, SAL, JOB FROM EMP1 ORDER BY SAL DESC OFFSET 1 ROWS
FETCH NEXT 2 ROWS ONLY

=> I WANT TO SEE THE RECORD OF THE PERSON HAVING TOP SALARY USING OFFSET -FETCH

SELECT ENAME, SAL, JOB FROM EMP1 ORDER BY SAL DESC OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY

======================================================================================
========================
SQL COMMANDS HAVE BEEN CATEGORISED IN TO DIFFERENT CATEGORIES BASED ON THE OPERATION
THEY PERFORM
1. DDL(DATA DEFINITION LANGUAGE)----CREATE, ALTER, DROP, TRUNCATE
2. DML(DATA MANIPULATION LANGUAGE) ---INSERT, UPDATE, DELETE
3. DRL/DQL (DATA RETRIEVAL LANGUAGE/ DATA QUERY LANGUAGE) ---------SELECT
4. TCL(TRANSACTION CONTROL LANGUAGE)------COMMIT , ROLLBACK, SAVETRANSACTION
5. DCL(DATA CONTROL LANGUAGE) ---GRANT, REVOKE
======================================================================================
=======================

12-04-2022

DML - ACTS ON TABLE DATA

1. STORE THE DATA -------> INSERT


2. MODIFY THE DATA-----> UPDATE
3. DELETE THE RECORDS WHICH WE DONT NEED --> DELETE

4. RETRIEVE THE DATA FROM TABLES-----> SELECT ---> AS PER MICROSOFT OFFICAL BOOK--
--> DML

VARIOUS OTHER SOURCES---> DQL / DRL


INSERT
========

EMP ( ID, NAME , SAL)

INSERT INTO EMP VALUES(1, 'PRAVEER', 3000)


INSERT INTO EMP VALUES(2, 'RAMA', 4000)

---------------------------------------------------------------------------------
INSERT INTO EMP VALUES(1, 'PRAVEER', 3000), (2, 'RAMA', 4000)

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

=>ALREADY HAVE A TABLE KNOWN AS EMP1 ---> CREATE A TABLE FOR DEPT 10 HAVING NAME JOB
SAL

CREATE TABLE DEPT10(ENAME VARCHAR(20), JOB VARCHAR(20), SAL SMALLMONEY);

INSERT- SELECT
================

=>INSERT INTO DEPT10 SELECT ENAME, JOB, SAL FROM EMP1 WHERE DEPTNO =10

=>ALSO INSERT DEPT 20 DATA INTO SAME DEPTNO10 TABLE ---NAME AND JOB

INSERT INTO DEPT10(ENAME, JOB) SELECT ENAME, JOB FROM EMP1 WHERE DEPTNO =20

======================================================================================
====================
CAN YOU CREATE A TABLE WITHOUT GUI OPTION OR WITHOUT CREATE STATEMENT

COPY OR CLONE OF THE TABLE

CREATE A CLONE OF THE TABLE EMP1 WITHOUT USING CREATE STATEMENT OR GUI OPTION

SELECT - INTO
---------------
SELECT * INTO EMP2 FROM EMP1

=> NEW TABLE EMP2 WILL BE AUTOMATICALLY CREATED


CREATE A NEW TABLE WITHOUT CREATE STATEMENT HAVING ALL RECORDS OF DEPT 10 FROM EMP1

SELECT * INTO EMP3 FROM EMP1 WHERE DEPTNO =10

=> JUST CREATE STRUCTURE OF TABLE EMP1 AS A NEW TABLE WITHOUT CREATE COMMAND

SELECT * INTO EMP4 FROM EMP1 WHERE 1=2

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

UPDATE COMMAND
=> USED TO MODIFY THE TABLE DATA
=> USING UPDATE COMMAND WE CAN UPDATE ALL THE ROWS OR SPECIFIC ROWS
=> USING UPDATE COMMAND WE CAN UPDATE SINGLE COLUMN OR MULTIPLE COLUMNS

SYNTAX :
UPDATE <TABLENAME>
SET COLNAME1 = VALUE1, COLNAME2 = VALUE2, COLNAME3 = VALUE3.........
[WHERE]

=> UPDATE ALL EMPLOYEES COMMISION WITH 500....

UPDATE EMP6 SET COMM = 500;

=> UPDATE THE EMPLOYEE COMMISION TO 1000 WHOSE EMPNO IS 7369

UPDATE EMP6 SET COMM = 1000 WHERE EMPNO = 7369;

=> UPDATE THE EMPLOYEE COMMISION TO 2000 WHOSE COMMISION IS NULL FROM EMP2

UPDATE EMP2 SET COMM = 2000 WHERE COMM IS NULL;

=> INCREMENT SALARY BY 20% AND COMMISION BY 10% FOR THOSE WORKING AS SALESMAN AND
JOINED IN 2021. IN EMP2

UPDATE EMP2
SET SAL = SAL + (SAL*0.2),
COMM = COMM + (COMM*0.1)
WHERE JOB = 'SALESMAN'
AND
HIREDATE LIKE '2021%'
======================================================================================
==============================
13-04-2022

INCREMENT THE SALARIES OF EMPLOYEES AS PER FOLLOWING RULES IN EMP2

DEPTNO INCREMENT IN SALARY


10 10%
20 15%
30 20%
OTHERS 5%

ONE WAY IS TO UPDATE ONE BY ONE EACH DEPARTMENT SALARY LIKE FOLLOWING

UPDATE EMP2
SET SAL = 1.1*SAL WHERE DEPTNO = 10

BETTER WAY IS TO USE CASE STATEMENT

CASE STATEMENT ---


---------------------------
=> USED TO IMPLEMENT IF THEN ELSE
==> SIMILAR TO SWITCH
=> USING A CASE STATEMENT WE CAN RETURN VALUES BASED ON GIVEN CONDITION
=> ELSE IS OPTIONAL
=> CASE STATEMENT IS OF TWO TYPES

1. SIMPLE CASE
2. SEARCHED CASE

1 . SIMPLE CASE: HERE CONDITION IS BASED ON EQUALITY CHECK

SYNTAX=>

CASE EXPR/COLNAME
WHEN VALUE1 THEN RETURN EXPR1
WHEN VALUE2 THEN RETURN EXPR2
WHEN VALUE3 THEN RETURN EXPR3

[ELSE RETURN EXPR]


END

======================================================
DEPTNO INCREMENT IN SALARY
10 10%
20 15%
30 20%
OTHERS 5%

UPDATE EMP2
SET SAL = CASE DEPTNO
WHEN 10 THEN 1.1*SAL
WHEN 20 THEN 1.15*SAL
WHEN 30 THEN 1.2*SAL
ELSE 1.05*SAL
END

=================================================================================
2. SEARCHED CASE

=> USE SEARCHED CASE WHEN CONDITION IS OTHER THAN EQUALITY CHECK
CASE
WHEN BOOLEAN CONDITION THEN RETURN EXPR1
WHEN BOOLEAN CONDITION THEN RETURN EXPR2
[ELSE RETURN EXPR]
END
=================================================================================
DISPLAY ENAME , SAL AND SALRANGE FROM EMP2--ACCORDING TO FOLLOWING CONDITION

IF SAL > 3000 IN SAL RANGE DISPLAY HISAL


SAL< 3000 IN SAL RANGE DISPLAY LOWSAL
SAL = 300 IN SAL RANGE DISPLAY AVGSAL

==================>
SELECT ENAME, SAL, CASE
WHEN SAL > 3000 THEN 'HISAL'
WHEN SAL < 3000 THEN 'LOWSAL'
ELSE 'AVGSAL'
END AS SALRANGE
FROM EMP2

======================================================================================
========================
=>STUDENTS 2 --- S1, S2, S3 --------PASSING MARKS IN EVERY SUBJECT IS 35
REQUIREMENT IS IF STUDENT IS FAIL IN S1 ----INSTEAD OF HIS MARKS IN S1 NULL SHOULD BE
DISPLAYED
-----IF HE
IS PASS THEN HIS ORIGINAL MARKS SHOULD BE DISPLAY

SELECT * FROM STUDENTSNEW;

SELECT SNO, SNAME, CASE

WHEN S1 < 35 THEN NULL


ELSE S1
END AS S1,

CASE
WHEN S2 < 35 THEN NULL
ELSE S2
END AS S2,

CASE
WHEN S3 < 35 THEN NULL
ELSE S3
END AS S3
FROM STUDENTSNEW
==================================================================================

=> INCREMENT THE SAL AS PER FOLLOWING CONDITION

IF SAL > 3000, INCREMENT BY 10%


SAL >2000 BUT LESS OR EQUAL TO 3000 THEN 20% 2000< SAL
ELSE BY 30%
========================>
UPDATE EMPUPDATED
SET SAL = CASE
WHEN SAL > 3000 THEN 1.1*SAL
WHEN SAL > 2000 THEN 1.2*SAL
ELSE 1.3*SAL
END
=====================================================================================
UPDATE EVERYONES COMMISION EQUAL TO MINIMUM SALARY IN THE ORGANIZATION

UPDATE EMPUPDATED
SET COMM = (SELECT MIN(SAL) FROM EMPUPDATED)
=====================================================================================
14-04-2022

SORT THE RESULT IN EMP1 TABLE SUCH THAT WHEN IT IS DEPT NO 10 THEN SORT BY SAL ASC AND
IF DEPTNO 20 THEN SORT BY SAL DESC
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
--------
IN OUR STUDENTS NEW ..WE HAVE STUDENTS LIST ALONG WITH THEIR MARKS..
IN SUBJECT S1 IF STUDENT SECURED ATLEAST 35 MARKS MARKS HIM 'PASS' ELSE 'FAIL'

SELECT SNO, SNAME, CASE WHEN S1>=35 THEN 'PASS' ELSE 'FAIL' END AS S1 FROM STUDENTSNEW

=>WHEN ALL THE CONDITIONS ARE FALSE OR NOT MET AND ELSE CLAUSE IS NOT MENTIONED THEN
CASE WILL RETURN NULL

SELECT SNO, SNAME, CASE WHEN S1>=35 THEN 'PASS' END AS S1 FROM STUDENTSNEW

=>IN ABOVE COMMAND WHERE EVER S1<35, CASE WILL RETURN NULL
======================================================================================
=======================================

DELETE COMMAND
===================
=> USED TO DELETE RECORDS
=> WE CAN DELETE SPECIFIC RECORDS OR ROWS -----> WITH THE HELP OF WHERE CLAUSE
=> WE CAN DELETE ENTIRE RECORDS OR ALL ROWS
=> SUPOSSE I DELETE ALL THE RECORDS OF THE TABLE IN THAT CASE ONLY DATA WILL BE
DELETED BUT STRUCTURE OF TABLE WILL REMAIN
=> IT DELETES RECORD ROW BY ROW AND WHEN EVER IT WILL DELETE ONE ROW IT WILL LOG
THAT INFORMATION
=> IT DOES NOT RESET IDENTITY
SYNTAX ---> DELETE FROM <TABLE NAME> [WHERE CLAUSE]
===============================================
=> DELETE ALL THE RECORDS/ROWS FROM EMP TABLE

DELETE FROM EMP;

=> ALL THE RECORDS OR ROWS OF EMP TABLE WILL BE DELETED BUT STRUCTURE OF EMP TABLE
WILL REMAIN
===================================

DELETE THE RECORD OF 'ALLEN' FROM EMP1 TABLE

DELETE FROM EMP1 WHERE ENAME = 'ALLEN';

INSTEAD OF USING ENAME BETTER USING SOME THING WHICH UNIQUELY IDENTIFIES THE ALLEN----
-> EMP ID
=========================================

DELETE THE RECORDS OF ALL EMPLOYEE WHO JOINED IN 2020

DELETE FROM EMP1 WHERE HIREDATE LIKE '2020%';


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

======================================================================================
===========
DDL ---> DATA DEFINITION LANGUAGE

THEY DEAL WITH STRUCTURE OF OBJECTS

CREATE
ALTER
DROP
TRUNCATE

-------------------------------------------------------------------------------
ALTER COMMAND

=> THIS COMMAND IS USED TO MODIFY THE TABLE STRUCTURE


=> USING ALTER COMMAND WE CAN
=> ADD COLUMNS
=> DROP COLUMNS
=> MODIFY A COLUMN
=> ADDING
CONSTRAINTS
=> DELETE CONSTRAINTS

ADDING COLUMN
----------------

ALTER TABLE <TABLENAME>


ADD COLNAME1 DATATYPE(SIZE), COLNAME2 DATATYPE(SIZE)............

IN EMP1 TABLE ADD A COLUMN KNOWN AS DOB---

ALTER TABLE EMP1


ADD DOB DATE;

IN EMP1 TABLE ADD A COLUMN KNOWN DISTT WHICH INDICATES DISTANCE TRAVELLED IN KM IN
WHOLE NUMBERS
ALTER TABLE EMP1
ADD DISTT TINYINT;

=> AFTER ADDING COLUM THE COLUM IS FILLED WITH NULL BY DEFAULT
=> NOW WE HAVE TO INSERT THE DATA IN NEW COLUM USING UPDATE COMMAND

=> UPDATE THE DOB OF EMPNO 7521 WITH DATE OF BIRTH = '2000-05-10'

UPDATE EMP1 SET DOB = '2020-05-10' WHERE EMPNO = 7521;


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

DROPING A COLUM
=====================>
ALTER TABLE <TABLENAME>
DROP COLUMN COLNAME1, COLNAME2...........

----------------------------------------------------------
DROP COLUMNS DOB AND DISTT FROM EMP1 TABLE

ALTER TABLE EMP1


DROP COLUMN DOB,DISTT;

================================================================
MODIFYING A COLUMN
1. CHANGE SIZE
2 . CHANGE DATATYPE

=> FOR NOW IN SQL SERVER WE CAN MODIFY ONLY COLUMN AT A TIME

ALTER TABLE <TABLENAME>


ALTER COLUMN COLNAME DATATYPE(SIZE)

=> INCREASE THE SIZE OF ENAME TO BE 20 FROM 10


ALTER TABLE EMP1
ALTER COLUMN ENAME VARCHAR(20)

=> CHANGE THE DATATYPE OF SAL TO MONEY

ALTER TABLE EMP1


ALTER COLUMN SAL MONEY;

=> CHANGE THE DATATYPE OF EMPNO TO TINYINT

ALTER TABLE EMP1


ALTER COLUMN EMPNO TINYINT; =====> ERROR

ERROR=> Arithmetic overflow error for data type tinyint, value = 7521.

=> CHANGE THE DATATYPE OF ENAME TO TINYINT

ALTER TABLE EMP1


ALTER COLUMN ENAME TINYINT; =============> ERROR

ERROR = > Conversion failed when converting the varchar value 'WARD' to data type
tinyint.

=> CHANGE THE DATATYPE OF MGR COLUMN TO VARCHAR(10)

ALTER TABLE EMP1


ALTER COLUMN MGR VARCHAR(10);===============> ACCEPTABLE ===> WE WONT GET ANY ERROR
======================================================================================
==========================================

15-04-2022

DROP COMMAND
---------------------

=> USED TO DROP TABLE FROM DATABASE


=> DROPS TABLE STRUCTURE ALONG WITH DATA

SYNTAX: DROP TABLE <TABLENAME>

=> DROP THE TABLE NAMED AS SORTING

DROP TABLE SORTING;

TRUNCATE COMMAND
-----------------------------
=> DELETES ALL THE DATA FROM THE TABLE BUT KEEPS STRUCTURE
=> WILL EMPTY THE TABLE
=> CAN NOT DELETE SPECIFIC RECORDS----THAT MEANS WHERE CLAUSE IS NOT ALLOWED
=> WHEN TRUNCATE COMMAND IS EXECUTED THEN SQL SERVER GOES TO MEMORY AND RELEASES ALL
THE PAGES ALLOCATED FOR THE
TABLE AND WHEN PAGES WILL BE RELEASED THEN DATA STORED INSIDE PAGES WILL ALSO BE
DELETED
=> IT RESETS THE IDENTITY

SYNTAX: TRUNCATE TABLE <TABLENAME>

=>EMPTY THE TABLE EMP6----->

=>TRUNCATE TABLE EMP6

DROP DELETE
TRUNCATE
DELETED DATA AS IT DELETES BUT IT DELETES
BUT
WELL AS STRUCTURE KEEPS STRUCTURE KEEPS STRUCTURE

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

DELETE TRUNCATE
---------- ---
----------------------------------------
DML DDL

CAN DELETE ALL CAN ONLY DELETE ALL


ROW, NOT SPECIFIC ROWS
OR SPECIFIC ROWS

WHERE CONDITION
CAN BE USED WITH DELETE WHERE CONDITION CAN NOT BE USED WITH
TRUNCATE

DELETES ROW BY ROW DEALLOCATES THE PAGES----->


MULTIPLE ROWS ARE DELETED AT SAME TIME

AFTER DELETION OF IT MAKES ENTRY IN LOG AFTER


PAGE DEALLOCATION
EVERY ROW IT MAKES
ENTRY IN LOG

SLOWER IN PERFORMANCE FASTER IN PERFORMANCE

WILL NOT RELEASE MEMORY RELEASE MEMORY

WILL NOT RESET IDENTITY WILL RESET IDENTITY

IT INVOKE TRIGGERS IT DOES NOT INVOKE TRIGGERS

REQUIRES MORE LOG IT REQUIRES LESS LOG SPACE


SPACE

DELETE CAN BE USED ON TRUNCATE COMMAND CAN NOT BE


USED ON PARENT TABLE IF FOREIGN KEY
PARENT TABLE IF FOREIGN KEY RELATIONSHIPS ARE PRESENT ON
PRIMARY KEY COLUMN
RELATIONSHIPS ARE PRESENT ON
PRIMARY KEY COLUMN
======================================================================================
=============

SP_RENAME -----SP -> STORED PROCEDURE

=> USED TO CHANGE THE TABLE NAME OR COLUMN NAME

SYNTAX-----SP_RENAME 'OLDTABLENAME', 'NEWTABLENAME'

= > CHANGE THE TABLE NAME OF EMPSAL TO EMP7

SP_RENAME 'EMPSAL', 'EMP7';

=>CHANGE THE COLUMN NAME COMM TO BONUS IN EMP3 TABLE

SYNTAX---------SP_RENAME 'TABLENAME.OLDCOLUMNAME', 'NEWCOLUMNNAME'

SP_RENAME 'EMP3.COMM','BONUS'
======================================================================================
=================

IDENTITY
-----------
=> IDENTITY IS USED TO GENERATE SEQUENCE NUMBERS
=> USED TO AUTO INCREMENT COLUMN VALUE
=> USED FOR NUMERIC COLUMNS
=> WE CAN HAVE ONLY ONE IDENTITY COLUMN PER TABLE

SYNTAX: IDENITY(SEED, INCR)

SEED ----> START ----> OPTIONAL -------DEFAULT VALUE IS 1


INCR---->INCREMENT ----> OPTIONAL ----DEFAULT VALUE IS 1

EXAMPLE:

CREATE TABLE CUSTOMER


(cid INT IDENTITY,
cname VARCHAR(10));

INSERT INTO CUSTOMER(cname) VALUES('A')


INSERT INTO CUSTOMER(cname) VALUES('b');
INSERT INTO CUSTOMER(cname) VALUES('c');
INSERT INTO CUSTOMER(cname) VALUES('d');
INSERT INTO CUSTOMER(cname) VALUES('e');

cid cname
1 A
2 b
3 c
4 d
5 e

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

CREATE TABLE CUSTOMER2


(cid INT IDENTITY(100,2),
cname VARCHAR(10));

INSERT INTO CUSTOMER2(cname) VALUES('A')


INSERT INTO CUSTOMER2(cname) VALUES('b');
INSERT INTO CUSTOMER2(cname) VALUES('c');
INSERT INTO CUSTOMER2(cname) VALUES('d');
INSERT INTO CUSTOMER2(cname) VALUES('e');

cid cname
100 A
102 b
104 c
106 d
108 e

=========================================
======================================================================================
===============
18-04-2022
=>An explicit value for the identity column in table 'CUSTOMER2' can only be specified
when a column list is used and IDENTITY_INSERT is ON

=> IF WE WANT TO MANUALLY OR EXPLICITLY PASS THE VALUE FOR IDENTITY COLUM THEN
FOLLOWING TWO CONDITIONS SHOULD BE
SATISFIED:

=1=> SET IDENTITY_INSERT TABLENAME ON

SET IDENTITY_INSERT CUSTOMER2 ON

= 2=> column list is used =>CUSTOMER2(cid,cname)

INSERT INTO CUSTOMER2(cid,cname) VALUES(125, 'F')

cid cname
100 A
101 b
102 c
103 d
104 e
125 F

=> TO TURN THE EXPLICIT IDENTITY INSERT OFF

SET IDENTITY_INSERT CUSTOMER2 OFF


-------------------------------------------------------------------------------
TO RESET IDENTITY MANUALLY

DBCC ---> DATABASE CONSISTENCY CHECK

SYNTAX : --- DBCC CHECKIDENT('TABLENAME', RESEED, STARTVALUE-1)

DBCC CHECKIDENT('CUSTOMER2',RESEED, 0);

cid cname
100 A
101 b
102 c
103 d
104 e
125 F
150 G
151 H
152 I
25 j
153 k
1 L
2 M
3 N
4 O

--------------------------------------------------------------------------------------
-----------------------------------------------------------------------
BUILT IN FUNCTIONS IN SQL SERVER

=> FUNCTION --> FUNCTIONS ARE DESIGNED TO PERFORM SOME SPECIFIC TASK
---> SOME FUNCTIONS TAKES ARGUMENT --SUM(COLNAME)---AN
ARGUMENT HERE IS A COLNAME

AND SOME FUNCTION DOES NOT TAKE ANY ARGUMENT---


GETDATE()----IT TAKES NO ARGUMENT

TYPES OF FUNCTIONS:

1.DATE/DATETIME FUNCTIONS
2. STRING
3. MATHEMATICAL
4. CONVERSION
5. SPECIAL
6. ANALYTICAL
7. AGGREGATION FUNCTION

1. DATE/DATETIME FUNCTIONS:
------------------------------------------

1. YEAR(DATE/DATETIME) -----> RETURNS YEAR PART OF DATE---> INTEGER

SELECT YEAR('2021-04-05') AS YEAR;

2. MONTH(DATE/DATETIME)----> RETURNS MONTH PART OF DATE ---> INTEGER

SELECT MONTH('2021-04-05') AS MONTH;

3. DAY(DATE/DATETIME)-----> RETURNS DAY PART OF THE MONTH---DAY OF THE MONTH ---->


INTEGER

SELECT DAY('2021-04-05') AS DAY;

------
# DISPLAY THE LIST OF EMPLOYEES JOINED IN YEAR 2021

SELECT * FROM emp1 WHERE YEAR(hiredate)=2021;

# DISPLAY THE LIST OF EMPLOYEES JOINED IN JAN, APR, DEC MONTHS

SELECT * FROM emp1 WHERE MONTH(hiredate) IN (01, 04, 12);

=> DISPLAY THE LIST OF EMPLOYEE WHO JOINED IN 2021 AND APRIL MONTH

SELECT * FROM emp1 WHERE YEAR(hiredate) = 2021 AND MONTH(hiredate) = 04;


--------------------------------------------------------------------------------------
-------
4. SYSDATETIME()----RETURNS CURRENT DATE AND TIME OF THE SYSTEM----HIGH PRECISION

SELECT SYSDATETIME();

currentdatetime
2022-04-18 08:29:56.9610096

5. GETDATE()--> RETURNS CURRENT DATE AND TIME OF THE SYSTEM--LOW PRECISION

SELECT GETDATE() as currentdatetime;

currentdatetime
2022-04-18 08:30:16.840

6. CURRENT_TIMESTAMP---->ETURNS CURRENT DATE AND TIME OF THE SYSTEM--LOW PRECISION

SELECT CURRENT_TIMESTAMP AS CURRENTDATETIME;

CURRENTDATETIME
2022-04-18 08:31:54.750

UTC--> COORDINATED UNIVERSAL TIME-----BASED ON EARTH ROTATION

7. SYSUTCDATETIME()---- CURRENT UTC DATE AND TIME FROM SYSTEM---- HIGH PRECISION

SELECT SYSUTCDATETIME() AS UTCDATETIME;


2022-04-18 03:04:27.0938534

8. GETUTCDATE()----> CURRENT UTC DATE AND TIME FROM SYSTEM---- LOW PRECISION

SELECT GETUTCDATE() as GETUTCDATETIME;

GETUTCDATETIME
2022-04-18 03:06:37.190
--------------------------------------------------------------------------------------
------------------------------
9. DATEPART()-----> USED TO EXTRACT THE PART OF DATE OR DATE TIME

=>IT RETURNS INTEGER

SYNTAXT--> DATEPART(DATEPART,DATE/DATETIME)

DATEPART DATEPART ARGUMENT


YEAR YEAR, YY, YYYY
QUARTER QUARTER, QQ, Q----> JAN - MARCH - 1, APR - JUNE --2, JULY -
SEP --3, OCT -DEC - 4
MONTH MONTH, MM, M
DAYOFYEAR DAYOFYEAR, DY, Y
DAYOFMONTH DAY, DD, D
WEEKOFYEAR WEEK, WK, WW
WEEKDAY WEEKDAY
SUNDAY - 01
MONDAY - 02
TUESDAY -03
HOUR HOUR, HH
MINUTE MINUTE, MI,N
SECOND SECOND, SS, S
MILISECOND MS

SELECT DATEPART(YEAR, GETDATE()) AS YEAR; -----> 2022


SELECT DATEPART(MONTH, GETDATE()) AS MONTH;---> 04
SELECT DATEPART(QUARTER, GETDATE()) AS QTR;------> 2
SELECT DATEPART(DAYOFYEAR, GETDATE()) AS DY;------> 108
SELECT DATEPART(DAY, GETDATE()) AS DAYOFMONTH; ----> 18
SELECT DATEPART(WEEK, GETDATE()) AS WEEKOFYEAR;---> 17
SELECT DATEPART(WEEKDAY, GETDATE()) AS DAYOFWEEK;---> 2 AS TODAY IS MONDAY AND SUNDAY
IS DAY 1
SELECT DATEPART(HOUR, GETDATE()) AS HOUR;---> 08 AS CURRENT TIME 08:52
SELECT DATEPART(MINUTE, GETDATE()) AS MINUTE;--> 53 AS CURRENT TIME IS 08:53
SELECT DATEPART(SECOND, GETDATE()) AS SECOND; --> 34 AS CURRENT TIME IS 08:53:34

--------------------------------------------------------------------------------------
--------------------------------------------------
# DISPLAY THE LIST OF EMPLOYEES JOINED IN YEAR 2021

SELECT * FROM EMP1 WHERE DATEPART(YY,hiredate) = 2021;

# DISPLAY THE LIST OF EMPLOYEES JOINED IN JAN, APR, DEC MONTHS

SELECT * FROM EMP1 WHERE DATEPART(MONTH, hiredate) IN (01, 04, 12);

=> DISPLAY THE LIST OF EMPLOYEE WHO JOINED IN 2021 AND APRIL MONTH

SELECT * FROM EMP1 WHERE DATEPART(YEAR, hiredate) = 2021 AND DATEPART(MONTH, hiredate)
= 04;
--------------------------------------------------------------------------------------
-----------------------------------------------------
19-04-2022

10 . DATENAME() ----EXTRACTS THE PART OF DATE/DATETIME

=> DATENAME RETURNS NVARCHAR


MONTH DAYOFWEEK(DW)

DATEPART 04(INTEGER) 07

DATENAME APRIL SATURDAY

SYNTAX : DATENAME(DATEPART, DATE/DATETIME)

=> WRITE A QUERY TO DISPLAY THE DAY OF THE WEEK ON WHICH INDIA GOT INDEPENDANCE------
DAY OF THE WEEK SHOULD BE
LIKE SUNDAY, MONDAY...ETC

SELECT DATENAME(WEEKDAY, '1947-08-15');

=>-- DISPLAY THE LIST OF EMPLOYEES JOINED IN 2021 USING DATENAME

SELECT * FROM EMP1 WHERE DATENAME(YEAR,HIREDATE) = 2021

EMPNO ENAME JOB MGR HIREDATE` SAL COMM DEPTNO


7521 WARD SALESMAN7698 2021-02-22 ` 1250.00 500.00 30
7566 JONES MANAGER 7839 2021-04-02 ` 2975.00 NULL 20
7654 MARTIN SALESMAN7698 2021-09-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 2021-05-01 2850.00 NULL 30
7782 CLARK MANAGER 7839 2021-06-09 2450.00 NULL 10
7844 TURNER SALESMAN7698 2021-09-08 1500.00 0.00 30

=> WE ARE GETTING CORRECT RESULT BECAUSE HERE DATENAME(YEAR,HIREDATE) RETURNS


NVARCHAR
AND WE ARE COMPARING IT WITH INTEGER 2021 AND NVARCHAR HAS LOWER PRECEDANCE THEN
INTEGER SO SQL SERVER
CONVERTS THE NVARCHAR INTO CORRESPONDING INTEGER DATA. HENCE WE ARE GETTING CORRECT
RESULT
FOR EXAMPLE ==> SELECT 1 + '1' WILL RETURN 2 BECAUSE '1' WILL BE CONVERTED TO
INTEGER AS INTEGER HAS HIGHER PRECEDANCE THAN \
VARCHAR

SELECT '23' + '1' ===> 231 BECAUSE ITS DOING CONCATENATION AS BOTH OPERANDS OF THE +
OPERATOR ARE STRING DATA SO CONCATENATION
WILL HAPPEN
SELECT '23' + 1 = > 24 => '23' WILL BE CONVERTED TO INTEGER AND ADDITION WILL HAPPEN
SELECT 'A' + 1==> Conversion failed when converting the varchar value 'A' to data type
int.

=> DISPLAY A MESSAGE IN EMP1 TABLE IN FRONT OF EVERY EMPLOYEE FOR EXAMPLE :

SMITH JOINED ON FRIDAY --------> HIREDATE

SELECT *, ENAME+' '+'JOINED ON'+ ' '+ DATENAME(WEEKDAY, HIREDATE) AS MESSAGE FROM EMP1
======================================================================================
====================================
11 DATEDIFF() ----> USED TO FIND DIFFERENCE BETWEEN TWO DATES

SYNTAX : DATEDIFF(DATEPART, STARTDATE, ENDDATE)

=> IT RETURNS AN INTEGER

SELECT DATEDIFF(YEAR, '2022-01-01', '2023-02-06')--> 1 (YEAR)


SELECT DATEDIFF(MONTH, '2022-01-01', '2023-02-06')--> 13 (MONTHS)
SELECT DATEDIFF(QUARTER, '2022-01-01', '2023-02-06')-->4(QUARTER)
SELECT DATEDIFF(DAY, '2022-01-01', '2023-02-06')---> 401 (DAYS)

=> IMPORTANT ---> OBSERVE FOLLOWING COMMANDS:

=> SELECT DATEDIFF(YEAR, '2020-12-10', '2021-01-01') WILL RETURN 1 --> NOTICE THAT
THE GIVEN FUNCTION WILL RETURN 1 YEAR EVEN THOUGH DIFFERENCE
BETWEEN TWO DATES IS NOT EVEN 1 MONTH. ITS RETURNING 1 YEAR AS YEAR PART HAS CHANGED
FROM 2020 TO 2021 ---> HENCE DIFFERENCE
IN TERMS OF YEAR IS 1.

=> SELECT DATEDIFF(MONTH, '2020-11-28', '2020-12-01') WILL RETURN 1 --> AGAIN


DIFFERENCE BETWEEN TWO DATES IS BARELY 4 DAYS BUT FUNCTION
WILL RETURN 1 MONTH AS MONTH PART HAS CHANGED FROM 11 TO 12 HENCE DIFFERENCE IN TERMS
OF MONTH WILL BE 1.

--------------------------------------------------------------
DISPLAY EACH EMPLOYEE DETAILS AND THEIR EXPERIENCE IN YEARS TILL DATE FROM EMP1

SELECT ENAME, DATEDIFF(YEAR, HIREDATE, GETDATE()) AS YEARS FROM EMP1;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO YEARS


7521 WARD SALESMAN7698 2021-02-22 1250.00 500.00 30 1
7566 JONES MANAGER 7839 2021-04-02 2975.00 NULL 20 1
7654 MARTIN SALESMAN7698 2021-09-28 1250.00 1400.00 30 1
7698 BLAKE MANAGER 7839 2021-05-01 2850.00 NULL 30 1
7782 CLARK MANAGER 7839 2021-06-09 2450.00 NULL 10 1
7844 TURNER SALESMAN7698 2021-09-08 1500.00 0.00 30 1
7876 ADAMS CLERK 7788 2019-01-12 1100.00 NULL 20
3
7900 JAMES CLERK 7698 2019-12-03 950.00 NULL 30
3
7934 MILLER CLERK 7782 2018-01-23 1300.00 NULL 10
4

-----------------------------------------------------------------------------
DISPLAY EACH EMPLOYEE DETAILS AND THEIR EXPERIENCE IN YEARS AND MONTHS TILL DATE
FROM EMP1

M YEARS N MONTHS
=> EXTRACT MONTHS FROM TOTAL EXPERIENCE
=> 40 MONTHS AS EXPERIENCE ===> 40/12 ----> 3 YEARS
===> 40%12------> 4 MONTHS

SELECT *, DATEDIFF(MONTH, HIREDATE, GETDATE())/12 AS YEARS,DATEDIFF(MONTH, HIREDATE,


GETDATE())%12 AS MONTHS FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO YEARS MONTHS


7521 WARD SALESMAN7698 2021-02-22 1250.00 500.00 30 1
2
7566 JONES MANAGER 7839 2021-04-02 2975.00 NULL 20 1
0
7654 MARTIN SALESMAN7698 2021-09-28 1250.00 1400.00 30 0
7
7698 BLAKE MANAGER 7839 2021-05-01 2850.00 NULL 30 0
11
7782 CLARK MANAGER 7839 2021-06-09 2450.00 NULL 10 0 10
7844 TURNER SALESMAN7698 2021-09-08 1500.00 0.00 30 0 7
7876 ADAMS CLERK 7788 2019-01-12 1100.00 NULL 20
3 3
7900 JAMES CLERK 7698 2019-12-03 950.00 NULL 30
2 4
7934 MILLER CLERK 7782 2018-01-23 1300.00 NULL 10
4 3

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

DATEADD()---> IT ADDS A NUMBER TO DATEPART OF INPUT DATE AND RETURNS MODIFIED DATE
/DATE TIME

DATEADD(DATEPART, NUMBER/INTERVAL, DATE/DATETIME)

SELECT DATEADD(DAY, -1, GETDATE()) AS YESTERDAY

SELECT DATEADD(DAY, -1, GETDATE()) AS YESTERDAY

SELECT DATEADD(DAY, +1, GETDATE()) AS TOMMOROW

SELECT DATEADD(DAY, -10, GETDATE()) AS TENDAYSBACK

SELECT DATEADD(MONTH, -1, GETDATE()) AS ONEMONTHBACK

SELECT DATEADD(YEAR, -1, GETDATE()) AS ONEYEARBACK

=> SHOW THE STOCK DETAILS OF YESTERDAY

SELECT * FROM STOCKPRICE WHERE DATE = DATEADD(DAY, -1, GETDATE())

--------------------------------------------------------------------------------------
-------------------------
EOMONTH()==> IT RETURNS LAST DAY OF THE MONTH

SYNTAX= > EOMONTH(DATE, [OFFSET])


SELECT EOMONTH(GETDATE()) OR EOMONTH(GETDATE(), 0) ---CURRENT
MONTH LAST DATE
SELECT EOMONTH(GETDATE(), -1) ----PREVIOUS MONTH LAST DATE
SELECT EOMONTH(GETDATE(), +1)--- NEXT MONTH LAST DATE
--------------------------------------------------------------------------------------
-----------------------------
TASK :

DISPLAY NEXT MONTH FIRST DATE =>


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

SELECT DATEADD(DAY, +1, EOMONTH(GETDATE()))

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

DISPLAY CURRENT MONTH FIRST DATE=>


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

SELECT DATEADD(DAY, +1,EOMONTH(GETDATE(), -1))

=> DISPLAY FIRST DATE OF CURRENT YEAR


=> DISPLAY 1ST DATE OF NEXT YEAR

======================================================================================
============
20-04-2022

=> DISPLAY 1ST DATE OF NEXT YEAR

SELECT DATEADD(DAY, +1, EOMONTH(GETDATE(), +(12-MONTH(GETDATE()))))

=> DISPLAY FIRST DATE OF CURRENT YEAR

SELECT DATEADD(DAY, 1, EOMONTH(GETDATE(), -MONTH(GETDATE())))

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

STRING FUNCTIONS

UPPER()===> CONVERTS STRING TO UPPER CASE

SYNTAX : UPPER(STRING/COLNAME)

SELECT UPPER('hello') ===> HELLO

LOWER() ====> CONVERTS STRING INTO LOWER CASE

SYNTAX : LOWER(STRING/COLNAME)

SELECT LOWER('HELLO')==> hello

=> DISPLAY EMPNO, ENAME AND SAL FROM EMP1 TABLE ..ENSURE THAT THE NAMES SHOULD BE IN
LOWER CASE

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

==> IN EMP1 TABLE ENAMES ARE GIVEN IN CAPITAL LETTERS ..SAVE OR UPDATE THE RESULT IN
EMP1 TABLE AS LOWER CASE

UPDATE EMP1 SET ENAME = LOWER(ENAME);

LEN()----> IT RETURNS THE LENGTH OF THE STRING OR NUMBER OF CHARACTERS

SYNTAX--> LEN(STRING)

SELECT LEN('HELLO') ---> 5


SELECT LEN(123456789)--->9
SELECT LEN('2020-08-01')---->10
SELECT LEN(' HELLO') ----> 8 --BECAUSE IT CONSIDERS LEADING SPACE

SELECT LEN(' HELLO ')----> 8 BECAUSE IT CONSIDERS LEADING SPACE BUT NOT TRAILING
SPACE

IF WE WANT TO CAPTURE TRAILING SPACE THEN DATALENGTH FUNCTION SHOULD BE USED WHICH
REPRESENTES NUMBER OF BYTES USED

SELECT DATALENGTH('HELLO') ---> 5 BYTES


SELECT DATALENGTH(' HELLO ')---> 7 BYTES ----1 BYTES FOR LEADING SPACE + 5 BYTES FOR
HELLO + 1 BYTE FOR TRAILING SPACE
SELECT DATALENGTH(N'HELLO')---> 10 BYTES --- AS THE DATA IS UNICODE WHICH TAKES 2
BYTES FOR EACH CHARACTER

===================================
DISPLAY THE DETAILS OF EMPLOYEES WHO NAME CONTAINS EXACTLY 5 CHARACTERS WITHOUT USE
OF LEN FUNCTION/DATALENGTH

SELECT * FROM EMP1 WHERE ENAME LIKE '_____';

DISPLAY THE DETAILS OF EMPLOYEES WHO NAME CONTAINS EXACTLY 5 CHARACTERS WITH USE OF
LEN FUNCTION

SELECT * FROM EMP1 WHERE LEN(ENAME) = 5;

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

LEFT()----> IT RETURNS THE SPECIFIED NUMBER OF CHARCTERS FROM LEFT SIDE OR START OF
THE STRING

SYNTAX -- LEFT(STRING, NO OF CHARACTERS TO BE EXTRACTED FROM LEFT)

=> DISPLAY THE EMPLOYEE DETAILS WHOSE NAME START WITH J

SELECT * FROM EMP1 WHERE ENAME LIKE 'J%'

SELECT * FROM EMP1 WHERE LEFT(ENAME,1) = 'J';

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

RIGHT() ---> IT RETURNS THE SPECIFIED NUMBER OF CHARACTERS FROM RIGHT OR END OF THE
STRING

SYNTAX -- RIGHT(STRING, NO OF CHARACTERS TO BE EXTRACTED FROM RIGHT)

=> DISPLAY THE EMPLOYEE DETAILS WHOSE NAME ENDS WITH 'S'

SELECT * FROM EMP1 WHERE ENAME LIKE '%S';

SELECT * FROM EMP1 WHERE RIGHT(ENAME, 1) = 'S';

=> DISPLAY THE DETAILS OF EMPLOYEES WHOSE NAME STARTS AND END WITH SAME CHARACTER

SELECT * FROM EMP1 WHERE LEFT(ENAME,1) = RIGHT(ENAME,1);

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30

=================
GENERATE EMAID FOR THE EMPLOYEES

EMPNO ENAME EMAILID


7999 NAVIN [email protected]
7521 WARD [email protected]

SELECT *, LEFT(ENAME,3) + LEFT(EMPNO,3) + '@MICROSOFT.COM' AS EMAILID FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO EMAILID


7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected]
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected]
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected]
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected]
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected]
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected]
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected]
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected]
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected]
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected]
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected]

GENERATE EMAID FOR THE EMPLOYEES AND SAVE THE RESULT IN THE TABLE

STEP1 --- ADD AN EMAIL ID COLUMN TO EMP1

ALTER TABLE EMP1


ADD EMAILID VARCHAR(30);

STEP2 -- UPDATE THE COLUMN WITH EMAIL IDS

UPDATE EMP1
SET EMAILID = LEFT(ENAME,3) + LEFT(EMPN0,3) + '@MICROSOFT.COM';
======================================================================================
==============
21-04-2022

SUBSTRING()
----------------

=> USED TO EXTRACT THE PART OF THE STRING FROM SPECIFIC POSITION

=> SUBSTRING(STRING, STARTPOSITION, NUMBER OF CHARS TO FETCH)

'HELLO WELCOME' ----> 'WELC'

SELECT SUBSTRING('HELLO WELCOME',7,4)=> 'WELC'

'HELLO WELCOME' ---->'COM'

SELECT SUBSTRING('HELLO WELCOME', 10,3);


CHARINDEX()
------------------

SYNTAX: CHARINDEX(EXPR TO FIND, 'EXPR TO SEARCH', [START LOCATION])

IT SEARCHES FOR A SUBSTRING IN A STRING AND RETURNS ITS POSITION. IT SUBSTRING IS NOT
FOUND IT RETURNS 0.

[START LOCATION] ---> DEFAULT IS 1

SELECT CHARINDEX('O', 'HELLO WELCOME');=>5


SELECT CHARINDEX('O', 'HELLO WELCOME',1);=>5

=> IT WILL RETURN THE POSITION OF FIRST OCCURENCE AS PER SPECIFIED START LOCATION

SELECT CHARINDEX('O', 'HELLO WELCOME',6);=> 11

SELECT CHARINDEX('-', 'HELLO-WELCOME',1);===> 6

SELECT CHARINDEX('LO', 'HELLO-WELCOME',1);=> 4

====================================================================
EXTRACT CHARACTERS BEFORE A SYMBOL(-)

SELECT STRING1, LEFT(STRING1, CHARINDEX('-', STRING1)-1) AS EXTRACT FROM


STRING_FUNCTIONS;

STRING1 EXTRACT
IDAA-123 IDAA
IDB-2345678 IDB
IDCCC-34 IDCCC

EXTRACT CHARACTERS AFTER THE SYMBOL (-)

SELECT STRING2, SUBSTRING(STRING2, CHARINDEX('-',STRING2)+1,LEN(STRING2)) FROM


STRING_FUNCTIONS

SELECT STRING2, RIGHT(STRING2,LEN(STRING2)- CHARINDEX('-',STRING2)) AS EXTRACT FROM


STRING_FUNCTIONS

STRING2 EXTRACT
123-IDAA IDAA
2345678-IDB IDB
34-IDCCC IDCCC
==================================================================================
FETCH THE CHARCTERS BETWEEN THE SYMBOLS IN STRING 3 COLUMN

STRING1 STRING2 STRING3


IDAA-123 123-IDAA IDAA-123-AB
IDB-2345678 2345678-IDB IDB-2345678-B
IDCCC-34 34-IDCCC IDCCC-34-CDE

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

LTRIM()

=> LTRIM(STRING) ===> REMOVES LEADING SPACE

SELECT LTRIM(' HELLO'); = > 'HELLO'

RTRIM()

=> RTRIM(STRING)= > REMOVES TRAILING SPACE


SELECT RTRIM('HELLO ');==> 'HELLO'

TRIM([CHARACTERS], STRING)

IF WE DONT SPECIFY THE CHARCTERS THEN IT REMOVES LEADING AND TRAILING SPACE

SELECT TRIM(' HELLO '); => 'HELLO'

TRIM CAN ALSO BE USED TO REMOVE SPACE OR ANY OTHER CHARACTER FROM BEGINING OR END OF
THE STRING

SUPPOSE I HAVE A STRING '32HELLO65'

I WANT TO REMOVE ANY NUMBER FROM 1 TO 6 APPEARING AT START OR END OF THE STRING THEN I
CAN USE:

SELECT TRIM('123456' FROM '32HELLO65') AS RESULT; ===> 'HELLO'

SELECT TRIM('#1@$-A ' FROM '#1@HEL LOA-$ ') AS RESULT; =>'HEL LO'
======================================================================================
=============
22-04-2022

REPLICATE()----> IT IS USED TO REPEAT A STRING FOR SEPCIFIED NUMBER OF TIMES

SYNTAXT: REPLICATE(STRNG, NUMBER OF TIMES)

SELECT REPLICATE('*',5); --> *****


SELECT REPLICATE(1,5);---> 11111

ACCOUNT
A/C NO --- 123456789456 -----------> 12******9456
126878956820-----------> 12******6820

SELECT ACCOUNT, LEFT(ACCOUNT,2)+REPLICATE('*',6)+RIGHT(ACCOUNT,4) FROM ACCOUNTMASTERS;


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

REPLACE() ----> REPLACES ALL OCCURANCES OF SPECIFIED STRING VALUES WITH ANOTHER
VALUE

SYNTAX ==> REPLACE(STRING EXPRESSION, STRING PATTERN, STRING REPLACEMENT)

SELECT REPLACE('HELLO HELLO', 'ELL', 'A'); => HAO HAO

SELECT REPLACE('HELLO', 'L', '**');=>HE****O

SELECT REPLACE( ' HI HOPE YOU ARE DOING GOOD ...I AM ALSO GOOD', 'GOOD', 'AWESOME');=>

HI HOPE YOU ARE DOING AWESOME ...I AM ALSO AWESOME


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

STUFF()---> IT INSERTS A STRING INTO ANOTHER STRING. IT DELETES A SPECIDIED LENGTH OF


CHARS IN FIRST STRING
AT START POSITION AND INSERTS SECOND STRING INTO THE FIRST STRING
AT START POSITION

SYNTAX=> STUFF(CHAREXPRESSION, STARTPOSITION, NUMBER OF CHARS TO DELETE, REPLACE WITH


EXPRESSION)

SELECT STUFF('abcdef', 2, 3,'ijklmn'); => aijklmnef aijklmnef

======================================================================================
================
TRANSLATE()-----> USED TO TRANSLATE ONE CHARACTER TO ANOTHER CHARACTER

WE USE TRANSLATE NORMALLY FOR ENCRYPTING THE DATA --- CHANING PLAIN TEXT TO CIPHER
TEXT

PASSOWRD ------- 123789ABC -----> SAIDEQ74Z

1 --------S
2----A
3-----I
7 ------D
8----E
9 ----Q
A--------7
B------4
C---Z

TRANSALTE(INPUTSTRING, CHARS, TRANSLATIONS)

SELECT TRANSLATE('HELLO' ,'ELO','ABC');==> HABBC

E--->A
L--> B
O--> C
========================================================

REVERSE()---- REVERSE THE STRING

SELECT REVERSE('HELLO')--> OLLEH


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

MATHEMATICAL FUNCTIONS
1. ABS() ----> RETURNS ABSOLUTE VALUE

ABS(NUMBER) -----> ABSOLUTE VALUE

SELECT ABS(-10); ----> 10

2. POWER()-->

POWER(BASE, EXPONENT)

SELECT POWER(3, 2); ---> 3^2 ----->9


SELECT POWER(4, 3); ----> 4^3 ---->64

3. SQRT() ---RETURNS SQUARE ROOT OF GIVEN NUMBER

SQRT(NUMBER) -

SELECT SQRT(16); ---> 4

4. SQUARE()----> IT RETURNS OF A NUMBER

SYNTAX : SQUARE(NUMBER)

SELECT SQUARE(5); ---> 5^2

SELECT POWER(5,2);---> 5^2

5. ROUND()

SYNTAX : ROUND(NUMBER, DECIMALPLACES)

SELECT ROUND(38.4785,2);------>38.48
SELECT ROUND(38.4735,2);------>38.47

SELECT ROUND(38.4735,1);-----> 38.5

SELECT ROUND(38.4735,0); ----> 38

SELECT ROUND(38.5735,0);----> 39

SELECT ROUND(383,-1); ------> 380

SELECT ROUND(386,-1); -----> 390

SELECT ROUND(383,-2); -----> 400

SELECT ROUND(325,-2); ----> 300

SELECT ROUND(325,-3); ----> 0

SELECT ROUND(525,-3); ---> 1000

SELECT ROUND(1525,-3); -----> 2000

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

CEILING() ---> IT RETURNS SMALLEST INTEGER VALUE GREATER THAN OR EQUAL TO THE GIVEN
NUMBER

SYNTAX: CEILING(NUMBER)

SELECT CEILING(3.1);===>4

SELECT CEILING(3.5);===>4

FLOOR()----> IT RETURNS LARGEST INTEGER VALUE LESS THAN OR EQUAL TO THE GIVEN NUMBER

SYNTAX : FLOOR(NUMBER)

SELECT FLOOR(3.1);====> 3
SELECT FLOOR(3.9);====> 3

-------------------------------------
IN WHICH CASES FLOOR AND CEILING MAY GIVE SAME RESULTS

FLOOR(INT) OR CEILING(INT)

SELECT FLOOR(3);------> 3

SELECT CEILING(3);----->3
====================================================================
=============================================
25-04-2022

CONVERSION FUNCTIONS----BASICALLY THERY ARE USED TO CONVERT ONE DATA TYPE INTO ANOTHER
DATA TYPE
1. CAST
2. CONVERT
3 PARSE **** SOME PERFORMANCE GAPS IN COMPARISON TO CAST OR CONVERT

=> DISPLAY IN EMP1 TABLE EXAMPLE -- NAVIN EARNS 3000

SELECT ENAME + ' ' + 'EARNS' + ' ' + SAL AS [MESSAGE] FROM EMP1 ===> ERROR
ERROR=> Cannot convert a char value to money. The char value has incorrect syntax.

CAST -----> CAST(SOURCE EXP AS TARGET DATA TYPE)


-------
SELECT CAST(10.5 AS INT); ==> 10
SELECT 10.5 + '1';---> 11.5
SELECT CAST(10.5 AS VARCHAR) + '1'; ----> 10.51 ----DEFAULT SIZE IS 30

SELECT CAST(10.5 AS VARCHAR(20)) + '1'; ----> 10.51

SELECT CAST('10.5' AS INT); ---> ERROR --Conversion failed when converting the varchar
value '10.5' to data type int.
SELECT CAST('10.00' AS INT);--->ERROR -Conversion failed when converting the varchar
value '10.00' to data type int.
SELECT CAST('10' AS INT);--> RETURNS INTEGER 10
SELECT CAST('10.25' AS DECIMAL(7,2));--> RETURNS DECIMAL NUMBER 10.25

=> DISPLAY IN EMP1 TABLE EXAMPLE -- NAVIN EARNS 3000

SELECT *,ENAME + ' ' + 'EARNS' + ' ' + CAST(SAL AS VARCHAR(20)) AS [MESSAGE] FROM EMP1
===================================================================================
CONCAT() ----- CONCAT(STR1, STR2.............) -----? IT CONVERTS OTHER DATA TYPES
INTO STRING

SELECT *,CONCAT(ENAME, ' ', 'EARNS', ' ', SAL) AS [MESSAGE] FROM EMP1
=================================================================================
CONCAT_WS()-------> IT CONVERTS OTHER DATA TYPES INTO STRING

CONCAT_WS(SEPERATOR, STR1, STR2, STR3, STR4.....)

SELECT CONCAT_WS('-', 'HELLO', 12, 'FINE')----> HELLO-12-FINE

=> DISPLAY IN EMP1 TABLE EXAMPLE -- NAVIN EARNS 3000


SELECT *,CONCAT_WS(' ',ENAME, 'EARNS',SAL) AS [MESSAGE] FROM EMP1;

=> JONES JOINED ON 2021-04-02 AS MANAGER

SELECT UPPER(ENAME) + ' JOINED ON ' + CAST(HIREDATE AS VARCHAR(20)) + ' AS ' + JOB AS
MESSAGE
FROM EMP1 WHERE EMPNO = 7566;
======================================================================================
=====

CONVERT()

CONVERT(TARGET TYPE, SOURCE EXPR,[STYLE NUMBER])

SELECT CONVERT(INT, 10.5); ---> 10.5


SELECT CONVERT(VARCHAR,10.5) + '1'; ---> 10.51

SELECT CONVERT(INT, '10.5');--->ERROR --Conversion failed when converting the varchar


value '10.5' to data type int.
SELECT CONVERT(INT, '10.00');--->ERROR -Conversion failed when converting the varchar
value '10.00' to data type int.
SELECT CONVERT(INT, '10');--->RETURNS INTEGER 10
SELECT CONVERT(DECIMAL(7,2), '10.25');--->RETURNS DECIMAL NUMBER 10.25

=> DISPLAY IN EMP1 TABLE EXAMPLE -- NAVIN EARNS 3000

SELECT * , ENAME + ' EARNS ' + CONVERT(VARCHAR, SAL) AS MESSAGE FROM EMP1;

----MM/DD/YYYY-----101------- RESULT ---2016-02-12


SELECT CONVERT(DATE, '02/12/2016',101);

============================================
--- DD/MM/YYYY-----103------ RESULT ------2016-12-02
SELECT CONVERT(DATE, '02/12/2016',103);

STYLE LINK ---https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-


transact-sql?view=sql-server-ver15

DISPLAYING DATES IN DIFFERENT FROMATS


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

CONVERT(VARCHAR, DATE, STYLENUMBER)

-- DISPLAY ENAME AND HIREDATE IN DD.MM.YYYY FORM

SELECT ENAME, CONVERT(VARCHAR, HIREDATE, 104) AS HIREDATE FROM EMP1;

ENAME HIREDATE
NAVIN 13.08.2017
ASHA 23.09.2017
ward 22.02.2021
jones 02.04.2021
martin 28.09.2021
blake 01.05.2021
clark 09.06.2021
turner 08.09.2021
adams 12.01.2019
james 03.12.2019
miller 23.01.2018

====================================================
SELECT ENAME, CONVERT(VARCHAR, HIREDATE, 106) AS HIREDATE FROM EMP1;

ENAME HIREDATE
NAVIN 13 Aug 2017
ASHA 23 Sep 2017
ward 22 Feb 2021
jones 02 Apr 2021
martin 28 Sep 2021
blake 01 May 2021
clark 09 Jun 2021
turner 08 Sep 2021
adams 12 Jan 2019
james 03 Dec 2019
miller 23 Jan 2018

========================================================
MONEY AND SMALLMONEY STYLES

14523625.5681 ----- 14,523,625 .57 ----1

14523625.5681----- 14523625.57----0

14523625.5681---- 14523625.5681

CONVERT(VARCHAR, EXPRE, STYLE)

Value Output
0 (default) No commas every three digits to the left of the decimal point,
and two digits to the right of the decimal point
Example: 4235.98.

1 Commas every three digits to the left of the decimal point, and two digits to
the right of the decimal point
Example: 3,510.92.

2 No commas every three digits to the left of the decimal point, and four digits
to the right of the decimal point
Example: 4235.9819.

SELECT SAL, CONVERT(VARCHAR,SAL,1) AS SAL1 FROM EMP1;

SAL SAL1
3000.00 3,000.00
4000.00 4,000.00
1250.00 1,250.00
2975.00 2,975.00
1250.00 1,250.00
2850.00 2,850.00
2450.00 2,450.00
45678915.479 45,678,915.48
1500.00 1,500.00
1100.00 1,100.00
950.00 950.00

SELECT SAL, CONVERT(VARCHAR,SAL,0) AS SAL1 FROM EMP1;


SAL
3000.00
SAL SAL1
3000.00 3000.00
4000.00 4000.00
1250.00 1250.00
2975.00 2975.00
1250.00 1250.00
2850.00 2850.00
2450.00 2450.00
45678915.479 45678915.48
1500.00 1500.00
1100.00 1100.00
950.00 950.00
1300.00 1300.00

SELECT SAL, CONVERT(VARCHAR,SAL,2) AS SAL1 FROM EMP1;

SAL SAL1
3000.00 3000.0000
4000.00 4000.0000
1250.00 1250.0000
2975.00 2975.0000
1250.00 1250.0000
2850.00 2850.0000
2450.00 2450.0000
45678915.479 45678915.4790
1500.00 1500.0000
1100.00 1100.0000
950.00 950.0000
1300.00 1300.0000

PARSE()
The SQL PARSE function is a SQL Conversions Function used to convert the String data
to the requested data type
.CAN TAKE ONLY STRING AS FIRST ARGUMENT

SELECT PARSE('10.5' AS INT); ---> ERROR--Error converting string value '10.5' into
data type int using culture ''.
SELECT PARSE('10' AS INT);--> RETURNS INTEGER 10
SELECT PARSE('10.5' AS DECIMAL(7,2));--> RETURNS DECIMAL NUMBER 10.50
SELECT PARSE('10.00' AS INT);----> RETURNS INTEGER 10
SELECT PARSE('2022-10-12' AS DATE); --> RETURNS DATE -- 2022-10-12
SELECT PARSE('THURSDAY. DECEMBER 05 2019' AS DATETIME USING 'en-US');---> RETURNS --
DATE TIME --2019-12-05 00:00:00.000
NOTE --> PREFER USING CAST AND CONVERT
=======================================

HOW TO AVOID ERROR WHILE DATA TYPE CONVERSION IS NOT POSSIBLE:


====================================================================
TRY_XX FUNCTIONS RETURNS NULL IF THEY ARE NOT ABLE TO CONVERT THE DATA TYPE
THEY WONT CRASH THE PROGRAM
=> WHEN DATA TYPE CONVERSION IS POSSIBLE THEY WILL BEHAVE LIKE NORMAL CONVERSION
FUNCTIONS.

SELECT PARSE('10.5'AS INT); --> Error converting string value '10.5' into data type
int using culture ''
SELECT TRY_PARSE('10.5' AS INT);---> RETURNS NULL
SELECT TRY_PARSE('10' AS INT); ----> RETURNS INTEGER 10

SELECT CAST('10.5'AS INT);-->Conversion failed when converting the varchar value


'10.5' to data type int
SELECT TRY_CAST('10.5'AS INT);---> RETURNS NULL

SELECT CAST('A' AS INT);-->Conversion failed when converting the varchar value 'A' to
data type int.
SELECT TRY_CAST('A' AS INT);-----> RETURNS NULL

SELECT CONVERT( INT, 'A');-->Conversion failed when converting the varchar value 'A'
to data type int
SELECT TRY_CONVERT( INT, 'A');---> RETURNS NULL

======================================================================================
==============
26-04-2022

SPECIAL FUNCTIONS ----USED TO DEAL WITH NULLS

SELECT *,FIRSTNAME + ' ' + MIDDLENAME + ' ' + LASTNAME AS FULLNAME FROM CUSTOMERS;

ID FIRSTNAME MIDDLENAME LASTNAMEFULLNAME


1 RAHUL KUMAR SHARMA RAHUL KUMAR SHARMA
2 JOHN NULL SMITH NULL
3 DAVID E WARNE DAVID E WARNE
4 STELLA NULL NULL NULL
5 RAMA NULL NULL NULL
6 SONY NULL DESOUZA NULL

SELECT *, SAL + COMM AS TOTALEXP FROM EMP1;

EMPNO
7999
EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO EMAILID
TOTALEXP
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 3400.00
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 4800.00
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 1750.00
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] NULL
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 2650.00
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] NULL
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] NULL
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 1500.00
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] NULL
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] NULL
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] NULL

WHEN EVER WE PERFORM SOME ARITHMATIC OPERATION WITH NULL OR DO CONCATENATION OPERATION
WITH NULL THEN
IT RETURNS NULL..

BUT CONCAT FUNCTION IGNORES NULL

SELECT *,CONCAT(FIRSTNAME,' ', MIDDLENAME, ' ', LASTNAME) AS FULLNAME FROM CUSTOMERS;

ID FIRSTNAME MIDDLENAME LASTNAMEFULLNAME


1 RAHUL KUMAR SHARMA RAHUL KUMAR SHARMA
2 JOHN NULL SMITH JOHN SMITH
3 DAVID E WARNE DAVID E WARNE
4 STELLA NULL NULL STELLA
5 RAMA NULL NULL RAMA
6 SONY NULL DESOUZA SONY DESOUZA

ISNULL()----> USED TO DEAL WITH NULL VALUES

ISNULL(ARG1, ARG2) ---> ARG1 SHOULD BE THE ONE WHICH MAY HAVE NULL VALUES
---> ARG2 SHOULD BE THE ONE WHICH YOU WANT IF ARG1
IS NULL

IF ARG1 IS NULL ====> WILL RETURN ARG2


IF ARG1 IS NOT NULL ===> WILL RETURN ARG1 ONLY

SELECT ISNULL(400, 500); ====> 400

SELECT ISNULL(NULL,500);====> 500

SELECT *, FIRSTNAME + ' ' + ISNULL(MIDDLENAME,'') +' ' + ISNULL(LASTNAME,'') AS


FULLNAME FROM CUSTOMERS;

SELECT ENAME, SAL, COMM, SAL+ ISNULL(COMM,0) AS TOTALEXPN FROM EMP1;


======================================================================================
=======================
ISNULL() FUNCTION AT A TIME CAN TAKE ONLY 2 ARGUMENTS BUT WE CAN USE NESTED ISNULL TO
TAKE MULTIPLE ARGUMENTS

FIRSTVALUE, SECONDVALUE, THIRDVALUE

ISNULL(ISNULL(FIRSTVALUE, SECONDVALUE), THIRDVALUE)


======================================================================================
=================================
COALESCE()

COALESCE(ARG1, ARG2, ARG3, AGR4...........)

COALESCE EVALUATES THE ARGUMENTS IN ORDER AND ALWAYS RETURN FIRST NON NULL VALUE FROM
ARGUMENT LIST

SELECT *, FIRSTNAME + ' ' + COALESCE(MIDDLENAME, '') + ' '+ COALESCE(LASTNAME,'') AS


FULLNAME FROM CUSTOMERS;

SELECT ENAME, SAL, COMM, SAL + COALESCE(COMM, 0) AS TOTALEXPN FROM EMP1;

===> ISNULL WILL RETURN THE DATA TYPE OF FIRST PARAMETER----


====> COALESCE WILL RETURN THE DATA TYPE OF HIGHEST PRECEDANCE

======================================================================================
======================================
NULLIF()---->

NULLIF(EXPR1, EXPR2)-- IF EXPR1 = EXPR2 ----> RETURNS NULL


IF EXPR1 <> EXPR2 ----> RETURNS EXPR1

IT RETURNS A NULL IF TWO SPECIFIED EXPRESSIONS ARE EQUAL

SELECT NULLIF(400, 400);---> RETURNS NULL


SELECT NULLIF(300, 500);----> RETURNS 300

SELECT 5/NULLIF(0, 0) -----> WILL RETURN NULL --- CAN BE USED TO HANDLE DIVIDE BY ZERO
ERROR BY PASSING FIRST EXPR TO BE DENOMINATOR

AND SECOND EXPRESSION TO BE 0.


======================================================================================
========================================
27-04 -2022

AGGREGATION FUNCTIONS ----- AGGREGATION FUNCTIONS OPERATE ON SET OF ROWS TO CALCULATE


AND RETURN A SINGLE OR SCALAR VALUE
-------------------------------------
SUM, MAX, MIN, AVG, COUNT

=>SUM, MAX, MIN, AVG ALL IGNORE NULLS

=>COUNT(COLUMN/EXPR) ---- IGNORE NULLS


=> COUNT(*)-----> CONSIDER NULLS
-----------------------------------------------------------
SUM() ---- WORKS WITH NUMERIC DATA

SUM([ALL | DISTINCT] ARG1) -------- ARG1 CAN BE A COLUMN(UNITPRICE) ...ALSO CAN BE


EXPRESSION (QTY*UNITPRICE)
DEFAULT VALUE IS ALL
SUM(COL1) -----> SUM ( ALL COL1) ---> 90 ----> NULL WILL BE IGNORED
10
20
10
20
30
NULL
SUM ( DISTINCT COL1) ----> IGNORE NULLS -----> 60 -- ONLY DISTINCT VALUES ARE
CONSIDERED

SELECT SUM(ALL VAL) FROM AGGREGATION; --> 90


SELECT SUM(VAL) FROM AGGREGATION; ---> 90
SELECT SUM(DISTINCT VAL) FROM AGGREGATION;-----> 60

SELECT * FROM SALES;

ORDERID PRODUCT QTY UNITPRICE


1 PROTEIN 2 500.00
2 CARB 5 100.00
3 BCAA 1 500.00
4 CREATINE2 200.00

SELECT SUM(QTY*UNITPRICE) AS TOTALSALES FROM SALES;


2400.00

SELECT SUM(DISTINCT QTY*UNITPRICE) AS TOTALSALES FROM SALES;


1900.00
--------------------------------------------------------------------------------------
-----------------------
AVG() ---WORKS WITH NUMERIC DATA

AVG([ALL | DISTINCT] ARG1) -------- ARG1 CAN BE A COLUMN ...ALSO CAN BE EXPRESSION
DEFAULT VALUE IS ALL
NULL WILL BE IGNORED

SELECT AVG(VAL) AS AVERAGE FROM AGGREGATION; ----18


SELECT AVG(DISTINCT VAL) AS AVERAGE FROM AGGREGATION;---> 20

--------------------------------------------------------------------------------------
------------------------
MAX() --works with NUMERIC, STRING, DATE

MAX([ALL | DISTINCT] ARG1) -------- ARG1 CAN BE A COLUMN ...ALSO CAN BE EXPRESSION
DEFAULT VALUE IS ALL
NULL WILL BE IGNORED

SELECT MAX(VAL) AS AVERAGE FROM AGGREGATION;--30


SELECT MAX(DISTINCT VAL) AS AVERAGE FROM AGGREGATION;----30

SELECT MAX(ENAME) FROM EMP1;-----> ward

SELECT MAX(hiredate) FROM EMP1; ----> 2021-09-28

--------------------------------------------------------------------------------------
---------------------------
MIN()----MAX() --works with NUMERIC, STRING, DATE

MIN([ALL | DISTINCT] ARG1) -------- ARG1 CAN BE A COLUMN ...ALSO CAN BE EXPRESSION
DEFAULT VALUE IS ALL
NULL WILL BE IGNORED

--------------------------------------------------------------------------------------
----------------------------
COUNT(COLUMN) ----> IT RETURNS NUMBER OF VALUES PRESENT IN A COLUMN
COUNT ( ALL|DISTINCT COLUMN) ---- DEFAULT VALUE IS ALL
NULL WILL BE
IGNORED

SELECT COUNT(VAL) FROM AGGREGATION; --> 5


SELECT COUNT(DISTINCT VAL) FROM AGGREGATION;--->3
SELECT COUNT(QTY*UNITPRICE )FROM SALES;-------> 4

--------------------------------------------------------------------------------------
-----------------
COUNT(*) ----> IT RETURNS THE NUMBER OF ROWS IN A TABLE
-----> IT CONSIDER NULLS

COUNT FUNCTION WHEN TAKING COLUMN OR EXPR AS AN ARGUMENT IGNORE NULLS BUT COUNT(*)
DOES NOT IGNORE NULLS
SELECT * FROM AGGREGATION;

VAL
10
20
10
20
30
NULL
SELECT COUNT(VAL) AS COUNTFN FROM AGGREGATION;--NUMBER OF VALUES INSIDE A COLUMN ---->
5
SELECT COUNT(*) AS COUNTROW FROM AGGREGATION; --NUMBER OF ROWS INSIDE A TABLE----->6

--------------------------------------------------------------------------------------
----------------------------------------------------
DISPLAY THE MAXIMUM SALARY PAID TO ANY EMPLOYEE IN EMP1 TABLE

SELECT MAX(SAL) FROM EMP1; ==> 4000


--------------------------------------------------------------------------------------
--------------------------------------------------
DISPLAY THE TOTAL SALARY PAID TO DEPTNO 10

SELECT SUM(SAL) FROM EMP1 WHERE DEPTNO =10; ===> 3750

--------------------------------------------------------------------------------------
---------------------------------
DISPLAY THE NUMBER OF EMPLOYEES JOINED IN YEAR 2021

SELECT COUNT(HIREDATE) FROM EMP1 WHERE YEAR(HIREDATE) = 2021;

SELECT COUNT(*) FROM EMP1 WHERE YEAR(HIREDATE) = 2021;

--------------------------------------------------------------------------------------
-----------------------------
DISPLAY THE NUMBER OF EMPLOYEES JOINED ON SUNDAY
SELECT COUNT(*) FROM EMP1 WHERE DATENAME(DW,HIREDATE) = 'SUNDAY';
--------------------------------------------------------------------------------------
----------------------------

DISPLAY THE COUNT OF DISTINCT JOBS AVAILABLE IN DEPTNO 30

SELECT COUNT(DISTINCT JOB) FROM EMP1 WHERE DEPTNO = 30;


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

DISPLAY THE AVERGAE SALARY PAID TO MANAGERS


SELECT AVG(SAL) FROM EMP1 WHERE JOB = 'MANAGER';---->2758.3333
--------------------------------------------------------------------------------------
-----------------
======================================================================================
=====================

GROUP BY
------------
SELECT FROM [WHERE] GROUP BY [HAVING] [ORDER BY]

EXECUTION ----> FROM WHERE GROUP BY HAVING SELECT ORDER BY

GROUP BY CLAUSE IS USED TO CONVERT THE DETAILED DATA INTO SUMMARIZED DATA
FOR EVERY GROUP GROUP BY WILL RETURN ONLY ONE ROW
=> DISPLAY THE DEPARTMENT WISE TOTAL SALARIES

SELECT DEPTNO, SUM(SAL) AS TOTAL_SALARY FROM EMP1 GROUP BY DEPTNO;

DEPTNO TOTAL_SALARY
10 3750.00
20 7075.00
30 11800.00

-------------------------------------------------------------------
DISPLAY JOB WISE NUMBER OF EMPLOYEES
SELECT JOB, COUNT(*) AS CNT FROM EMP1 GROUP BY JOB;
JOB CNT
CLERK 4
MANAGER 3
SALESMAN4
---------------------------------------------------------------------------
DISPLAY YEAR WISE NUMBER OF EMPLOYEES JOINED

SELECT YEAR(HIREDATE) AS [YEAR], COUNT(*) AS CNT FROM EMP1 GROUP BY YEAR(HIREDATE);

YEAR CNT
2017 2
2018 1
2019 2
2021 6
--------------------------------------------------------------------------------
DISPLAY THE DEPTT IN WHICH MORE THAN 3 EMPLOYEES ARE WORKING

SELECT DEPTNO, COUNT(*) FROM EMP1 GROUP BY DEPTNO HAVING COUNT(*)>3;

DEPTNO CNT
30 6

TO FILTER THE GROUPS CREATIED BY GROUP BY ---WE WILL USE HAVING CLAUSE
HAVING CLAUSE FILTER THE GROUPS
HAVING CLAUSE CAN HAVE AGGREGATE FUNCTION

==> IN CLAUSES AFTER GROUP BY, ELEMENT THAT DO NOT PARTICIPATE IN GROUP BY CLAUSE
ALLOWED ONLY AS INPUT TO AGGREGATE FUNCTIONS

=>DISPLAY THE DEPTT AND THE NUMBER OF EMPLOYEES IN EACH DEPARTMENT BUT ONLY THOSE
DEPARTMENTS
WHOSE TOTAL SALARY IS ABOVE 10000

SELECT DEPTNO, COUNT(*) AS CNT FROM EMP1 GROUP BY DEPTNO HAVING SUM(SAL) >10000;

DEPTNO CNT
30 6

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

=>DISPLAY JOB WISE NUMBER OF EMPLOYEES WHO ARE WORKING A CLERK, MANAGER

SELECT JOB, COUNT(*) FROM EMP1 WHERE JOB IN ('CLERK', 'MANAGER') GROUP BY JOB;

=>DISPLAY DEPTWISE AND WITH IN DEPT JOB WISETOTAL SALARY

SELECT DEPTNO,JOB, SUM(SAL) AS TOTALSAL FROM EMP1 GROUP BY DEPTNO, JOB ORDER BY
DEPTNO;

DEPTNO JOB TOTALSAL


10 CLERK 1300.00
10 MANAGER 2450.00
20 CLERK 4100.00
20 MANAGER 2975.00
30 CLERK 950.00
30 MANAGER 2850.00
30 SALESMAN8000.00

=> DISPLAY YEAR WISE NUMBER OF EMPLOYEES JOINED IN EACH DEPARTMENT

SELECT YEAR(HIREDATE) AS YEAR, DEPTNO, COUNT(*) AS NUM FROM EMP1 GROUP BY


YEAR(HIREDATE), DEPTNO ORDER BY YEAR(HIREDATE);
YEAR DEPTNO NUM
2017 20 1
2017 30 1
2018 10 1
2019 20 1
2019 30 1
2021 10 1
2021 20 1
2021 30 4

=>DISPLAY YEAR WISE NUMBER OF EMPLOYEES JOINED IN EACH DEPARTMENT BUT ONLY THOSE
RESULTS WHERE MINIMUM 2 EMPLOYEES JOINED

SELECT YEAR(HIREDATE) AS YEAR, DEPTNO, COUNT(*) AS NUM FROM EMP1 GROUP BY YEAR(
HIREDATE), DEPTNO HAVING COUNT(*)>=2;

YEAR DEPTNO NUM


2021 30 4

WHERE VS HAVING

WHERE
HAVING
SELECTS SPECIFIC ROWS
SELECTS SPECIFIC GROUPS
CONDITION APPLIED BEFORE GROUP BY
CONDITION APPLIED AFTER GROUP BY
WE CANT USE AGGREGATION FUNCTION
WE CAN USE AGGREGATION FUNCTION
GROUPING IS NOT REQUIRED FOR WHERE CONDITION GROUPING IS REQUIRED
TO APPLY HAVING CONDITION

======================================================================================
=============================
ROLLUP AND CUBE : THESE ARE USED CALCULATE TOTALS AND SUB TOTALS
ROLLUP:

=> DISPLAY THE DEPARTMENT WISE TOTAL SALARY AS WELL AS CUMMULATIVE SALARY:

SELECT ISNULL(CAST(DEPTNO AS VARCHAR),'ALL') AS DEPT, SUM(SAL) AS TOTALSAL FROM EMP1


GROUP BY ROLLUP(DEPTNO);

DEPT TOTALSAL
10 3750.00
20 7075.00
30 11800.00
ALL 22625.00

COL1 COL2 COL3 COL4 ---- GROUP BY USING ALL 4 COLUMN


COL1 COL2 COL3 NULL----GROUP BY USING COL1, COL2, COL3
COL1 COL2 NULL NULL----GROUP BY USING COL1, COL2
COL1 NULL NULL NULL ---GROUP BY USING COL1
NULL NULL NULL NULL

DEPTNO JOB ---GROUP BY USING BOTH THE COLUMNS ----7


DEPTNO NULL --------------------------------------------------------3
NULL NULL -----------------------------------------------1 GRAND TOTAL

SELECT DEPTNO, JOB, SUM(SAL) AS TOTALSAL FROM EMP1 GROUP BY ROLLUP(DEPTNO, JOB);

DEPTNO JOB TOTALSAL


10 CLERK 1300.00
10 MANAGER 2450.00
10 NULL 3750.00
20 CLERK 4100.00
20 MANAGER 2975.00
20 NULL 7075.00
30 CLERK 950.00
30 MANAGER 2850.00
30 SALESMAN8000.00
30 NULL 11800.00
NULL NULL 22625.00

SELECT ISNULL(CAST(DEPTNO AS VARCHAR),'ALL') AS DEPT, ISNULL(JOB,'ALL') AS JOB,


SUM(SAL) AS TOTALSAL
FROM EMP1 GROUP BY
ROLLUP(DEPTNO, JOB);

DEPT JOB TOTALSAL


10 CLERK 1300.00
10 MANAGER 2450.00
10 ALL 3750.00
20 CLERK 4100.00
20 MANAGER 2975.00
20 ALL 7075.00
30 CLERK 950.00
30 MANAGER 2850.00
30 SALESMAN8000.00
30 ALL 11800.00
ALL ALL 22625.00

======================================================================================
=============
CUBE: ALL USED FOR CALCULATING TOTALS AND SUBTOTALS

A B
0 0
0 1
1 0
1 1

A B C
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

CUBE

DEPTNO JOB
NULL NULL 1
NULL JOB 3
DEPTNO NULL 3
DEPTNO JOB 7

ROLL UP

DEPTNO JOB -
DEPTNO JOB
DEPTNO NULL
NULL NULL

SELECT DEPTNO, JOB, SUM(SAL) AS TOTALSAL FROM EMP1 GROUP BY CUBE(DEPTNO, JOB);

DEPTNO JOB TOTALSAL


NULL CLERK 6350.00
10 MANAGER 2450.00
20 MANAGER 2975.00
30 MANAGER 2850.00
NULL MANAGER 8275.00
30 SALESMAN8000.00
NULL SALESMAN8000.00
NULL NULL 22625.00
10 NULL 3750.00
20 NULL 7075.00
30 NULL 11800.00

=> DISPLAY DEPARTMENT WISE MAXIMUM SALARY

SELECT DEPTNO, MAX(SAL) FROM EMP1 GROUP BY DEPTNO;

DEPTNO (No column name)


10 2450.00
20 3000.00
30 4000.00

=> DISPLAY DEPARTMENT WISE MAXIMUM SALARY ALONG WITH THE NAME OF CORRESPONDING PERSON

SELECT ENAME, DEPTNO, SAL FROM EMP1 WHERE SAL IN (SELECT MAX(SAL) FROM EMP1 GROUP
BY DEPTNO);

ENAME DEPTNO SAL


NAVIN 20 3000.00
ASHA 30 4000.00
clark 10 2450.00

======================================================================================
===============================================
29-04-2022
WINDOWS FUNCTIONS --- WINDOW ---- A SET OF ROWS--- A WINDOW OF ROWS ------> OVER()

WINDOWS FUNCTIONS ARE USED IN SELECT CLAUSE AND ORDER BY CLAUSE

THESE WINDOWS FUNCTIONS ARE EVALUATED FOR EACH ROW

A WINDOW FUNCTION IS EVALUATED PER DETAILED ROW. IT IS APPLIED TO A SUBSET OF ROWS


THAT IS DERIVED FROM UNDERLYING QUERY.
THE RESULT OF WINDOW FUNCTION IS A SCALAR VALUE

EMP NO SAL WINDOWS


1 10 50
2 20 40
3 20 20

OVER([PARTITION BY ] [ORDER BY] [WINDOWS FRAME])


======================================================================================
====================
RANKING WINDOWS FUNCTIONS: THEY ARE USED FOR RANKING BASED ON ANY COLUMN OR
EXPRESSION
1. RANK
2. DENSE_RANK
3. ROW_NUMBER
4. NTILE
=> IN RANKING FUNCTIONS YOU NEED ORDER BY CLAUSE MANDATORY INSIDE OVER()
=> RANKING FUNCTIONS CAN HAVE ONLY PARTITION BY AND ORDER BY CLAUSE
=> FRAME CLAUSE IS NOT ALLOWED IN RANKING FUNCTIONS

RANKING FUNCTIONS ARE USED TO RANK EACH ROW WITH RESPECT TO OTHERS IN THE WINDOW.

RANK()
======
=>Returns the rank of each row within the partition of a result set.
=>The rank of a row is one plus the number of ranks that come before the row in
question.

SYNTAX: RANK() OVER([PARTITION BY....] ORDER BY COLNAME ASC/DESC)


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

=>DISPLAY THE RANKS OF EMPLOYEES BASED ON SALARY.....AND HIGHEST PAID EMPLOYEE SHOULD
GET 1ST RANK

SELECT *, RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID RNK
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 2
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 3
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 4
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 5
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 6
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 7
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 8
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 8
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 10
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 11

RANK() DOES SKIP RANKING ---- IN CASE OF TIE WE WILL NOT GET ALL THE RANKS ...
IF THEIR ARE 3 PERSONS HAVING SAME SALARY AT 8TH
POSITION THEN THEY WILL BE ASSIGNED
SAME 8TH RANK BUT NEXT PERSON WILL BE ASSIGNED 11TH
RANK..SO IN RESULT YOU WILL NOT SEE
9TH AND 10TH RANK
====================

DENSE_RANK() --------> IT DOES NOT SKIP RANK IN CASE OF TIES


IF THEIR ARE 3 PERSONS HAVING SAME SALARY AT 8TH POSITION THEN
THEY WILL BE ASSIGNED
SAME 8TH RANK BUT NEXT PERSON WILL BE ASSIGNED 9TH
RANK..SO IN RESULT YOU WILL NOT SEE
RANK SKIPPED

SYNTAX: DENSE_RANK() OVER([PARTITION BY....] ORDER BY COLNAME ASC/DESC)

=>DISPLAY THE RANKS OF EMPLOYEES BASED ON SALARY.....AND HIGHEST PAID EMPLOYEE SHOULD
GET 1ST RANK

SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID RNK
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 2
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 3
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 4
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 5
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 6
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 7
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 8
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 8
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 9
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 10

======================================
DISPLAY THE RANK OF EMPLOYEES BASED ON SALARY? THE PERSON HAVING HIGHEST SALARY SHOULD
BE RANK 1 BUT IN CASE OF TIE
RANKING SHOULD BE BASED ON EXPERIENCE IN OUR ORGANIZATION.

SELECT *, RANK() OVER(ORDER BY SAL DESC,HIREDATE ASC) AS RNK FROM EMP1;


=====================================================
DISPLAY THE RANK OF EACH EMPLOYEE IN THEIR DEPTT BASED ON SALARY. The person earning
higher salary should be given rank

Partition by -----> do group by -- create subgroup


PARTITION BY DEPTTNO -----> CREATE GROUPS FOR EACH DEPARTMENT

ROWS WILL BE DIVIDED DEPTT WISE USING PARTITION BY CLAUSE

FUNCTION WILL BE APPLIED ON CORRESPONDING GROUP

SELECT *, RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS RNK FROM EMP1;
EMPNO
7782
EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO
EMAILID RNK
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 1
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 2
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 1
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 2
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 3
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 2
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 3
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 4
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 4
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 6

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

ROW_NUMBER()

=> IT RETURNS ROW NUMBER OR RECORD NUMBER


=> IT ASSIGNS INCREMENTAL SEQUENTIAL INTEGER TO THE ROWS IN THE QUERY RESULT BASED ON
WINDOW ORDERING.
=> ROW NUMBER FUNCTION ASSIGNS UNIQUE VALUES EVEN WHEN THERE IS TIE IN ORDERING
VALUES.

SELECT *, ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RNO FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID RNO
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 2
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 3
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 4
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 5
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 6
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 7
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 8
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 9
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 10
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 11
--------------------------------------------------------------------------------------
----------

NTILE()
=> IT IS USED TO DIVIDE THE RESULT SET INTO BUCKETS OF EQUAL SIZE
=> SUPPOSE WE USE NTILE(3) THEN NTILE TRIES TO DIVIDE THE RESULT SET INTO 3 GROUPS
HAVING SAME NUMBER OF ROWS BASED ON
ORDERING.
=> SUPPOSE WE USE NTILE(3) AND WE HAVE 09 ROWS IN RESULT SET THEN WE WILL GET 3
GROUPS EACH WITH 3 ROWS
AND TILE NUMBER IS ASSIGNED SEQUENTIALLY TO EACH GROUP . ALL THE ROWS IN A
PARTICULAR GROUP WILL HAVE SAME TILE NUMBER
LIKE GROUP1 ----- TILE NUMBER 1
GROUP2 -----TILE NUMBER 2
GROUP3 -----TILE NUMBER 3

=> BUT SUPPOSE WE USE NTILE(3) AND WE HAVE 11 ROWS SO 3 GROUPS WITH EQUAL NUMBER OF
ROWS CAN NOT BE CREATED..IN THAT CASE
IT WILL CREATE 3 GROUPS -- FIRST GROUP WILL HAVE 4 ROWS,
SECOND GROUP WILL ALSO HAVE 4 ROWS
BUT THIRD GROUP WILL BE ASSIGNED 3 ROWS AS IT ASSIGNS
GROUP1 3 ROWS + 1 ROW OUT OF REMAINDER
GROUP2 3 ROWS + 1 ROW OUT OF REMAINDER
GROUP3 3 ROWS

SELECT *, NTILE(11) OVER(ORDER BY SAL DESC) AS NTL FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID NTL
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 2
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 3
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 4
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 5
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 6
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 7
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 8
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 9
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 10
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 11

SELECT *, NTILE(3) OVER(ORDER BY SAL DESC) AS NTL FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID NTL
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 1
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 1
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 1
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 1
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 2
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 2
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 2
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 2
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 3
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 3
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 3
======================================================================================
==============================

02-05-2022
=>FROM THE PRODUCTS TABLE DISPLAY THE COMPLETE DETAILS OF THE MOST EXPENSIVE PRODUCT
OF EACH CATEGORY
SELECT PRODUCT_CATEGORY, BRAND, PRODUCT_NAME, PRICE FROM

(SELECT * ,ROW_NUMBER() OVER (PARTITION BY PRODUCT_CATEGORY ORDER BY PRICE DESC) AS RN


FROM PRODUCT) AS TEMP WHERE RN= 1;

EarphoneApple AirPods Pro 280


Headphone Apple AirPods Max 550
Laptop Dell XPS 17 2500
Phone Samsung Galaxy Z Fold 3 1800
Smartwatch Apple Apple Watch Series 6 1000

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

WINDOWS AGGREGATE FUNCTION ------> YTD, MTD, WTD, RUNNING TOTALS , PERCENTAGE OUT OF
TOTAL

=> THEY CAN BE USED TO AGGREGATE ROWS IN DEFINED WINDOW

IN WINDOWS AGGREGATE FUNCTION WE CAN HAVE ALL 3 CLAUSES IN OVER(), BUT NOTHING IS
MANDATORY

OVER( [PARTITION BY] [ORDER BY] [FRAME CLAUSE])

SUM(SAL) OVER() ----> IT EXPOSES ALL THE ROWS IN RESULT SET AND GIVES GRAND TOTAL OF
ALL THE ROWS

SELECT *, SUM(SAL) OVER() AS TOTAL FROM EMP1;

EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO


EMAILID TOTAL
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 22625.00
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 22625.00
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 22625.00
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 22625.00
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 22625.00
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 22625.00
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 22625.00
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 22625.00
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 22625.00
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 22625.00
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 22625.00

SUM(SAL) OVER(PARTITION BY DEPTNO)-- GIVES TOTAL VALUE FOR CURRENT DEPARTMENT


SELECT *,SUM(SAL) OVER() AS GRANDTOTAL,
SUM(SAL) OVER(PARTITION BY DEPTNO) AS DEPTTOTAL FROM EMP1;
EMPNO
7782
EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO
EMAILID GRANDTOTAL DEPTTOTAL
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 22625.003750.00
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 22625.003750.00
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 22625.007075.00
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 22625.007075.00
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 22625.007075.00
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 22625.0011800.00
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 22625.0011800.00
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 22625.0011800.00
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 22625.0011800.00
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 22625.0011800.00
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 22625.0011800.00

===
SALARY PERCENTAGE WITH RESPECT TO TOTAL AND SALARY PERCENETAGE WITH RESPECT TO
INDIVIDUAL DEPARTMENT

SELECT *,
100*SAL/SUM(SAL) OVER() AS PERCTOTAL,
100*SAL/SUM(SAL) OVER(PARTITION BY DEPTNO) AS PERCDEPTT

FROM EMP1;

EMPNO
7782
EMPNO ENAME JOB MGR HIREDATESAL COMM DEPTNO
EMAILID PERCTOTAL PERCDEPTT
7782 clark MANAGER 7839 2021-06-09 2450.00 NULL 10
[email protected] 10.8287 65.3333
7934 miller CLERK 7782 2018-01-23 1300.00 NULL 10
[email protected] 5.7458 34.6666
7876 adams CLERK 7788 2019-01-12 1100.00 NULL 20
[email protected] 4.8618 15.5477
7999 NAVIN CLERK 7566 2017-08-13 3000.00 400.00 20
[email protected] 13.2596 42.4028
7566 jones MANAGER 7839 2021-04-02 2975.00 NULL 20
[email protected] 13.1491 42.0494
7654 martin SALESMAN7698 2021-09-28 1250.00 1400.00 30
[email protected] 5.5248 10.5932
7698 blake MANAGER 7839 2021-05-01 2850.00 NULL 30
[email protected] 12.5966 24.1525
7899 ASHA SALESMAN7521 2017-09-23 4000.00 800.00 30
[email protected] 17.6795 33.8983
7521 ward SALESMAN7698 2021-02-22 1250.00 500.00 30
[email protected] 5.5248 10.5932
7900 james CLERK 7698 2019-12-03 950.00 NULL 30
[email protected] 4.1988 8.0508
7844 turner SALESMAN7698 2021-09-08 1500.00 0.00 30
[email protected] 6.6298 12.7118

========================================================
SUM(SAL) OVER(ORDER BY SAL) ===== SUM(SAL) OVER(ORDER BY SAL RANGE BETWEEN UNBOUNDED
PRECEDING AND CURRENT ROW)

USED TO GET RUNNING TOTALS---


SELECT ENAME, SAL, SUM(SAL) OVER(ORDER BY SAL ASC) AS RUNNINGTOTAL,
SUM(SAL) OVER(ORDER BY SAL ASC RANGE BETWEEN UNBOUNDED PRECEDING
AND
CURRENT ROW) AS RUNNINGTOTAL1,
SUM(SAL) OVER(ORDER BY SAL ASC ROWS BETWEEN
UNBOUNDED PRECEDING AND CURRENT ROW) AS RUNNINGTOTAL2

FROM EMP1;

ENAME SAL RUNNINGTOTAL RUNNINGTOTAL1 RUNNINGTOTAL2


james 950.00 950.00 950.00 950.00
adams 1100.00 2050.00 2050.00 2050.00
ward 1250.00 4550.00 4550.00 3300.00
martin 1250.00 4550.00 4550.00 4550.00
miller 1300.00 5850.00 5850.00 5850.00
turner 1500.00 7350.00 7350.00 7350.00
clark 2450.00 9800.00 9800.00 9800.00
blake 2850.00 12650.0012650.0012650.00
jones 2975.00 15625.0015625.0015625.00
NAVIN 3000.00 18625.0018625.0018625.00
ASHA 4000.00 22625.0022625.0022625.00

SHOW YTD FOR OPEN COLUMN


SELECT DATE, [OPEN], SUM([OPEN]) OVER(PARTITION BY YEAR([DATE]) ORDER BY [DATE]) AS
YTD FROM STOCK;

SHOW MTD
SELECT DATE, [OPEN], SUM([OPEN]) OVER(PARTITION BY YEAR([DATE]),MONTH([DATE]) ORDER BY
[DATE]) AS MTD FROM STOCK;
======================================================================================
===============================
03-05-2022

RUNNING TOTAL WITH IN THE DEPARTMENT


SELECT ENAME,DEPTNO, SAL, SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN
UNBOUNDED PRECEDING AND
CURRENT ROW) FROM EMP1;

ENAME DEPTNO SAL (No column name)


miller 10 1300.00 1300.00
clark 10 2450.00 3750.00
adams 20 1100.00 1100.00
jones 20 2975.00 4075.00
NAVIN 20 3000.00 7075.00
james 30 950.00 950.00
martin 30 1250.00 2200.00
ward 30 1250.00 3450.00
turner 30 1500.00 4950.00
blake 30 2850.00 7800.00
ASHA 30 4000.00 11800.00

=>SELECT ENAME,SAL, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN


CURRENT ROW AND UNBOUNDED FOLLOWING)
AS RT1,

SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN


UNBOUNDED PRECEDING AND CURRENT ROW)
AS RT2

FROM EMP1;

ENAME
james
ENAME SAL RT1 RT2
james 950.00 22625.00950.00
adams 1100.00 21675.002050.00
martin 1250.00 19325.003300.00
ward 1250.00 20575.004550.00
miller 1300.00 18075.005850.00
turner 1500.00 16775.007350.00
clark 2450.00 15275.009800.00
blake 2850.00 12825.0012650.00
jones 2975.00 9975.00 15625.00
NAVIN 3000.00 7000.00 18625.00
ASHA 4000.00 4000.00 22625.00

=>SELECT ENAME,SAL, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN


1 PRECEDING AND CURRENT ROW) AS RT1

FROM EMP1;
ENAME
james
ENAME SAL RT1
james 950.00 950.00
adams 1100.00 2050.00
ward 1250.00 2350.00
martin 1250.00 2500.00
miller 1300.00 2550.00
turner 1500.00 2800.00
clark 2450.00 3950.00
blake 2850.00 5300.00
jones 2975.00 5825.00
NAVIN 3000.00 5975.00
ASHA 4000.00 7000.00

=>SELECT ENAME,SAL, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN


1 PRECEDING AND 1 FOLLOWING) AS RT1
FROM EMP1;

ENAME SAL RT1


james 950.00 2050.00
adams 1100.00 3300.00
ward 1250.00 3600.00
martin 1250.00 3800.00
miller 1300.00 4050.00
turner 1500.00 5250.00
clark 2450.00 6800.00
blake 2850.00 8275.00
jones 2975.00 8825.00
NAVIN 3000.00 9975.00
ASHA 4000.00 7000.00

=>SELECT DATE, [OPEN], SUM([OPEN])


OVER(ORDER BY DATE ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) FROM STOCK;

DATE OPEN (No column name)


2010-07-01 23.09 NULL
2010-07-02 23.36 23.09
2010-07-06 23.70 23.36
2010-07-07 23.82 23.70
2010-07-08 24.60 23.82
2010-07-09 24.33 24.60
2010-07-12 24.43 24.33
2010-07-13 25.14 24.43
2010-07-14 25.50 25.14
2010-07-15 25.50 25.50
2010-07-16 25.51 25.50

=>SELECT DATE, [OPEN], SUM([OPEN])


OVER(ORDER BY DATE ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM STOCK;

DATE OPEN (No column name)


2010-07-01 23.09 NULL
2010-07-02 23.36 23.09
2010-07-06 23.70 46.45
2010-07-07 23.82 47.06
2010-07-08 24.60 47.52
2010-07-09 24.33 48.42
2010-07-12 24.43 48.93
2010-07-13 25.14 48.76
2010-07-14 25.50 49.57
2010-07-15 25.50 50.64
2010-07-16 25.51 51.00

=>SELECT DATE, [OPEN], SUM([OPEN])


OVER(ORDER BY DATE ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) FROM STOCK;

DATE OPEN (No column name)


2010-07-01 23.09 46.45
2010-07-02 23.36 70.15
2010-07-06 23.70 93.97
2010-07-07 23.82 95.48
2010-07-08 24.60 96.45
2010-07-09 24.33 97.18
2010-07-12 24.43 98.50
2010-07-13 25.14 99.40
2010-07-14 25.50 100.57
2010-07-15 25.50 101.65
2010-07-16 25.51 101.47
========================================================
WINDOWS ANALYTIC FUNCTIONS
LAG ALSO KNOWN AS (offset function)
LEAD ALSO KNOWN AS (offset function)
FIRST_VALUE ALSO KNOWN AS (offset function)
LAST_VALUE ALSO KNOWN AS (offset function)
CUME_DIST
PERECENT_RANK
PERCENTILE_CONT
PERCENTILE_DISC

===================================
LAG()/LEAD()----------------- ARE USED TO RETURN AN ELEMENT FROM A ROW THAT IS AT A
CERTAIN OFFSET FROM THE CURRENT ROW
FIRST_VALUE()/ LAST_VALUE()------ARE USED TO RETURN AN ELEMENT FROM A ROW THAT IS AT
THE BEGINING OR END OF WINDOWS FRAME

LAG(SCALAR EXPRESSION, [OFFSET], [DEFAULT]) ---- DEFAULT VALUE OF OFFSET IS 1


--- [DEFAULT] INDICATES WHAT VALUE TO
RETURN IF DEMANDED ROW DOES NOT EXIST
IF NOT PASSED WILL RETURN NULL IF
DEMANDED ROW DOES NOT EXISTS

SYNTAX: LAG(SCALAR EXPRESSION, [OFFSET], [DEFAULT]) OVER ([PARTITION BY CLAUSE]


ORDER BY EXP)
SYNTAX: LEAD(SCALAR EXPRESSION, [OFFSET], [DEFAULT]) OVER ([PARTITION BY CLAUSE]
ORDER BY EXP)

=>LAG AND LEAD SUPPORTS [PARTITION BY] AND ORDER BY CLAUSE(Mandatory) BUT DOES NOT
SUPPORT FRAMING CLAUSE

=>LAG FUNCTION LOOK BEFORE THE CURRENT ROW BASED ON INDICATED ORDERING
=>LEAD FUNCTION LOOK AFTER THE CURRENT ROW BASED ON INDICATED ORDERING

=> SELECT ENAME, SAL, LAG(SAL) OVER(ORDER BY SAL) AS LAGG FROM EMP1;

ENAME SAL LAGG


james 950.00 NULL
adams 1100.00 950.00
ward 1250.00 1100.00
martin 1250.00 1250.00
miller 1300.00 1250.00
turner 1500.00 1300.00
clark 2450.00 1500.00
blake 2850.00 2450.00
jones 2975.00 2850.00
NAVIN 3000.00 2975.00
ASHA 4000.00 3000.00

=> SELECT ENAME, SAL, LAG(SAL,2) OVER(ORDER BY SAL) AS LAGG FROM EMP1;

ENAME SAL LAGG


james 950.00 NULL
adams 1100.00 NULL
ward 1250.00 950.00
martin 1250.00 1100.00
miller 1300.00 1250.00
turner 1500.00 1250.00
clark 2450.00 1300.00
blake 2850.00 1500.00
jones 2975.00 2450.00
NAVIN 3000.00 2850.00
ASHA 4000.00 2975.00

=>SELECT ENAME, SAL, LAG(CAST(SAL AS VARCHAR),2,'N/A') OVER(ORDER BY SAL) AS LAGG FROM


EMP1;

ENAME SAL LAGG


james 950.00 N/A
adams 1100.00 N/A
ward 1250.00 950.00
martin 1250.00 1100.00
miller 1300.00 1250.00
turner 1500.00 1250.00
clark 2450.00 1300.00
blake 2850.00 1500.00
jones 2975.00 2450.00
NAVIN 3000.00 2850.00
ASHA 4000.00 2975.00

=> SELECT ENAME, SAL, LEAD(SAL) OVER(ORDER BY SAL) AS LAGG FROM EMP1;

ENAME SAL LAGG


james 950.00 1100.00
adams 1100.00 1250.00
ward 1250.00 1250.00
martin 1250.00 1300.00
miller 1300.00 1500.00
turner 1500.00 2450.00
clark 2450.00 2850.00
blake 2850.00 2975.00
jones 2975.00 3000.00
NAVIN 3000.00 4000.00
ASHA 4000.00 NULL

=>SELECT ENAME, SAL, LEAD(SAL,2) OVER(ORDER BY SAL) AS LAGG FROM EMP1;

=>SELECT ENAME, SAL, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN 2 FOLLOWING AND 2
FOLLOWING) FROM EMP1;

ENAME SAL LEAD


james 950.00 1250.00
adams 1100.00 1250.00
ward 1250.00 1300.00
martin 1250.00 1500.00
miller 1300.00 2450.00
turner 1500.00 2850.00
clark 2450.00 2975.00
blake 2850.00 3000.00
jones 2975.00 4000.00
NAVIN 3000.00 NULL
ASHA 4000.00 NULL
======================================================================================
====================================
04-05-2022

FIRST_VALUE---> THEY RETURN AN ELEMENT FROM FIRST ROW OF CORRESPONDING WINDOW FRAME

FIRST_VALUE(SCALAR EXPRESSION) OVER([PARTITION BY] ORDER BY [FRAME CLAUSE])

=> DISPLAY MOST EXPENSIVE PRODUCT NAME IN EACH CATEGORY

SELECT *, FIRST_VALUE(product_name) OVER(PARTITION BY PRODUCT_CATEGORY ORDER BY PRICE


DESC) AS MOSTEXP FROM PRODUCT;

product_category
Earphone
product_categorybrand product_name price MOSTEXP
Earphone Apple AirPods Pro 280 AirPods Pro
Earphone Sony WF-1000XM4 250 AirPods Pro
Earphone Samsung Galaxy Buds Pro 220 AirPods Pro
Earphone Samsung Galaxy Buds Live170 AirPods Pro
Headphone Apple AirPods Max 550 AirPods Max
Headphone Sony WH-1000XM4 400 AirPods Max
Headphone Microsoft Surface Headphones 2 250 AirPods Max
Laptop Dell XPS 17 2500 XPS 17
Laptop Dell XPS 15 2300 XPS 17
Laptop Microsoft Surface Laptop 42100 XPS 17
Laptop Dell XPS 13 2000 XPS 17
Laptop Apple MacBook Pro 13 2000 XPS 17
Laptop Apple MacBook Air 1200 XPS 17
Phone Samsung Galaxy Z Fold 3 1800 Galaxy Z Fold
3
Phone Apple iPhone 12 Pro Max 1300 Galaxy Z Fold
3
Phone Samsung Galaxy Note 20 1200 Galaxy Z Fold
3
Phone Apple iPhone 12 Pro 1100 Galaxy Z Fold
3
Phone Apple iPhone 12 1000 Galaxy Z Fold
3
Phone Samsung Galaxy Z Flip 3 1000 Galaxy Z Fold
3
Phone Samsung Galaxy S21 1000 Galaxy Z Fold
3
Phone OnePlus OnePlus 9 800 Galaxy Z Fold
3
Phone Google Pixel 5 600 Galaxy Z Fold
3
Phone OnePlus OnePlus Nord 300 Galaxy Z Fold
3
Smartwatch Apple Apple Watch Series 6 1000 Apple Watch
Series 6
Smartwatch Samsung Galaxy Watch 4 600 Apple Watch
Series 6
Smartwatch Apple Apple Watch SE 400 Apple Watch
Series 6
Smartwatch OnePlus OnePlus Watch 220 Apple Watch
Series 6

=> LEAST EXPENSIVE PRODUCT IN EACH CATEGORY


SELECT *, FIRST_VALUE(product_name) OVER(PARTITION BY PRODUCT_CATEGORY ORDER BY PRICE
ASC) AS LEASTEXP FROM PRODUCT;
======================================================================================
===============================

LAST_VALUE() -----IT RETURNS AN ELEMENT FROM LAST ROW IN WINDOW'S FRAME

SYNTAX : LAST_VALUE(SCALAR EXPRESSION) OVER([PARTITION BY] ORDER BY [FRAME CLAUSE])

SELECT *, LAST_VALUE(product_name) OVER(PARTITION BY PRODUCT_CATEGORY ORDER BY PRICE


ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS MOSTEXP FROM
PRODUCT;

======================================================================================
==================================
CUME_DIST() ---> IT CALCULATES THE RELATIVE POSITION OF A SPECIFIED VALUE IN A GROUP
OF VALUES, BY DETERMINING THE
PERCENTAGE OF VALUES WHICH ARE LESS THAN OR EQUAL TO THAT VALUE.

SYNTAX : CUME_DIST() OVER([Partition by] ORDER BY CLAUSE)

=>VALUE IS COMPUTED AS : NUMBER OF VALUES LESS THAN OR EQUAL TO THE CURRENT


VALUE/(NUMBER OF ROWS IN GROUP)

=> PERCENTAGE OF SALARIES LESS THAN OR EQUAL TO THE CURRENT SALARY IN ENTIRE
ORGANIZATION

SELECT SAL, CUME_DIST() OVER(ORDER BY SAL ASC) AS CUMDIST FROM EMP1;

SAL CUMDIST
950.00 0.0909090909090909
1100.00 0.181818181818182
1250.00 0.363636363636364
1250.00 0.363636363636364
1300.00 0.454545454545455
1500.00 0.545454545454545
2450.00 0.636363636363636
2850.00 0.727272727272727
2975.00 0.818181818181818
3000.00 0.909090909090909
4000.00 1

=> PERCENTAGE OF SALARIES LESS THAN OR EQUAL TO THE CURRENT SALARY WITH IN EACH
DEPARTMENT
SELECT DEPTNO, SAL, CUME_DIST() OVER(PARTITION BY DEPTNO ORDER BY SAL ASC) AS CUMDIST
FROM EMP1;

DEPTNO SAL CUMDIST


10 1300.00 0.5
10 2450.00 1
20 1100.00 0.333333333333333
20 2975.00 0.666666666666667
20 3000.00 1
30 950.00 0.166666666666667
30 1250.00 0.5
30 1250.00 0.5
30 1500.00 0.666666666666667
30 2850.00 0.833333333333333
30 4000.00 1

======================================================================================
====
PERCENT_RANK()-----CALCULATES THE RANKING OF ROW RELATIVE TO THE ROW SET.. THE
PERCENTAGE IS BASED ON THE NUMBER OF ROWS
IN THE GROUP THAT HAVE A LOWER VALUE THAN CURRENT ROW.
-- IN DENOMINATOR IT WILL USE (NUMBER OF ROWS IN GROUP - 1)

-- VALUE IS COMPUTED AS : NUMBER OF VALUES BELOW THE CURRENT VALUE/(NUMBER OF ROWS IN


GROUP - 1)

SYNTAX : PERCENT_RANK() OVER([Partition by] ORDER BY CLAUSE)

=> PERCENTAGE OF SALARY VALUES LESS THAN THE CURRENT VALUE

SELECT SAL, PERCENT_RANK() OVER(ORDER BY SAL ASC) AS PERCRANK FROM EMP1;

SAL PERCRNK
950.00 0
1100.00 0.1
1250.00 0.2
1250.00 0.2
1300.00 0.4
1500.00 0.5
2450.00 0.6
2850.00 0.7
2975.00 0.8
3000.00 0.9
4000.00 1

=> PERCENTAGE OF SALARY VALUES LESS THAN THE CURRENT VALUE IN EACH DEPARTMENT

SELECT DEPTNO, SAL, PERCENT_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL ASC) AS


PRECRNK FROM EMP1;

DEPTNO SAL PRECRNK


10 1300.00 0
10 2450.00 1
20 1100.00 0
20 2975.00 0.5
20 3000.00 1
30 950.00 0
30 1250.00 0.2
30 1250.00 0.2
30 1500.00 0.6
30 2850.00 0.8
30 4000.00 1
======================================================================================
==============
PERCENTILE_CONT()
CALCULATES THE PERCENTILES BASED ON CONITNUOUS DISTRIBUTION OF COLUMN VALUE
YOU MAY GET THE RESULT WHICH MAY NOT MATCH TO ANY SPECIFIC VALUE IN THE COLUMN

SYNTAX: PERCENTILE_CONT(NUMERIC VALUE B/W 0 AND 1) WITHIN GROUP(ORDER BY


order_by_expression [ ASC | DESC ]) OVER([PARTITION BY CLAUSE])

--- WHAT IS THE MEDIAN (50 PERCENTILE) OF SALARY COLUMN


-- SHOW ME THE THE VALUE IN SALARY (MEDIAN) BELOW WHICH THERE ARE 50% OF THE VALUES
-- IN THE SALARY COLUMN SHOW ME THE VALUE WHERE 50% OF THE VALUES ARE BELOW THIS VALUE

=> SELECT SAL, PERCENT_RANK() OVER( ORDER BY SAL ASC) AS PRECRNK,


PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY SAL) OVER() AS PERCENTILE
FROM EMP1;
======================================================================================
================
PERCENTILE_DISC()
SYNTAX : PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY
order_by_expression [ ASC | DESC ] )
OVER ( [ <partition_by_clause> ] )

PERCENTILE_DISC calculates the percentile based on a discrete distribution of the


column values.
Computes a specific percentile for sorted values in an entire rowset or within a
rowset's distinct partitions
in SQL Server. For a given percentile value P, PERCENTILE_DISC sorts the expression
values in the ORDER BY clause.
It then returns the value with the smallest CUME_DIST value given (with respect to the
same sort specification) that is greater than
or equal to P. For example, PERCENTILE_DISC (0.5) will compute the 50th percentile
(that is, the median) of an expression.

The result is equal to a specific column value.

SELECT SAL, PERCENT_RANK() OVER(ORDER BY SAL ASC) AS PERCRANK,


PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SAL) OVER() AS PERCENTILE FROM
EMP1;

10, 30, 20, 40,50,30,70,50,50,60----------> 10,20,30,30,40,50,50,50,60,70 = 10/2 -


--(5 DIGIT+6DIGIT)/2 ---MEDIAN --50%
(40 +
50)/2 - 45
======================================================================================
=================================
05-05-2022
INTEGRITY CONSTRAINTS

=> INTEGRITY CONSTRAINTS ARE THE RULES TO MAINTAIN DATA QUALITY


=> INTEGRITY CONSTRAINTS ARE USED TO PREVENT USERS FROM ENTERING INVALID DATA
=> THESE ARE USED TO ENFORCE RULES LIKE MINIMUM BALANCE IS 1000/- RUPEES
=> THERE ARE DIFFERENT INTEGRITY CONSTRAINTS IN SQL SERVER

1 NOT NULL
2 UNIQUE
3 PRIMARY KEY
4 CHECK
5 FOREIGN KEY
6 DEFAULT

=> CONSTRAINTS CAN BE DECALRED IN TWO WAYS:


1. Column level
2. Table Level

COLUMN LEVEL:
-------------
IF CONSTRAINTS ARE DECLARED IMMEDIATELY AFTER DECLARING COLUMN THEN IT IS CALLED
COLUMN LEVEL CONSTRAINT
CREATE TABLE <TABLENAME> (
COL1 DATATYPE(SIZE) CONSTRAINT,
COL2 DATATYPE(SIZE)........)

1. NOT NULL

=> IT DOES NOT ACCEPT NULL VALUES


=> A COLUMN DECLARED WITH NOT NULL IS CALLED MANDATORY COLUMN

CREATE TABLE EMP11(


empno int,
ename varchar(20) NOT NULL);

INSERT INTO EMP11 VALUES(10, 'RAM');-- 1 ROW AFFECTED


INSERT INTO EMP11 VALUES(11, NULL);--ERROR NULLS NOT ALLOWED IN ENAME COLUMN
INSERT INTO EMP11(empno) VALUES(11);--ERROR NULLS NOT ALLOWED IN ENAME COLUMN

2. UNIQUE

=> THIS CONSTRAINT WILL NOT ALLOW DUPLICATE ENTERIES

CREATE TABLE CUST(


CUSTID INT,
CNAME VARCHAR(20),
EMAIL VARCHAR(30) UNIQUE);

INSERT INTO CUST VALUES(100, 'RAM', '[email protected]'); -- 1 ROW AFFECTED


INSERT INTO CUST VALUES(101, 'SHYAM', '[email protected]');-- 1 ROW AFFECTED
INSERT INTO CUST VALUES(102, 'SITA', '[email protected]');-- ERROR Cannot insert duplicate
INSERT INTO CUST VALUES(103, 'DAVID', NULL);-- 1 ROW AFFECTED
INSERT INTO CUST VALUES(104, 'STELLA', NULL);--ERROR Cannot insert duplicate

3. PRIMARY KEY
=> THIS CONSTRAINTS IS A COMBINATION OF NOT NULL & UNIQUE
=> IT DOES NOT ALLOWS DUPLICATES AND NULLS

PRIMARY KEY = UNIQUE + NOT NULL

=> IN RDBMS IN THE TABLES THERE MUST A COLUMN WHICH UNIQUELY IDENTIFY THE RECORDS AND
THAT COLUMN
MUST BE DECLARED WITH PRIMARY KEY

=> ONLY ONE PRIMARY KEY IS ALLOWED PER TABLE. IF WE WANT TWO PRIMARY KEYS I .E YOU
WANT THE FEATURES OF PRIMARY KEY IN MORE THAN
ONE COLUMN THEN THOSE COLUMNS CAN BE DECLARED WITH UNIQUE AND NOT NULL

CREATE TABLE EMP12(


EMPID INT PRIMARY KEY,
ENAME VARCHAR(20));

INSERT INTO EMP12 VALUES(100, 'A');--1 row affected


INSERT INTO EMP12 VALUES(101, 'A');--1 row affected
INSERT INTO EMP12 VALUES(101, 'B');--ERROR -Cannot insert duplicate key
INSERT INTO EMP12 VALUES(NULL, 'B');--ERROR -column does not allow nulls

CREATE TABLE CUST1(


CUSTID INT PRIMARY KEY,
CNAME VARCHAR(20) NOT NULL,
CADDR VARCHAR(30),
AADHAR BIGINT UNIQUE NOT NULL,
PANNO CHAR(10) UNIQUE NOT NULL);

INSERT INTO CUST1 VALUES(100, 'A','10A,NOIDA',456785256225,'BJJPS3214N'); -- 1 ROW


AFFECTED
INSERT INTO CUST1 VALUES(101, 'A','11A,NOIDA',456785256225,'AJJPS3214N');--ERROR
DUPLICATE VALUE IN AADHAR
INSERT INTO CUST1 VALUES(102, 'B','12A,NOIDA',NULL,'CJJPS3214N');--ERROR -Cannot
insert the value NULL into column 'AADHAR'
INSERT INTO CUST1 VALUES(103, 'C','12B,NOIDA',566785256225,'CJJPS3214N');--1 ROW
AFFECTED

4. CHECK
=> THE CHECK CONSTRAINT IS USED WHEN RULE IS BASED ON SOME CONDITION

SYN: CHECK(CONDITION)

EXAMPLE : ----SALARY SHOULD BE MINIMUM 3000

CREATE TABLE EMP13


(
EMPID INT,
ENAME VARCHAR(20),
SAL MONEY CHECK(SAL>=3000)
);

INSERT INTO EMP13 VALUES(100, 'A', 4000);--1 row affected


INSERT INTO EMP13 VALUES(101, 'B', 2500);-- ERROR The INSERT statement conflicted with
the CHECK constraint
INSERT INTO EMP13 VALUES(101, 'B', NULL);-- 1 ROW AFFECTED

=> PUT A CONSTRAIN IN GENDER COLUMN THAT GENDER CAN BE ONLY 'M' OR 'F'

CREATE TABLE CUST100(


CUSTID INT,
CNAME VARCHAR(20),
GENDER CHAR(1) CHECK(GENDER IN ('M','F'))
);

INSERT INTO CUST100 VALUES(100, 'A', 'M'); -- 1 ROW AFFECTED


INSERT INTO CUST100 VALUES(101, 'B', 'F');-- 1 ROW AFFECTED
INSERT INTO CUST100 VALUES(102, 'C', 'Z');--ERROR -The INSERT statement conflicted
with the CHECK constraint

=> AMOUNT SHOULD BE MULTIPLE OF 100

CREATE TABLE ACT11(


CUSTID INT,
CNAME VARCHAR(20),
AMOUNT MONEY CHECK(AMOUNT%100=0)
);

INSERT INTO ACT11 VALUES(100, 'A',500);--1 row affected


INSERT INTO ACT11 VALUES(101, 'B',1200);--1 row affected
INSERT INTO ACT11 VALUES(102, 'C',570); --ERROR The INSERT statement conflicted with
the CHECK constraint

=> PASSWORD MUST BE MINIMUM OF 8 CHARACTERS

PASSWORD VARCHAR(20) CHECK(LEN(PASSWORD)>=8);

=> EMAIL ID COLUMN MUST END WITH .COM OR .CO OR .IN


EMAIL VARCHAR(30) CHECK(EMAIL LIKE '%.COM'
OR
EMAIL LIKE '%.IN'
OR
EMAIL LIKE '%.CO'
)

======================================================================================
====================================
06-05-2022

FOREIGN KEY = > IT IS USED TO CREATE OR ESTABLISH THE RELATIOSNHIP BETWEEN TWO TABLES
=> TO ESTABLISH THE RELATIONSHIP B/W TWO TABLES TAKE PRIMARY KEY OF ONE
TABLE AND ADD IT TO ANOTHER TABLE AS FOREIGN KEY
AND DECLARE WITH REFERENCES CONSTRAINT

PRODUCT
PID(PK) PNAME WGHT
1 A 1KG
2 A 2KG
3 B 1KG
4 B 2KG

CUSTOMER
CID(PK) CNAME MOB ADD
1 PRAVEER 87XX 123
2 SHIVA 95XX 345
3 NAVI 79XX 456
4 PRAVEER 88XX 986

ORDER
OID(PK) DATE CID(FK) PID(FK) QTY
1 XX 1 2 5
2 XX 1 3 1
3 XX 3 4 2
4 XX 5 ----NOT ALLOWED
5 XX 1 7(NOT ALLOWED)
6 XX 1 2 5

=> VALUES ENTERED IN FOREIGN KEY COLUMN SHOULD MATCH WITH THE VALUES ENTERED IN
CORRESPONDING PRIMARY KEY COLUMN
=> FOREIGN ALLOWS DUPLICATES
=> FOREIGN ALLOWS NULLS
=> AFTER DECLARING THE FOREIGN KEY A RELATIONSHIP IS ESTABLISHED BETWEEN TWO TABLES
CALLED PARENT/CHILD RELATIONSHIP
=> PRIMARY KEY TABLE IS PARENT AND FOREIGN KEY TABLE IS CHILD

CREATE TABLE PROJECTS(


PROJID INT PRIMARY KEY,
PNAME VARCHAR(20) NOT NULL,
DURATION VARCHAR(20),
COST MONEY,
CLIENT VARCHAR(20));

INSERT INTO PROJECTS VALUES(100, 'A', '5 YEARS', 200, 'COGNIGENT');


INSERT INTO PROJECTS VALUES(101, 'B', '3 YEARS', 300, 'TATA');

INSERT INTO EMP_PROJECT VALUES(100, 'A',5000,100); -- 1 ROW AFFECTED


INSERT INTO EMP_PROJECT VALUES(101, 'B',7000,100); -- 1 ROW AFFECTED
INSERT INTO EMP_PROJECT VALUES(102, 'C',7500,900);--ERROR conflicted with the FOREIGN
KEY constraint
INSERT INTO EMP_PROJECT VALUES(103, 'D',3000,100);--ERROR conflicted with the CHECK
constraint
INSERT INTO EMP_PROJECT VALUES(103, 'D',6000,101);-- 1 ROW AFFECTED
INSERT INTO EMP_PROJECT VALUES(103, 'E',6000,101);--ERROR Violation of PRIMARY KEY
constraint
INSERT INTO EMP_PROJECT VALUES(104, 'F',8000,NULL);-- 1 ROW AFFECTED

=========================================================================
ACCOUNTS
ACNO ACTYPE BAL
1. ACNO SHOULD NOT BE DUPLICATE AND NULL
2. ACTYPE MUST BE 'S' OR 'C'
3. BAL SHOULD BE MINIMUM OF 1000

TRANSACTIONS
TRID TTYPE TDATE TAMT ACCNO
1. TRID SHOULD BE AUTOMATICALLY GENERATED
2. TTYPE SHOULD BE 'W' OR 'D'
3. TAMT MUST BE MULTIPLE OF 500
4. ACCNO SHOULD MATCH WITH ACCNO AVAILABLE IN ACCOUNTS TABLE
========================================================================

DEFAULT
--------

A COLUMN CAN BE DECLARED WITH DEFAULT VALUE

HIREDATE DATE DEFAULT GETDATE()

=> WHILE INSTERTING THE DATA IF WE SKIP HIREDATE THEN SQL SERVER WILL INSERT DEFAULT
VALUE

CREATE TABLE EMP99(


EMPNO INT,
ENAME VARCHAR(20),
HIREDATE DATE DEFAULT GETDATE());

INSERT INTO EMP99 VALUES(100, 'A','2022-03-15');


INSERT INTO EMP99(EMPNO,ENAME) VALUES(101, 'B'); -- TAKES DEFAULT VALUE
INSERT INTO EMP99 VALUES(102, 'C',NULL);

EMPNO ENAME HIREDATE


100 A 2022-03-15
101 B 2022-05-06
102 C NULL

======================================================================================
=====
TABLE LEVEL CONSTRAINT--

=> IF CONSTRAINTS ARE DECLARED AFTER DECLARING ALL THE COLUMNS THEN IT IS CALLED TABLE
LEVEL CONSTRAINTS
=> WE USE TABLE LEVEL CONSTRAINTS FOR MULTIPLE COMBINATION OF COLUMNS

CREATE TABLE TABLENAME(


COL1 DATATYPE(SIZE),

-------------------------------------
CONSTRAINT)

PRODUCT
PRODID PNAME MFD_DATE EXP_DATE
100 ABC 2022-01-01 2021-10-01 ---- INVALID

RULE ---> EXP_DATE > MFD_DATE

CREATE TABLE PRODUCTTABLE(


prodid int,
pname varchar(10),
mfd_date date,
exp_date date,
check(exp_date>mfd_date)
);

INSERT INTO PRODUCTTABLE VALUES(100, 'A', GETDATE(), '2021-10-01'); --ERROR


INSERT INTO PRODUCTTABLE VALUES(100, 'A', GETDATE(), '2022-10-01'); -- 1 ROW AFFECTED
INSERT INTO PRODUCTTABLE VALUES(101, 'B', '2021-05-11', '2022-10-01');-- 1 ROW
AFFECTED

prodid pname mfd_dateexp_date


100 A 2022-05-06 2022-10-01
101 B 2021-05-11 2022-10-01

======================================================================================
====================
09-05-2022

NOT NULL, PRIMARY KEY, CHECK, FOREIGN KEY, UNIQUE ----->> OUT OF THESE WHICH
CONSTRAINT CAN NOT BE DECLARED AT TABLE LEVEL
-----> NOT NULL CONTRAINTS CAN NOT
BE DECLARED AT TABLE LEVEL
DECLARING UNIQUE AT TABLE LEVEL
==========================
CREATE TABLE EMP100( ID INT,
ENAME VARCHAR(20),
MOB BIGINT,
EMAIL VARCHAR(20),
UNIQUE(MOB, EMAIL));

INSERT INTO EMP100 VALUES(100, 'A', 8745,'[email protected]');--1 row affected


INSERT INTO EMP100 VALUES(101, 'B', 8745,'[email protected]');--1 row affected
INSERT INTO EMP100 VALUES(102, 'B', 8754,'[email protected]');--1 row affected
INSERT INTO EMP100 VALUES(103, 'C', 8745,'[email protected]');--ERROR -Cannot insert
duplicat
=============================================
COMPOSITE PRIMARY KEY
=> IN SOME TABLES WE MAY NOT UNQUELY IDENTIFY THE RECORDS BY SINGLE COLUMN
=> AND WE NEED COMBINATION OF COLUMNS TO UNIQUELY IDENTIFY THE RECORDS
=> IF COMBINATION OF THE COLUMNS ARE NEEDED TO UNIQUELY IDENTIFY THE RECORDS THEN
DECLARE THAT COMBINATION AS PRIMARY KEY AT
TABLE LEVEL

=> IF PRIMARY KEY IS DECLARED FOR COMBINATION OF COLUMNS THEN IT IS CALLED COMPOSITE
PRIMARY KEY

=> IN COMPOSITE KEY THE RULES SHOULD BE SATISFIED AT COMBINATION OF COLUMNS USED IN
PRIMARY KEY

ORDERS PRODUCTS

ORDERID ORDDT DELDT PRODID PNAME PRICE

1000 2022-05-09 2022-05-12 100 A 1000


1001 2022-05-09 2022-05-12
1002 2022-05-10 2022-05-13 101 B
2000
1003 2022-05-10 2022-05-13

ORDER DETAILS
ORDERID PRODID QTY
1000 100 1
1000 101 2
1001 100 2
1001 101 1

CREATE TABLE ORDERS(


ORDERID INT PRIMARY KEY,
ORDDT DATE,
DELDT DATE,
CHECK(DELDT>=ORDDT));

CREATE TABLE PRODUCTS100(


PRODID INT PRIMARY KEY,
PNAME VARCHAR(10),
PRICE SMALLMONEY);

INSERT INTO PRODUCTS100 VALUES(100, 'A',1000);


INSERT INTO PRODUCTS100 VALUES(101, 'B',2000);

CREATE TABLE ORDER_DETAILS(


ORDERID INT REFERENCES ORDERS(ORDERID),
PRODID INT REFERENCES PRODUCTS100(PRODID),
QTY INT,
PRIMARY KEY(ORDERID, PRODID)); ---TO UNIQUE IDENTIFY THE RECORDS OF THIS TABLE
PRIMARY KEY IS DECLARED AS COMBINATION OF COLUMNS

INSERT INTO ORDER_DETAILS VALUES(1000,100,1);


INSERT INTO ORDER_DETAILS VALUES(1000,101,2);
INSERT INTO ORDER_DETAILS VALUES(1001,100,2);
INSERT INTO ORDER_DETAILS VALUES(1000,100,3);--ERROR COMBINATION OF 1000, 100 IS
REPEATING
======================================================================================
=======================
COMPOSITE FOREIGN KEY
IF COMBINATION OF COLUMNS ARE DECLARED AS FK THEN IT IS CALLED COMPOSITE FOREIGN KEY
---> IT REFERENCES COMPOSITE PRIMARY KEY
----> IT WILL BE DECLARED AT TABLE LEVEL

REGISTRATION
SID CID DOR FEE
1 10 X X
1 11 X X
2 10 X X
2 11 X X
3 12 X X

CREATE TABLE REGISTRATION(


SID INT ,
CID INT,
DOR DATE,
FEE MONEY,
PRIMARY KEY(SID, CID));

IN REGISTRATION TABLE WE WILL CREATE PRIMARY KEY ON SID AND CID COMBINATION TO
UNIQUELY IDENTIFY THE RECORDS

CERTIFICATE

CEID DOI SID CID


1001 X 1 10
1002 X 1 11
1003 X 2 10
1004 X 2 11
1005 X 2 12 ----NOT ALLOWED

CREATE TABLE CERTIFICATE(


CEID INT PRIMARY KEY,
DOIT DATE,
SID INT,
CID INT,
FOREIGN KEY(SID, CID) REFERENCES REGISTRATION(SID,CID));--COMPOSITE
FOREIGN KEY

============================================================
NAMING THE CONSTRAINTS

CREATE TABLE CONSTRAINT_NAME(


ID INT CONSTRAINT PK_ID PRIMARY KEY,
SAL MONEY CONSTRAINT CHK_SAL CHECK(SAL>3000));

CREATE TABLE SAMPLE1(


ID INT,
ENAME VARCHAR(20),
SAL MONEY,
CONSTRAINT PK_COMB PRIMARY KEY(ID,ENAME));

==================================================================================
10-05-2022

ADDING CONSTRAINTS TO EXISTING TABLE


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

=> "ALTER" COMMAND IS USED TO ADD CONSTRAINTS TO EXISTING TABLE

CREATE TABLE EMP501 (


EMPNO INT,
ENAME VARCHAR(20),
SAL MONEY,
DNO INT);

INSERT INTO EMP501 VALUES(100, 'A', 4000, 10), (101, 'B', 2500, 10),
(102, 'C', 5000, 20), (103, 'D', 6000,20);

=======================================
ADD CHECK CONSTRAINT

=> ADD CHECK CONSTRAINT TO EMP501 WITH CONDITION SAL>=3000

ALTER TABLE EMP501


ADD CONSTRAINT CH_SAL CHECK(SAL>=3000);=> NAME OF CONSTRAINT IS CH_SAL

ALTER TABLE EMP501


ADD CHECK(SAL>=3000); ===> A NAME TO THE CONSTRAINT WILL BE DEFINED BY SQL SERVER

==> WE GOT ERROR BECAUSE IN ONE OF ROWS SAL < 3000


==> IT GOT DETECTED WHILE VALIDATING THE DATA

=> THE ABOVE COMMAND FAILS BECAUSE IN EMP501 TABLE SOME OF THE SALARIES ARE LESS
THAN 3000. SO WHILE ADDING CONSTRAINT THE SQL SERVER ALSO VALIDATES EXISTING DATA

WITH NOCHECK
============

=> IF CONSTRAINT IS ADDED WITH "WITH NOCHECK" THEN SQL SERVER DOES NOT VALIDATE
EXISTING
DATA..IT VALIDATES ONLY NEW DATA

ALTER TABLE EMP501


WITH NOCHECK ADD CHECK(SAL>=3000);
=> THIS TIME IT WONT GIVE ERROR
=> AND WILL VALIDATE ONLY NEW DATA

==============================================
ADDING UNIQUE
============

=> ADD UNIQUE TO ENAME COLUMN

ALTER TABLE EMP501


ADD UNIQUE(ENAME);

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

CHANGING FROM NULL TO NOT NULL


=> MODIFY THE COLUMN ENAME TO NOT NULL

ALTER TABLE EMP501


ALTER COLUMN ENAME VARCHAR(20) NOT NULL;

========================================
ADDING PRIMARY KEY

=> PRIMARY KEY CAN NOT BE ADDED TO A NULLABLE COLUMN


TO ADD A PRIMARY KEY

1. CHANGE THE COLUMN TO NOT NULL


2. ADD PRIMARY KEY

--STEP1 CHANGE EMPNO TO NOT NULL


ALTER TABLE EMP501
ALTER COLUMN EMPNO INT NOT NULL;

--STEP2 ADD PRIMARY KEY


ALTER TABLE EMP501
ADD PRIMARY KEY(EMPNO);
============================================================

ADD FOREIGN KEY

=> ADD FK TO COLUMN DNO THAT REFERS DEPTT TABLE PRIMARY KEY
ALTER TABLE EMP501
ADD FOREIGN KEY(DNO) REFERENCES DEPTT(DNO)
============================================================

DEPT
DEPTNO(PK) STOREID(UNIQUE+NOTNULL) DEPTNAME STORENAME
10 101 IT CONS
20 102 MKT GOODS
30 103 HR STATION
40 104 FIN LEASURE

EMP
EMPID ENAME DEPTNO(FK)

DISTRIBUTORS
DISTID DISTNAME STOREID(FK)

=====================================================
DROPING CONSTRAINTS

ALTER TABLE TABLENAME


DROP CONSTRAINT CONSTRAINTNAME

DROP SALARY CONSTRAINT FROM EMP501 TABLE


=======================================
ALTER TABLE EMP501
DROP CONSTRAINT CK__EMP501__SAL__681373AD; --SUCCESFULL
ALTER TABLE DEPTT
DROP CONSTRAINT UQ__DEPTT__E0EB08D6AAE19DCA --ERROR
The constraint 'UQ__DEPTT__E0EB08D6AAE19DCA' is being referenced by table 'STAFF',
foreign key constraint 'FK__STAFF__DEPTNO__6EC0713C'.
Msg 3727, Level 16, State 0, Line 3

CREATE TABLE DEPT11(DEPTNO INT PRIMARY KEY,


DEPTNAME VARCHAR(20));

INSERT INTO DEPT11 VALUES(10, 'IT'),(11,'HR'),(12,'MKT');

SELECT * FROM DEPT11

CREATE TABLE STAFF11( EID INT, ENAME VARCHAR(20), DEPTNO INT REFERENCES
DEPT11(DEPTNO));

SELECT * FROM STAFF11


INSERT INTO STAFF11 VALUES(10, 'A',10), (11,'B',10),(12,'C',11),(13,'D',11);

SP_HELP DEPT11

ALTER TABLE DEPT11


DROP CONSTRAINT PK__DEPT11__E0EB08D7542F6978
/*
The constraint 'PK__DEPT11__E0EB08D7542F6978' is being referenced by table 'STAFF11',
foreign key constraint 'FK__STAFF11__DEPTNO__74794A92'.
Msg 3727, Level 16, State 0, Line 15
Could not drop constraint. See previous errors./*

DROP TABLE DEPT11;


--Could not drop object 'DEPT11' because it is referenced by a FOREIGN KEY constraint.

TRUNCATE TABLE DEPT11;


--Cannot truncate table 'DEPT11' because it is being referenced by a FOREIGN KEY
constraint.

NOTE==>

1. PK CONSTRAINT CAN NOT BE DROPPED IF REFERENCED BY SOME FOREIGN KEY


2. PK TABLE CAN NOT BE DROPPED IF REFERENCED BY SOME FOREIGN KEY
3. PK TABLE CAN NOT BE TRUNCATED IF REFERENCED BY SOME FOREIGN KEY
====================================================================
11-05-2022
DELETE RULES
=> DELETE RULES SPECIFIES HOW CHILD ROWS ARE AFFECTED IF PARENT ROW IS DELETED
=> WE DECLARE THE DELETE RULES WITH FOREIGN KEY

1. ON DELETE NO ACTION (Default)


2. ON DELETE CASCADE
3. ON DELETE SET NULL
4. ON DELETE SET DEFAULT

1. ON DELETE NO ACTION:
=======================
=> PARENT ROW CAN NOT BE DELETED IF ASSOCIATED WITH CHILD ROWS

CREATE TABLE DEPT79


( DNO INT PRIMARY KEY,
DNAME VARCHAR(10));

INSERT INTO DEPT79 VALUES(10,'HR'),(20,'IT');

CREATE TABLE EMP79


( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT REFERENCES DEPT79(DNO));

INSERT INTO EMP79 VALUES(100,'A',10),(101,'B',10);

DELETE FROM DEPT79 WHERE DNO = 10;--ERROR

DELETE FROM DEPT79 WHERE DNO = 20;--ALLOWED AS IT IS NOT REFERENCED BY CHILD ROW

SCENARIO

ACCOUNTS
ACCNO ACTYPE BAL
100 S 10000
101 C 20000

LOANS
ID TYPE AMT ACCNO
1 H 10L 100
2 C 5L 100

=>CLOSING ACCOUNT IS NOT POSSIBLE IF ASSOCIATED WITH LOANS

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

2. ON DELETE CASCADE
====================

=> IF PARENT ROW IS DELETED THEN CHILD ROW IS ALSO DELETED

CREATE TABLE EMP80


( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT REFERENCES DEPT79(DNO) ON DELETE CASCADE);

INSERT INTO EMP80 VALUES(100, 'A',10),(101,'B',10),(102,'C',20);

DELETE FROM DEPT79 WHERE DNO = 10;--ALLOWED


SELECT * FROM DEPT79;

DNO DNAME
20 IT

SELECT * FROM EMP80;


EMPNO ENAME DNO
102 C 20

IF THERE ARE TWO TABLES ONE IS ACCOUNTS AND OTHER IS TRANSACTIONS TABLE
THEN AT THE CLOSING TIME OF ACCOUNT CORRESPONDING TRANSACTIONS SHOULD ALSO BE DELETED
==================================================================

3 ON DELETE SET NULL


====================
=> IF PARENT ROW IS DELETED THEN CHILD ROW ARE NOT DELETED BUT FOREIGN KEY WILL BE SET
TO
NULL

CREATE TABLE DEPT80


( DNO INT PRIMARY KEY,
DNAME VARCHAR(10));

INSERT INTO DEPT80 VALUES(10,'HR'),(20,'IT');

CREATE TABLE EMP82


( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT REFERENCES DEPT80(DNO) ON DELETE SET NULL);

INSERT INTO EMP82 VALUES(100, 'A',10),(101,'B',10),(102,'C',20);

DELETE FROM DEPT80 WHERE DNO=10; ---DONE

SELECT * FROM EMP82;

EMPNO ENAME DNO


100 A NULL
101 B NULL
102 C 20
=============================================================================
4. ON DELETE SET DEFAULT
========================

=> IF PARENT ROW IS DELETED THEN CHILD ROWS ARE NOT DELETED BUT FK WILL BE SET
TO DEFAULT VALUE
=> WHILE CHOSING THE DEFAULT VALUE ENSURE THAT REFERENCIAL INTEGRITY IS NOT VIOLATED

CREATE TABLE DEPT83


( DNO INT PRIMARY KEY,
DNAME VARCHAR(10));

INSERT INTO DEPT83 VALUES(10,'HR'),(20,'IT');

CREATE TABLE EMP83


( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT DEFAULT 20 REFERENCES DEPT83(DNO) ON DELETE SET DEFAULT);

INSERT INTO EMP83 VALUES(100, 'A',10),(101,'B',10),(102,'C',20);

DELETE FROM DEPT83 WHERE DNO= 10;


SELECT * FROM EMP83;

EMPNO ENAME DNO


100 A 20
101 B 20
102 C 20
===============================================================================
UPDATE RULES
1. ON UPDATE NO ACTION (Default)
2. ON UPDATE CASCADE
3. ON UPDATE SET NULL
4. ON UPDATE SET DEFAULT

CREATE TABLE DEPT84


( DNO INT PRIMARY KEY,
DNAME VARCHAR(10));

INSERT INTO DEPT84 VALUES(10,'HR'),(20,'IT');

CREATE TABLE EMP84


( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT REFERENCES DEPT84(DNO));

INSERT INTO EMP84 VALUES(100, 'A',10),(101,'B',10),(102,'C',20);

UPDATE DEPT84
SET DNO = 30 WHERE DNO = 10; ---error
CREATE TABLE EMP85
( EMPNO INT PRIMARY KEY,
ENAME VARCHAR(20),
DNO INT REFERENCES DEPT84(DNO) ON DELETE SET NULL ON UPDATE CASCADE);

INSERT INTO EMP85 VALUES(100, 'A',10),(101,'B',10),(102,'C',20);

UPDATE DEPT84
SET DNO = 30 WHERE DNO = 10;

SELECT * FROM DEPT84;

DNO DNAME
20 IT
30 HR

SELECT * FROM EMP85;


100 A 30
101 B 30
102 C 20
==============================================================
12-05-2022
JOINS
=> JOIN IS AN OPERATION PERFORMED TO FETCH THE DATA FROM TWO OR MORE TABLES
=> TO FETCH THE DATA BETWEEN TWO TABLES WE NEED TO JOIN THE TABLES
=> IN DB, TABLES ARE NORMALIZED .I. E RALTED DATA IS STORED IN MULTIPLE TABLES.
=> TO COMBINE THE DATA STORED IN MULTIPLE TABLES WE NEED TO PERFORM JOIN ON THESE
TABLES

Products
PID PNAME VID
1 LUX 1
2 REXONA 1
3 DOVE 1
4 HAMAM 1
5 BOURNVITA 2
6 HORLICKS2
7 COMPLAN 2
8 CLASSMATE 3
9 NATRAJ 3
10 MATECLASS 3

VENDORS
VID VENNAME VENLOC VENMOB
1 RAM AGRA 8745
2 SHYAM MUMBAI 9845
3 DAVID DELHI 7455
4 RAM AGRA 7499

TYPES OF JOINS
1. INNER JOIN/EQUI JOIN
2. OUTER JOINS
1. LEFT OUTER JOIN
2. FULL OUTER JOIN
3. RIGHT OUTER JOIN
3.NON EQUI JOIN
4. CROSS JOIN
5. SELF JOIN

1. INNER JOIN
==============

WHEN WE WANT ONLY THE MATCHING RECORDS FROM JOINING TABLES THEN WE GO FOR INNER JOIN
TO PERFORM THE INNER JOIN BTW TWO TABLES THERE MUST BE A MATCHING FIELD
AND NAME IS NOT MANDATORY TO BE SAME.. PK - FK IS ALSO NOT MANDATORY

=> INNER JOIN IS FORMED BASED ON MATCHING FIELD WITH SAME DATA TYPE

ANSI /SQL 89
ANSI/ SQL 92 (Recommended)

ANSI/SQL 92

SELECT C1,C2.....FROM TABLE1 INNER JOIN TABLE2 ON JOIN-CONDITION

JOIN CONDITION
==============
BASED ON GIVEN JOIN CONDITION SQL SERVER JOINS THE RECORDS OF TWO TABLES
JOIN CONDITION DECIDES WHICH RECORD OF 1ST TABLE IS JOINED WITH WHICH RECORD OF 2ND
TABLE

TABLE1.MATCHINGFIELD = TABLE.MATCHINGFIELD

CREATE TABLE VENDORS ( VID INT PRIMARY KEY,


VNAME VARCHAR(20),
VLOC VARCHAR(20),
VMOB BIGINT);
INSERT INTO VENDORS VALUES(1,'RAM','AGRA', 8745),
(2,'SHYAM','MUMBAI',8785),
(3, 'DAVID','DELHI',9874);

CREATE TABLE PRODUCTSV ( PID INT PRIMARY KEY,


PNAME VARCHAR(20),
VID INT);
INSERT INTO PRODUCTSV VALUES(1,'LUX',1),(2,'REXONA',1),(3,'DOVE',1),
(4,'BOURNVITA',2),(5,'HORLICKS',2),(6,'COMPLAN',2),
(7,
'CLASSMATE',3),(8,'NATRAJ',3);

=> CREATE A REPORT AND DISPLAY

PID PNAME VENDORSNAME VENDORS LOC

SELECT PID, PNAME, VNAME, VLOC FROM PRODUCTSV INNER JOIN VENDORS
ON PRODUCTSV.VID = VENDORS.VID;

PID PNAME VNAME VLOC


1 LUX RAM AGRA
2 REXONA RAM AGRA
3 DOVE RAM AGRA
4 BOURNVITA SHYAM MUMBAI
5 HORLICKSSHYAM MUMBAI
6 COMPLAN SHYAM MUMBAI
7 CLASSMATE DAVID DELHI
8 NATRAJ DAVID DELHI

SELECT PID, PNAME, VNAME, VLOC,VID FROM PRODUCTSV INNER JOIN VENDORS
ON PRODUCTSV.VID = VENDORS.VID;
ERROR - Ambiguous column name 'VID'.

SELECT PID, PNAME, VNAME, VLOC,PRODUCTSV.VID FROM PRODUCTSV INNER JOIN VENDORS
ON PRODUCTSV.VID = VENDORS.VID; ---NO ERROR

SELECT P.PID, P.PNAME, V.VNAME, V.VLOC,P.VID FROM PRODUCTSV AS P INNER JOIN VENDORS
AS V
ON P.VID = V.VID;-- IMPROVED PERFORMANCE

=> IN JOINING THE QUERIES DECLARE TABLE ALIAS AND PREFIX COLUMN NAMES WITH TABLE
ALIAS FOR TWO REASONS:
1. TO REMOVE AMBIGUITY
2. FOR FASTER EXECUTION

ANSI /SQL 89

SELECT PID , PNAME , VNAME, VLOC FROM PRODUCTSV,VENDORS WHERE PRODUCTSV.VID =


VENDORS.VID;

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

JOIN MORE THAN 2 TABLES

SELECT COLUMNS
FROM TABLE1 INNER JOIN TABLE2
ON JOIN CONDITION
INNER JOIN TABLE3
ON JOIN CONDITION
INNER JOIN TABLE4
ON JOIN CONDITION

CREATE TABLE ORDERSV( OID INT PRIMARY KEY,


PID INT,
QTY INT);

INSERT INTO ORDERSV VALUES(1, 1,10),


(2, 1,5),
(3, 2,10),
(4, 5,1),
(5,6,2);
ANSI 92---
SELECT O.OID, O.PID,P.PNAME,O.QTY,V.VNAME,V.VID FROM
ORDERSV AS O INNER JOIN PRODUCTSV AS P
ON O.PID = P.PID
INNER JOIN VENDORS AS V
ON P.VID = V.VID;

OID PID PNAME QTY VNAME VID


1 1 LUX 10 RAM 1
2 1 LUX 5 RAM 1
3 2 REXONA 10 RAM 1
4 5 HORLICKS1 SHYAM 2
5 6 COMPLAN 2 SHYAM 2

ANSI 89--
SELECT O.OID, O.PID,P.PNAME,O.QTY,V.VNAME,V.VID FROM ORDERSV AS O, PRODUCTSV AS P,
VENDORS AS V
WHERE O.PID = P.PID
AND P.VID = V.VID;
====================================================================
13-05-2022

INNER JOIN --- TO GET MATCHING RECORDS FROM BOTH THE TABLES

TABLE 1 AS T1 INNER JOIN TABLE 2 AS T2 ON T1.T2ID = T2.T2ID

ACTUAL PROCESS OF INNER JOIN ===> CROSS JOIN + FILTERING AS PER JOIN CONDITION

TABLE 1 TABLE2
TID TANME T2ID T2ID TNAME
1 A 1 1 AX
2 B 1 2 BX
3 C 2 3 CX
4 D 2 4 DX

CROSS JOIN
TID TANME T2ID T2ID TNAME
1 A 1 1 AX
1 A 1 2 BX
1 A 1 3 CX
1 A 1 4 DX
2 B 1 1 AX
2 B 1 2 BX
2 B 1 3 CX
2 B 1 4 DX
3 C 2 1 AX
3 C 2 2 BX
3 C 2 3 CX
3 C 2 4 DX
4 D 2 1 AX
4 D 2 2 BX
4 D 2 3 CX
4 D 2 4 DX

FROM TABLE1 AS T1 INNER JOIN TABLE2 AS T2 ON T1.T2ID = T2.T2ID

INNER JOIN
TID TANME T2ID T2ID TNAME
1 A 1 1 AX
2 B 1 1 AX
3 C 2 2 BX
4 D 2 2 BX

SHOW ME THE LIST OF PRODUCTS SOLD AND ALSO THEIR QUANTITY SOLD

SELECT P.PID,P.PNAME,O.QTY FROM PRODUCTSV AS P INNER JOIN ORDERSV AS O


ON P.PID=O.PID;

PID PNAME QTY


1 LUX 10
1 LUX 5
2 REXONA 10
5 HORLICKS1
6 COMPLAN 2

=> IN THE ABOVE RESULT SET I WANT TO SEE EACH PRODUCT ONLY ONCE AND THEIR TOTAL QTY

SELECT P.PID,P.PNAME,SUM(O.QTY) AS QTY FROM PRODUCTSV AS P INNER JOIN ORDERSV AS O


ON P.PID=O.PID GROUP BY P.PID, P.PNAME;

PID PNAME QTY


1 LUX 15
2 REXONA 10
5 HORLICKS1
6 COMPLAN 2

=> DISPLAY THE PID, PNAME AND TOTAL QTY SOLD OF ONLY THOSE PRODUCTS WHICH HAVE MINIMUM
QTY SOLD OF 10.

SELECT P.PID,P.PNAME,SUM(O.QTY) AS QTY FROM PRODUCTSV AS P INNER JOIN ORDERSV AS O


ON P.PID=O.PID GROUP BY P.PID, P.PNAME HAVING
SUM(O.QTY)>=10; ;

PID PNAME QTY


1 LUX 15
2 REXONA 10
CROSS JOIN
---------
CROSS JOIN OR CARTESIAN JOIN RETURNS CROSS PRODUCT OF TWO TABLES.
=> IF CROSS JOIN IS PERFROMED BETWEEN TWO TABLES THEN EACH RECORD OF FIRST TABLE
IS JOINED WITH EACH AND EVERT RECORD OF SECOND TABLE.

TABLE 1 TABLE2
TID TANME T2ID T2ID TNAME
1 A 1 1 AX
2 B 1 2 BX
3 C 2 3 CX
4 D 2 4 DX

CROSS JOIN
TID TANME T2ID T2ID TNAME
1 A 1 1 AX
1 A 1 2 BX
1 A 1 3 CX
1 A 1 4 DX
2 B 1 1 AX
2 B 1 2 BX
2 B 1 3 CX
2 B 1 4 DX
3 C 2 1 AX
3 C 2 2 BX
3 C 2 3 CX
3 C 2 4 DX
4 D 2 1 AX
4 D 2 2 BX
4 D 2 3 CX
4 D 2 4 DX

SYNTAX : SELECT P.PNAME,V.VNAME,V.VLOC FROM PRODUCTSV AS P CROSS JOIN VENDORS AS V;

=>IMPLEMENTATION OF INNER JOIN BY CROSS JOIN ---->


SELECT P.PID,P.PNAME,O.QTY FROM PRODUCTSV AS P CROSS JOIN ORDERSV AS O
WHERE P.PID = O.PID;

DRINKS -- TEA , COFFEE, COLDRINK, COLD COFFEE, MANGO SHAKE


MEALS ---- MUFFIN, FRITTERS, SANDWITCHES, BURGERS
COMBO MEALS--TEA+MUFFIN. TEA+FRITTERS, .........CROSS JOIN

OUTER JOIN:
=---------
=> INNER JOIN GIVES ONLY MATCHING RECORDS BUT CAN NOT RETURN UNMATCHED RECORDS
=> TO GET UNMATCHED RECORDS AS WELL WE NEED OUTER JOIN
=> OUTER JOIN IS OF 3 TYPES
1. LEFT OUTER JOIN
2. RIGHT OUTER JOIN
3. FULL OUTER JOIN

1. LEFT OUTER JOIN/LEFT JOIN


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

=>LEFT JOIN WILL GIVE MATCHING RECORDS FROM BOTH THE TABLE PLUS NON MATCHING RECORDS
FROM LEFT TABLE
=> RETURNS ALL ROWS(MATCHING + NON MATCHING ) FROM LEFT TABLE AND MATCHING ROWS FROM
RIGHT TABLE

CROSS JOIN + FILTERING ON JOIN CONDITION + ADD NONMATCHING RECORDS OF LEFT TABLE

=> DISPLAY THE PID, PNAME ALONG WITH THE QTY SOLD...YOU HAVE TO SHOW EVEN UNSOLD
PRODUCTS
SELECT P.PID,P.PNAME,O.QTY,O.OID FROM PRODUCTSV AS P LEFT OUTER JOIN ORDERSV AS O
ON P.PID = O.PID;

PID PNAME QTY OID


1 LUX 10 1
1 LUX 5 2
2 REXONA 10 3
3 DOVE NULL NULL
4 BOURNVITA NULL NULL
5 HORLICKS1 4
6 COMPLAN 2 5
7 CLASSMATE NULL NULL
8 NATRAJ NULL NULL

=> DISPLAY ME THE PID AND PNAME OF UNSOLD PRODUCTS ONLY


SELECT P.PID,P.PNAME,O.QTY,O.OID FROM PRODUCTSV AS P LEFT OUTER JOIN ORDERSV AS O
ON P.PID = O.PID WHERE O.OID IS NULL;

PID PNAME QTY OID


3 DOVE NULL NULL
4 BOURNVITA NULL NULL
7 CLASSMATE NULL NULL
8 NATRAJ NULL NULL
==================================================================
16-05-2022
RIGHT OUTER JOIN

=> IN THIS CASE RIGHT TABLE WILL BE PRESERVED

=>=>RIGHT JOIN WILL GIVE MATCHING RECORDS FROM BOTH THE TABLE PLUS NON MATCHING
RECORDS
FROM RIGHT TABLE
=> RETURNS ALL ROWS(MATCHING + NON MATCHING ) FROM RIGHT TABLE AND MATCHING ROWS FROM
LEFT TABLE

CROSS JOIN + FILTERING BASED ON JOIN CONDITION + ADD NON MATCHING ROWS OF RIGHT TABLE

-- DISPLAY ME THE PRODUCTS ALONG WITH THIER QTY SOLD INCLUDING THE PRODUCTS UNSOLD

SELECT P.PID,P.PNAME,SUM(O.QTY) FROM ORDERSV AS O RIGHT OUTER JOIN PRODUCTSV AS P


ON O.PID=P.PID GROUP BY P.PID, P.PNAME;

PID PNAME (No column name)


1 LUX 15
2 REXONA 10
3 DOVE NULL
4 BOURNVITA NULL
5 HORLICKS1
6 COMPLAN 2
7 CLASSMATE NULL
8 NATRAJ NULL

--------------------------------
DISPLAY ONLY THE PRODUCTS UNSOLD

PID PNAME QTY


3 DOVE NULL
4 BOURNVITA NULL
7 CLASSMATE NULL
8 NATRAJ NULL

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

FULL OUTER JOIN


MATCHING RECORDS FROM BOTH TABLES + UNMATCHING RECORDS FROM BOTH TABLES

CROSS JOIN + FILTERING BASED ON JOIN CONDITION + UNMATCH RECORDS FROM BOTH

OID PID QTY PID PNAME VID


1 1 10 1 LUX 1
2 1 5 1 LUX 1
3 2 10 2 REXONA 1
4 5 1 5 HORLICKS2
5 6 2 6 COMPLAN 2
6 10 5 NULL NULL NULL
NULL NULL NULL 3 DOVE 1
NULL NULL NULL 4 BOURNVITA 2
NULL NULL NULL 7 CLASSMATE 3
NULL NULL NULL 8 NATRAJ 3

=> DISPLAY ONLY NON MATCHING RECORDS FROM BOTH THE TABLES
SELECT * FROM ORDERSV AS O FULL OUTER JOIN PRODUCTSV AS P ON O.PID = P.PID

WHERE O.OID IS NULL OR P.PID IS NULL;

OID PID QTY PID PNAME VID


6 10 5 NULL NULL NULL
NULL NULL NULL 3 DOVE 1
NULL NULL NULL 4 BOURNVITA 2
NULL NULL NULL 7 CLASSMATE 3
NULL NULL NULL 8 NATRAJ 3

===================================================
SELF JOIN

=> JOINING A TABLE WITH ITSELF IS KNOWN AS SELF JOIN


=> A RECORD IN ONE TABLE IS JOINED WITH OTHER RECORDS OF SAME TABLE

EMPNO ENAME MGR


7369 SMITH 7902
7499 ALLEN 7698
7521 WARD 7698
7566 JONES 7839
7654 MARTIN 7698
7698 BLAKE 7839
7839 KING NULL
7902 FORD 7566

=> THIS TABLE CONSTAINS MANAGER ID BUT WE NEED TO DISPLAY MANAGER NAME..FOR THE
SAME PURPOSE WE CAN USE SELF JOIN
=> TO PERFORM THE SELF JOIN, THE SAME TABLE MUST BE DECLARED TWO TIMES WITH DIFFERENT
ALIASES IN THE FROM CLAUSE

=> DISPLAY ENAME, MGRNAME

SELECT X.ENAME,Y.ENAME FROM emp AS X INNER JOIN emp as Y ON X.MGR = Y.EMPNO;

ENAME ENAME
SMITH FORD
ALLEN BLAKE
WARD BLAKE
JONES KING
MARTIN BLAKE
BLAKE KING
FORD JONES

SELECT X.ENAME,Y.ENAME FROM emp AS X LEFT JOIN emp as Y ON X.MGR = Y.EMPNO;


ENAME ENAME
SMITH FORD
ALLEN BLAKE
WARD BLAKE
JONES KING
MARTIN BLAKE
BLAKE KING
KING NULL
FORD JONES

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

=> DISPLAY EMPLOYEE NAMES REPORTING TO BLAKE

EMPNO ENAME MGR


7369 SMITH 7902
7499 ALLEN 7698
7521 WARD 7698
7566 JONES 7839
7654 MARTIN 7698
7698 BLAKE 7839
7839 KING NULL
7902 FORD 7566

SELECT X.ENAME,Y.ENAME FROM emp AS X LEFT JOIN emp as Y ON X.MGR = Y.EMPNO


WHERE Y.ENAME = 'BLAKE';

SELECT X.ENAME,Y.ENAME FROM emp AS X INNER JOIN emp as Y ON X.MGR = Y.EMPNO


WHERE Y.ENAME = 'BLAKE';

ENAME ENAME
ALLEN BLAKE
WARD BLAKE
MARTIN BLAKE

=> DISPLAY BLACK'S MANAGER NAME


SELECT X.ENAME,Y.ENAME AS MGR FROM emp AS X INNER JOIN emp as Y
ON X.MGR = Y.EMPNO WHERE X.ENAME = 'BLAKE';
==========================================================
NON EQUI JOIN
=> IN NON EQUI JOIN THE JOIN CONDITION IS NOT BASED ON '=' OPERATOR
RATHER THAN NON EQUI JOIN USE >,>=,<,<=, BETWEEN OPERATORS

EMP SALGRADE
EMPNO ENAME ESAL GRADE LOSAL HISAL
1 A 5000 1 700 1000
2 B 2500 2 1001 2000
3 C 1000 3 2001 3000
4 D 3000 4 3001 4000
5 E 1500 5 4001 9999

=> DISPLAY
EMPNO ENAME ESAL GRADE
=========================================================
17-05-2022

CREATE TABLE EMPN(EMPNO INT, ENAME VARCHAR(10), ESAL MONEY);

INSERT INTO EMPN


VALUES(1,'A',5000),(2,'B',2500),(3,'C',1000),(4,'D',3000),(5,'E',1500);

CREATE TABLE SALGRADE(GRADE INT, LOSAL MONEY, HISAL MONEY);

INSERT INTO SALGRADE


VALUES(1,700,1000),(2,1001,2000),(3,2001,3000),(4,3001,4000),(5,4001,9999);

SELECT E.*,S.GRADE FROM EMPN AS E INNER JOIN SALGRADE AS S ON E.ESAL


BETWEEN S.LOSAL AND S.HISAL;

EMPNO ENAME ESAL GRADE


3 C 1000.00 1
5 E 1500.00 2
2 B 2500.00 3
4 D 3000.00 3
1 A 5000.00 5

=> ASSIGN A NEW COLUMN WITH ROW NUMBER TO EACH ROW IN EMPN TABLE

SELECT *,ROW_NUMBER() OVER(ORDER BY EMPNO) AS RN FROM EMPN;

SELECT E.EMPNO,E.ENAME,E.ESAL,COUNT(*) AS RN FROM EMPN AS E INNER JOIN EMPN AS P


ON E.EMPNO >= P.EMPNO GROUP BY E.EMPNO,E.ENAME,E.ESAL;

EMPNO ENAME ESAL RN


1 A 5000.00 1
2 B 2500.00 2
3 C 1000.00 3
4 D 3000.00 4
5 E 1500.00 5

=> WE NEED RUNNING TOTAL


= > USING WINDOWS FUNCTION ==> SELECT *, SUM(ESAL) OVER(ORDER BY EMPNO) AS RT FROM
EMPN;

EMPNO ENAME ESAL RT


1 A 5000.00 5000.00
2 B 2500.00 7500.00
3 C 1000.00 8500.00
4 D 3000.00 11500.00
5 E 1500.00 13000.00

USING JOINS => SELECT E.EMPNO,E.ENAME,E.ESAL, SUM(P.ESAL) AS RT


FROM EMPN AS E
INNER JOIN
EMPN AS P
ON E.EMPNO >= P.EMPNO
GROUP BY E.EMPNO,E.ENAME,E.ESAL
ORDER BY E.EMPNO,E.ENAME,E.ESAL;
============================================================
INNER JOIN
CROSS JOIN
LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN
LEFT ANTI
RIGHT ANTI
FULL ANTI
SELF JOIN
NON EQUIJOIN
=> TRY TO WRITE A QUERY WHICH INCLUDES BOTH LEFT JOIN AND INNER JOIN
3 TABLES ---1 JOIN WITH LEFT JOIN AND OTHER WITH INNER JOIN
===================================================================================
SET OPERATORS
1. UNION
2. UNION ALL
3.INTERSECT
4. EXCEPT
A = 1,2,3,4
B = 1,2,5,6

A UNION B ===> 1,2,3,4,5,6 ==> ALL ELEMENTS OF A AND B WITHOUT DUPLICATES


A UNION ALL B ====>1,2,3,4,1,2,5,6 ===> ALL ELEMENTS OF A AND B INCLUDING DUPLICATES
A INTERSECT B=====>1,2====> COMMOM ELEMENTS BETWEEN A AND B
A EXCEPT B ===> 3,4 ==> ELEMENTS OF A NOT PRESENT IN B
B EXCEPT A ===> 5,6 ==> ELEMENTS OF B NOT PRESENT IN A

DAYOFREG DAYOFEVENT DAYOFREG INTERSECT DAYOFEVENT


RAM SHYAM SHYAM
SHYAM SITA SITA
SITA RADHA RADHA
RADHA RAVI RAVI
DAVID AMIT AMIT
CHARLES ALEXA
RAVI SHAWN
AMIT

DAYOFEVENT EXCEPT DAYOFREG


ALEXA
SHAWN

DAYOFREG EXCEPT DAYOFEVENT


RAM
DAVID
CHARLES
=========================================================
18-05-2022

=> IN SQL SERVER THE SET OPERATIONS ARE PERFORMED BETWEEN SET OF ROWS RETURNED BY TWO
SELECT STATEMENTS.

SELECT STATEMENT1
UNION/UNION ALL/INTERSECT/EXCEPT
SELECT STATEMENT2

RULES: 1 . BOTH THE QUERIES SHOULD RETURN SAME NUMBER OF COLUMNS


2. CORRESPONDING COLUMN DATA TYPES MUST BE SAME

=>SELECT JOB FROM EMP1 WHERE DEPTNO = 10;

JOB
MANAGER
Manager
CLERK

=>SELECT JOB FROM EMP1 WHERE DEPTNO = 30;

JOB
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

UNION:
-------
=> IT COMBINES THE ROWS RETURNED BY TWO SELECT STATEMENTS
=> REMOVE DUPLICATES
=> SORT THE RESULT

SELECT JOB FROM EMP1 WHERE DEPTNO = 10


UNION
SELECT JOB FROM EMP1 WHERE DEPTNO = 30;

CLERK
MANAGER
SALESMAN

=> SELECT JOB FROM EMP1 WHERE DEPTNO = 10


UNION
SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 30;

ERROR= > All queries combined using a UNION, INTERSECT or EXCEPT operator
must have an equal number of expressions in their target lists.

=>SELECT SAL,JOB FROM EMP1 WHERE DEPTNO = 10


UNION
SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 30;

=> ERROR - Cannot convert a char value to money. The char value has incorrect syntax.
- CORRESPONDING DATA TYPES ARE NOT MATCHING

=>SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 10


UNION
SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 30;

JOB SAL
CLERK 950.00
CLERK 1300.00
MANAGER 2450.00
MANAGER 2850.00
Manager 4000.00
SALESMAN1250.00
SALESMAN1500.00
SALESMAN4000.00
=> DIFFERENTIATE BETWEEN UNION AND JOIN

UNION JOIN
COMBINES ROWS COMBINES COLUMNS
PERFORMED BW SIMILAR STRUCTURE SIMILAR STRUCTURE IS NOT
MANDATORY

=>SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 10


UNION
SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 30
UNION
SELECT JOB,SAL FROM EMP1 WHERE DEPTNO = 20;

UNION ALL
--------

=> COMBINES ROWS RETURNED BY TWO SELECT STATEMENTS


=> DUPLICATES ARE NOT REMOVED
=> RESULT IS NOT SORTED

SELECT JOB FROM EMP1 WHERE DEPTNO = 10


UNION ALL
SELECT JOB FROM EMP1 WHERE DEPTNO = 30;

JOB
MANAGER
Manager
CLERK
SALESMAN
SALESMAN
SALESMAN
MANAGER
SALESMAN
CLERK

=>SELECT DEPTNO,JOB FROM EMP1 WHERE DEPTNO = 10


UNION ALL
SELECT DEPTNO, JOB FROM EMP1 WHERE DEPTNO = 30;

DEPTNO JOB
10 MANAGER
10 Manager
10 CLERK
30 SALESMAN
30 SALESMAN
30 SALESMAN
30 MANAGER
30 SALESMAN
30 CLERK

=>SELECT * FROM EMP1 WHERE DEPTNO = 30


UNION ALL
SELECT * FROM EMP1 WHERE DEPTNO = 10;

NOTE==> UNION ALL LIKE APPEND OPERATION

=> INTERSECT
=============

=> RETURNS COMMON VALUES FROM THE OUTPUT OF TWO SELECT STATEMENTS

=> DISPLAY THE JOBS WHICH ARE COMMON IN DEPTNO 20 AND 30

SELECT JOB FROM EMP1 WHERE DEPTNO =20


INTERSECT
SELECT JOB FROM EMP1 WHERE DEPTNO = 30;

JOB
CLERK
MANAGER
=> DISPLAY EMPNO AND ENAME WHO ARE WORKING IN DEPTNO 10 AS WELL DEPTNO 20

SELECT EMPNO, ENAME FROM EMP1 WHERE DEPTNO =10


INTERSECT
SELECT EMPNO, ENAME FROM EMP1 WHERE DEPTNO =20;

=> EXCEPT
---------
RETURNS VALUES FROM THE 1ST QUERY OUTPUT WHICH ARE NOT PRESENT IN 2ND QUERY OUTPUT

=> DISPLAY THE JOBS IN DEPTNO 30 WHICH ARE NOT AVAILABLE IN DEPTNO 20
=> DISPLAY THE JOBS IN DEPTNO 30 WHICH ARE NOT COMMON TO DEPTNO 20

SELECT JOB FROM EMP1 WHERE DEPTNO = 30


EXCEPT
SELECT JOB FROM EMP1 WHERE DEPTNO = 20;

=> DISPLAY THE JOB WHICH IS ONLY AVAILABLE IN DEPTNO 30


SELECT JOB FROM EMP1 WHERE DEPTNO = 30
EXCEPT
SELECT JOB FROM EMP1 WHERE DEPTNO IN (10,20);

JOB
SALESMAN
==================================================================
SUBQUERIES OR NESTED QUERIES
=> A QUERY WITH IN ANOTHER QUERY IS KNOWN AS SUBQUERY OR NESTED QUERY
=> ONE QUERY IS KNOWN AS INNER QUERY/ CHILD/SUBQUERY
=> OTHER QUERY IS KNOWN AS OUTER QUERY/ PARENT QUERY

=> OUTERMOST QUERY WHOSE RESULT SET IS RETURNED TO THE CALLER IS KNOWN AS OUTER QUERY
=> THE INNER QUERY WHOSE RESULT SET IS USED BY OUTER QUERY IS KNOWN AS SUBQUERY

CUSTOMER TABLE
CID CNAME
1 A
2 B
3 C

ORDERS
OID CID PID QTYSOLD
1 2 2 5
2 1 1 10
3 1 2 15
4 3 4 2

=>SELECT TOP 1 C.CNAME FROM CUSTOMER10 AS C LEFT JOIN ORDERS10 AS O ON C.CID = O.CID
ORDER BY O.QTY DESC
======================================================================================
====================
19-05-2022

=> SUBQUERY IS A SELECT STATEMENT INSIDE ANOTHER SELECT , INSERT , UPDATE OR DELETE
STATEMENT.
=> OUTER QUERY CAN BE SELECT, INSERT, UPDATE , DELETE BUT INNER QUERY MUST ALWAYS BE
SELECT STATEMENT

KIND OF SUBQUERIES:

1. SELF CONTAINED SUBQUERIES--tHE SUBQUERY WHICH IS INDEPENDANT OF OUTER QUERY IS


KNOWN
AS SELF CONTAINED SUBQUERY
=> IN SUCH QUERY FIRST INNER QUERY IS EXECUTED AND ITS
RESULT IS
USED BY OUTER QUERY
SELECT * FROM EMP1 WHERE EMPNO = (SELECT EMPNO FROM EMP1 WHERE ENAME = 'NAVIN');
EASY TO DEBUG

=> SELECT * FROM EMP1 WHERE DEPNTO = (SELECT DEPTNO FROM EMP1 WHERE ENAME = 'BLAKE')
2. CORRELATED SUBQUERY --- IN THIS CASE INNER QUERY IS DEPENDANT OF OUTER QUERY
IT IS DIFFICULT TO DEBUG

SUBQUERIES ---- 1. SINGLE VALUED


2. MULTI VALUED
3. TABLE VALUED

SUBQUERIES ARE USED IN: WHERE, IN, FROM , SELECT

=> DISPLAY THE DETAILS OF EMPLOYEES EARNING MORE THEN AVERAGE SALARY OF ORGANIZATION
1. AVERAGE SALARY OF ORGANIZATION --SELECT AVG(SAL) FROM EMP1;
2. FILTER MY RESULT ON BASIS OF ABOVE RESULT -
SELECT * FROM EMP1 WHERE SAL > (SELECT AVG(SAL) FROM
EMP1);

SELECT * FROM EMP1 WHERE SAL > AVG(SAL); ---ERROR -- AGGREGATION NOT ALLOWED IN WHERE

==>--DISPLAY THE EMPLOYEE DETAILS EARNING MORE THEN BLAKE


-- GET THE SALARY OF BLAKE
-- FILTER THE EMP1 TABLE AS PER ABOVE RESULT

SELECT * FROM EMP1 WHERE SAL > (SELECT SAL FROM EMP1 WHERE ENAME ='BLAKE');
======================
-- DISPLAY THE EMPLOYEE DETAILS WHO ARE SENIOR TO KING
-- GET THE HIREDATE OF KING
-- FILTER EMP1 TABLE AS PER ABOVE RESULT

SELECT * FROM EMP1 WHERE HIREDATE < (SELECT HIREDATE FROM EMP1 WHERE ENAME = 'KING');

==============================
-- DISPLAY EMPLOYEE NAME AND SALARY EARNING MAXIMUM SALARY
-- OBTAIN MAXIMUM SALARY
--FILTER EMP1 TABLE AS PER ABOVE RESULT

SELECT ENAME,SAL FROM EMP1 WHERE SAL = (SELECT MAX(SAL) FROM EMP1);

==================================
- DISPLAY EMPLOYEE NAME AND HIREDATE HAVING MAXIMUM EXPERIENCE
-- OBTAIN MINIUM HIREDATE
--FILTER EMP1 TABLE AS PER ABOVE RESULT

SELECT ENAME,HIREDATE FROM EMP1 WHERE HIREDATE = (SELECT MIN(HIREDATE) FROM EMP1);

=====================================
MULTIVALUED SUBQUERIES

IF INNER QUERY RETURNS MULTIVALUES OR A LIST OF VALUES OR A COLUMN OF VALUES


IT IS KNOWN AS MULTIVALUED SUBQUERY

-- DISPLAY THE EMPLOYEE DETAILS WHOSE JOB IS SAME AS JOB OF BLAKE,ADAMS

SELECT * FROM EMP1 WHERE JOB IN (SELECT JOB FROM EMP1 WHERE ENAME IN
('BLAKE','ADAMS'));

OPERATORS WITH MULTIVALUED SUBQUERIES -- IN , NOT IN , SOME|ANY, ALL

ANY OPERATOR (COMPARISION WITH MULTIPLE VALUES)


============
FOR COMPARISION WE CAN USE =, >, >=, <, <=
WHERE X > ANY(SUBQUERY)
WHERE X > ANY(1000,2000, 3000)

X = 800 --X > ANY(1000,2000, 3000) --FALSE -- X>1000 OR X>2000 OR X>3000


X = 1500 --X > ANY(1000,2000, 3000) --- TRUE
X = 4500 --X > ANY(1000,2000, 3000)-----TRUE

WHERE X < ANY(SUBQUERY)


WHERE X < ANY(1000,2000, 3000)

X = 800 --X < ANY(1000,2000, 3000) -- TRUE


X = 1500 --X < ANY(1000,2000, 3000) --- TRUE
X = 4500 --X < ANY(1000,2000, 3000)----- FALSE

ALL OPERATOR (COMPARISION WITH MULTIPLE VALUES)


============
WHERE X > ALL(SUBQUERY)
WHERE X > ALL(1000,2000, 3000)

X = 800 --X > ALL(1000,2000, 3000) FALSE X>1000 AND X>2000 AND X>3000
X = 1500 --X > ALL(1000,2000, 3000) FALSE
X = 4500 --X > ALL(1000,2000, 3000) TRUE

=> DISPLAY EMPLOYEE DETAILS WHO ARE EARNING MORE THAN ALL THE MANAGERS
=> GET THE SALARY OF ALL THE MANAGERS
=> FILTER THE EMP1 TABLE AS PER ABOVE RESULT
SELECT ENAME,SAL FROM EMP1 WHERE SAL > ALL(SELECT SAL FROM EMP1 WHERE JOB =
'MANAGER');

-- DISPLAY EMPLOYEE DETAILS EARNING MORE THAN ATLEAST ONE MANAGER

SELECT ENAME,SAL FROM EMP1 WHERE SAL > ANY(SELECT SAL FROM EMP1 WHERE JOB =
'MANAGER');

==========================================================================
20-05-2022
CO-RELATED SUBQUERY:
====================
=> INNER QUERY WILL REFERENCE THE OUTER QUERY
=> INNER QUERY IS NOT INDEPENDANT OF OUTER QUERY
=> INNER QUERY IS DEPENDANT ON OUTER QUERY
=> EXECUTION WILL START FROM OUTER QUERY AND INNER QUERY WILL EXECUTED NUMBER OF TIMES
DEPENDANT ON NUMBER OF ROWS RETURNED BY OUTER QUERY
=> SUBQUERY GETS EXECUTED FOR EACH ROW RETURN BY OUTER QUERY

=> DISPLAY EMPLOYEES EARNING MORE THAN THE AVEGERAGE SALARY OF THEIR DEPARTMENT

SELECT * FROM EMP1 AS E WHERE SAL > (SELECT AVG(SAL) FROM EMP1 WHERE DEPTNO =
E.DEPTNO);

=> DISPLAY EMPLOYEES EARNING LESS THAN THE AVEGERAGE SALARY OF THEIR DEPARTMENT

SELECT * FROM EMP1 AS E WHERE SAL < (SELECT AVG(SAL) FROM EMP1 WHERE DEPTNO =
E.DEPTNO);

=>
DISPLAY EMPLOYEE DETAILS EARNING MAX SALARY IN THEIR DEPARTMENTS

SELECT * FROM EMP1 AS E WHERE SAL = (SELECT MAX(SAL) FROM EMP1 WHERE DEPTNO =
E.DEPTNO);

=>
EXISTS and NOT EXISTS OPERATORS
-------------------------------
=> THESE OPERATORS CHECKS WHETEHR THE RECORDS EXISTS OR DOES NOT EXISTS

SELECT * FROM TABLENAME WHERE EXISTS(SELECT STATEMENT)

=> EXISTS RETURNS TRUE OR FALSE

TRUE=> IF SUBQUERY RETURNS ATLEAST ONE ROW


FALSE=> IF SUBQUERY DOES NOT RETURN ANY ROW

=> DISPLAY THE PRODUCT DETAILS FROM PRODUCTSV BUT FOR ONLY THOSE PRODUCTS WHICH
HAVE BEEN SOLD..SELLING INFORMATION IS AVAILABLE IN ORDERSV TABLE

SELECT * FROM PRODUCTSV WHERE PID IN (SELECT DISTINCT PID FROM ORDERSV) ;

SELECT * FROM PRODUCTSV AS P WHERE EXISTS(SELECT * FROM ORDERSV WHERE PID = P.PID);

=> PERFORMANCE WISE SQL SERVER RECOMMENDS TO USE EXISTS OPERATOR

------------------------------------
NOT EXISTS
----------
SELECT * FROM TABLENAME WHERE NOT EXISTS(SELECT STATEMENT);

TRUE=> IF SUBQUERY RETURNS NO ROWS OR 0 ROWS


FALSE=> IF SUBQUERY RETURNS ATLEAST ONE ROW

=> DISPLAY THE PRODUCTS DETAILS OF ONLY THOSE PRODUCTS WHICH HAVE NOT BEEN SOLD
SELECT * FROM PRODUCTSV WHERE PID NOT IN (SELECT DISTINCT PID FROM ORDERSV) ;

SELECT * FROM PRODUCTSV AS P WHERE NOT EXISTS(SELECT * FROM ORDERSV WHERE PID =
P.PID);

=> PERFORMANCE WISE SQL SERVER RECOMMENDS TO USE NOT EXISTS OPERATOR
---------------------------------------------------------------------
DERIVED TABLES:(SUBQUERY INSIDE FROM CLAUSE)
----------------
----------------

=> SUBQUERY INSIDE THE FROM CLAUSE IS KNOWN AS DERIVED TABLE

SELECT COLUMNS FROM (SELECT STATEMENT) AS ALIAS WHERE CONDITION

=> SUBQUERY OUTPUT ACTS LIKE A TABLE FOR OUTER QUERY


=> DERIVED TABLES HELP US IN ACHIEVING THE REQUIREMENTS WHICH ARE DIFFICULT TO ACHIVE
BECAUSE OF EXECUTION ORDER..
FROM, WHERE,GROUP BY, HAVING, SELECT , ORDER BY

=> DISPLAY RANKS OF ALL THE EMPLOYEES BASED ON THEIR SALARY AND HIGHEST
PAID EMPLOYEE SHOULD GET 1ST RANK
SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1;

=> DISPLAY ONLY THE EMPLOYEE HAVING RANK LESS THEN OR EQUAL TO 5

SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1 WHERE RNK<= 5; ERROR
BECAUSE OF EXECUTION ORDER

SELECT * FROM (SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1) AS E
WHERE RNK <=5;

=> DISPLAY 5TH RECORD TO 10TH RECORD OF EMP1 TABLE


SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY EMPNO ASC) AS RN FROM EMP1) AS E
WHERE RN BETWEEN 5 AND 10;

=> DISPLAY ONLY FIRST 5 RECORDS FROM EMP TABLE AS PER ROW NUMBER
SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY EMPNO ASC) AS RN FROM EMP1) AS E
WHERE RN <=5;

================================================================================
23-05-2022

SUBQUERIES ---- WHERE , FROM (DERIVED TABLES)


SELECT, HAVING

SUBQUERY IN SELECT CLAUSE:

=> DISPLAY PERCENT CONTRIBUTION IN TERMS OF SALARY WITHDRAWN OUT OF TOTAL SALARY

USING WINDOWS FUNCTION:

SELECT * , 100*SAL/SUM(SAL) OVER() AS PCT FROM EMP1;

USING SUBQUERY IN SELECT CLAUSE

SELECT *, 100*SAL/(SELECT SUM(SAL) FROM EMP1) AS PCT FROM EMP1;

=> DISPLAY PERCENT CONTRIBUTION IN TERMS OF SALARY WITHDRAWN OUT OF TOTAL SALARY
FOR THE DEPARTMENT

USING WINDOWS FUNCTIONS:


SELECT *, 100 * SAL/SUM(SAL) OVER(PARTITION BY DEPTNO) AS PCT FROM EMP1;
USING SUBQUERY:
SELECT *,
100*SAL/(SELECT SUM(SAL) FROM EMP1 AS I WHERE I.DEPTNO = O.DEPTNO)
AS PCT,
(SELECT SUM(SAL) FROM EMP1 AS I WHERE I.DEPTNO = O.DEPTNO) AS TOTAL
FROM EMP1 AS O
ORDER BY DEPTNO ASC;

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

SUBQUERY IN HAVING CLAUSE

=>DISPLAY ONLY THOSE DEPARTMENTS WHOSE TOTAL SALARY IS MORE THAN


THE AVERAGE SALARY OF ENTIRE ORGANIZATION

SELECT DEPTNO, SUM(SAL) AS TOTAL FROM EMP1 GROUP BY DEPTNO


HAVING SUM(SAL) > (SELECT AVG(SAL) FROM EMP1);

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

SELECT * FROM (SELECT DEPTNO, ENAME FROM EMP1 ORDER BY DEPTNO) AS E => ERROR

ERROR MESSAGE => The ORDER BY clause is invalid in views,


inline functions, derived tables, subqueries, and common table expressions,
unless TOP, OFFSET or FOR XML is also specified.
=================================================

SUBQUERY IN DELETE STATEMENT


=============================
=> DELETE FROM EMP1 TABLE THE EMPLOYEE RECORD HAVING MAXIMUM EXPERIENCE

DELETE FROM EMP1


WHERE HIREDATE =
(SELECT MIN(HIREDATE) FROM EMP1);
====================================================

SUBQUERY IN UPDATE STATEMENT:


==============================
=> UPDATE SALARY OF EMPID 7566 TO THE MAXIMUM SALARY OF THE ENTIRE ORGANIZATION
UPDATE EMP1
SET SAL =
(SELECT MAX(SAL) FROM EMP1) WHERE EMPNO = 7566;
==============================================

USING SUBQUERY IN INSERT STATEMENT :


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

=> CREATE A COPY OF EMP1 TABLE WITHOUT DATA

SELECT * INTO EMPTEST FROM EMP1 WHERE 1 = 2;

=> INSERT INTO THIS TABLE EMPTEST THE DATA FROM EMP1 TABLE WHERE SAL IS MORE THAN
AVERAGE SALARY OF THE ORGANIZATION

INSERT INTO EMPTEST


SELECT * FROM EMP1 WHERE SAL > (SELECT AVG(SAL) FROM EMP1);
===============================================================================

CTE ( COMMON TABLE EXPRESSIONS):

=> FROM EMP1 TABLE SELECT ONLY THOSE RECORDS WHOSE RANK IS <= 5. RANKING HAS TO BE
DONE ON BASIS OF SALARY COLUMN. THE PERSON HAVING MAXIMUM SALARY SHOULD HAVE RANK 1

USING DERIVED TABLE ( SUBQUERY WITH IN FROM CLAUSE):


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

SELECT * FROM (SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1)
AS E
WHERE E.RNK <=5;

===============================
USING CTE
==========

WITH E AS
(
SELECT *, DENSE_RANK() OVER(ORDER BY SAL DESC) AS RNK FROM EMP1
)
SELECT * FROM E WHERE RNK <=5;

/*FROM APPLE STORE DISPLAY THE STORE NAMES WHOSE TOTAL SALES IS MORE THAN
AVERAGE SALES OF ALL STORES*/
-- TOTAL SALES PER STORE
-- AVERAGE SALES
-- FILTERING ---TOTAL SALES PER STORE ----- AVERAGE SALES

SELECT * FROM
(SELECT STORE_NAME, SUM(SALES) AS TOTAL FROM applestore GROUP BY store_name) AS E1
WHERE TOTAL > (SELECT AVG(TOTAL) FROM
(SELECT STORE_NAME, SUM(SALES) AS TOTAL FROM applestore GROUP BY store_name) AS E);

======================================================================
HOW TO OBTAIN SAME RESULT WITH CTE
=====================

==> INLINE COLUMN ALIASING ==>


WITH E AS
(
SELECT STORE_NAME, SUM(SALES) AS TOTAL FROM applestore GROUP BY store_name
)
SELECT * FROM E WHERE TOTAL > (SELECT AVG(TOTAL) FROM E);

EXTERNAL COLUMN ALIASING ==>

WITH E(STORE,TOTAL) AS
(
SELECT STORE_NAME, SUM(SALES) FROM applestore GROUP BY store_name
)
SELECT * FROM E WHERE TOTAL > (SELECT AVG(TOTAL) FROM E);

=>
==========================================================
DELETE DUPLICATE RECORDS FROM A TABLE

SELECT * FROM DUPLICATES

NAME COUNTRY
RAJ INDIA
RAJ INDIA
PAVAN USA
ROHIT UK
ROHIT UK
ROHIT UK
RAJ FRANCE
PAVAN INDIA

STEP1 ==
NAME COUNTRY RN
RAJ INDIA 1
RAJ INDIA 2
PAVAN USA 1
ROHIT UK 1
ROHIT UK 2
ROHIT UK 3
RAJ FRANCE 1
PAVAN INDIA 1

STEP2 ==>
DELETE THE RECORDS WHOSE RN>1
NAME COUNTRY RN
RAJ INDIA 1
PAVAN USA 1
ROHIT UK 1
RAJ FRANCE 1
PAVAN INDIA 1

===============================
WITH E AS
(
SELECT * , ROW_NUMBER() OVER (PARTITION BY NAME, COUNTRY ORDER BY NAME) AS RN FROM
DUPLICATES
)
DELETE FROM E WHERE RN>1;

==================================
MULTIPLE CTEs
===========
WITH E1 AS
(
QUERY 1
),
E2 AS
(
QUERY 2
)
STATEMENT USING E1 AND E2
=============================================
RECURSIVE CTES

=> WHEN CTE REFERENCE ITSELF IT IS KNOWN AS RECURSIVE CTE

WITH <CTENAME> [TARGET COLUMNS] AS


(
<ANCHOR MEMBER>
UNION ALL
<RECURSIVE MEMBER>
)
OUTER QUERY AGAINST CTE

APPLICATIONS OF RECURSIVE CTES....EXAMPLE I WANT TO GENERATE A LIST OF DATES


I WANT TO EXCESS HIERARCHY

=>ANCHOR QUERY WILL BE INVOKED ONLY ONCE


=> RECURSIVE QUERY IS A QUERY THAT HAS REFERENCE
TO THE CTE NAME AND WILL BE INVOKED AGAIN AND AGAIN TILL IT RETURNS BLANK RESULT.
=> REFERENCE TO CTE NAME REPRESENTS PREVIOUS RESULT SET
=> FIRST TIME RECURSIVE MEMBER IS INVOKED, THE PREVIOUS RESULT SET REPRESENTS
WHATEVER THE ANCHOR MEMBER HAS RETURNED.
=> IN EACH SUBSEQUENT INVOCATION OF RECURSIVE MEMBER , THE REFERENCE TO CTE NAME
REPRESENTS THE RESULT SET RETURNED BY PREVIOUS INVOCATION OF RECURSIVE MEMBER.
=> BOTH ANCHOR AND RECURSIVE QUERIES SHOULD HAVE SAME NUMBER OF COLUMNS AND DATA TYPES
=> THE REFERENCE OF CTE IN OUTER QUERY MEANS UNIFIED RESULT SETS OF INVOCATION OF
ANCHOR AND ALL THE INVOCATIONS OF RECURSIVE MEMBER.
EXCESSING HIERARCHY:
=====================

WITH E AS
(
SELECT EMPID, FIRSTNAME, LASTNAME, 1 AS RNK FROM HR.Employees WHERE mgrid is NULL
UNION ALL
SELECT H.EMPID,H.FIRSTNAME, H.LASTNAME, RNK+1 FROM E
INNER JOIN HR.Employees AS H
ON H.MGRID = E.EMPID
)
SELECT * FROM E;

===================
EMPID FIRSTNAME LASTNAMERNK
1 Sara Davis 1
2 Don Funk 2
3 Judy Lew 3
5 Sven Mortensen 3
6 Paul Suurs 4
7 Russell King 4
9 PatriciaDoyle 4
4 Yael Peled 4
8 Maria Cameron 4
===========================================================
25-05-2022

=>GENERATE LIST OF DATES FOR CURRENT MONTH


========================================
CURRENT DATE --- MONTH --- MAY -- 1 MAY 2022 - 31 MAY 2022
JUNE 1 JUNE 2022 - 30 JUNE 2022

WITH DATES AS
(
SELECT DATEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),1) AS [DATE]
UNION ALL
SELECT DATEADD(DAY,1,[DATE]) FROM DATES WHERE [DATE] < EOMONTH(GETDATE())
)
SELECT * FROM DATES;

===> LIST OF THE DATES COMPLETE CURRENT YEAR


WITH DATES AS
(
SELECT DATEFROMPARTS(YEAR(GETDATE()),1,1) AS [DATE]
UNION ALL
SELECT DATEADD(DAY,1,[DATE]) FROM DATES WHERE [DATE] <
DATEFROMPARTS(YEAR(GETDATE()),12,31)
)
SELECT * FROM DATES OPTION(MAXRECURSION 32767);
=> 32767 IS MAX LIMIT

===========================================================
TRANSACTIONS IN SQL SERVER

=> A TRANSACTION IS A SET OF OPERATIONS SO THAT ALL THE OPERATIONS ARE GUARRANTEED TO
SUCCEED OR FAIL AS ONE UNIT.

PRAVEER NARAYAN PRAVEER+NARAYN === PRAVEER + NARAYAN


50000 50000 =1L = 40000 + 60000 = 1L
DEBITED CREDITED ---VALID -- SAVED IN DATABASE PERMANENTLY
DEBITED NOT CREDITED(FAILED) ---INVALID --- DEBITED SHOULD BE ROLL BACK

(
DEBIT
CREDIT)
DEBITED AND CREDIT BOTH SHOULD BE SUCCESFUL

=> MONEY WITHDRAWL FROM ATM

CHECK BALANCE ==> UPDATE BALANCE==> WRITE WITHDRAW OPERATION IN LOGFILE

=> IF ANY OPERATION OR SQL STATEMENT RETURNS AN ERROR, ENTIRE MODIFICATION IS


ROLLED BACK TO PROVIDE DATA INTEGRITY.

TRANSACTION SHOULD SATISFY FOUR PROPERTIES:


====================================
[ACID]

A--> ATOMICITY --- ALL OR NONE... ALL OPERATIONS IN WITHIN TRANSACTION SHOULD BE
COMPLETED OR NONE
C--> CONSISTENCY -----IF THE TRANSACTION IS GETTING SUCCESFUL THAN IT SHOULD MAINTAIN
RULES, CONSTRAINTS SET BEFORE
I---> ISOLATION ---- TRANSACTIONS SHOULD BE ISOLATED FROM OTHER TRANSACTION
D---> DURABILITY ------THE MODIFICATIONS OF THE COMMITTED TRANSACTION BECOMES
PERSISTANT
IN DATABASE

MODES OF TRANSACTIONS IN SQL SERVER:


1.AUTOCOMMIT TRANSACTION ( DEFAULT OPTION IN SQL SERVER)
2.IMPLICIT TRANSACTION
3.EXPLICIT TRANSACTION

COMMIT: TO MAKE CHANGES DONE BY TRANSACTION PERMANANET IN DATABASE


ROLLBACK: TO UNDO THE CHANGES MADE BY TRANSACTION

EVERY TRANSACTION SHOULD HAVE A BEGINING AND END.. IF IT BEGIN BUT NOT END IT WILL BE
CALLED AS OPEN TRANSACTION

1. AUTOCOMMIT TRANSACTION:
THIS IS DEFUALT AVAIALABLE IN SQL SERVER. IN THIS MODE EVERY SQL STATEMENT IS
TREATED AS ONE TRANSACTION. SO IT WILL SAVE THE CHANGES PERMANENTLY USING COMMIT
IF NO ERROR OCCURS OR IT WILL ROLLBACK THE CHANGES.
==========================================================
27-05-2022
2.IMPLICIT TRANSACTION:
IN sql SERVER , AN IMPLICIT TRANSACTION IS WHEN A NEW TRANSACTION IS IMPLICITLY
STARTED
WHEN THE PRIOR TRANSACTION COMPLETES BUT EACH TRANSACTION IS EXPLICITLY COMPLETED WITH
A COMMIT OR ROLLBACK.

SET IMPLICIT_TRANSACTIONS ON

SELECT * FROM PRODUCTSV


SELECT * FROM VENDORS
ROLLBACK TRANSACTION ---- END OF TRANSACTION -- COMMIT OR ROLLBACK
SELECT * FROM VENDORS
SELECT* FROM PRODUCTSV
COMMIT TRANSACTION
SELECT * FROM PRODUCTSV
SELECT * FROM VENDORS
COMMIT TRANSACTION

SELECT @@TRANCOUNT -- OPEN TRANSACTIONS

ROLLBACK TRANSACTION -- DOES UNDO OPERATION --MAKE CHANGES DONE BY TRANSACTION


COMMIT TRANSACTION --- WILL MAKE YOUR CHANGES PERMANENT IN THE DATABASE

BOTH ARE USED TO END YOUR TRANSACTION


3. EXPLICIT TRANSACTION:
========================
IT PROVIDES US A WAY TO DEFINE A TRANSACTION EXACTLY WITH STARTING AND ENDING POINTS
OF
TRANSACTION

CREATE TABLE A(a int);


BEGIN TRANSACTION
INSERT INTO A VALUES(10)
INSERT INTO A VALUES(20)
INSERT INTO A VALUES(30)
INSERT INTO A VALUES(40)
COMMIT TRANSACTION --- IT HAS MADE CHANGES PERMANENT IN DATABASE
SELECT * FROM A
SELECT @@TRANCOUNT -- WILL GIVE ME 0

a
10
20
30
40
==========================================
BEGIN TRANSACTION
INSERT INTO A VALUES(40)
INSERT INTO A VALUES(50)

INSERT INTO A VALUES(60)


INSERT INTO A VALUES(70)
ROLLBACK TRANSACTION -- UNDO THE OPERATION DONE BY TRANSACTION
SELECT * FROM A
=======================================
30-05-2022
SAVE TRANSACTION:
=>WHEN WE WANT TO CANCEL PART OF THE TRANSACTION NOT COMPLETE THEN WE CAN USE
SAVE TRANSACTION

=>WE CAN DECLARE SAVE TRANSACTION AND WE CAN ROLLBACK UPTO THE SAVE TRANSACTION

CREATE TABLE C(A INT);


BEGIN TRANSACTION
INSERT INTO C VALUES(10)
INSERT INTO C VALUES(20)
SAVE TRANSACTION ST1
INSERT INTO C VALUES(30)
INSERT INTO C VALUES(40)
SAVE TRANSACTION ST2
INSERT INTO C VALUES(50)
INSERT INTO C VALUES(60)
ROLLBACK TRANSACTION ST1
COMMIT TRANSACTION
SELECT @@TRANCOUNT

TCL-----(TRANSACTION CONTROL LANGUAGE)


1. COMMIT ---TO MAKE CHANGES PERMANENT IN DATABASE
2.ROLLBACK ---TO CANCEL A TRANSACTION OR TO UNDO THE CHANGES MADE MY TRANSACTION
3. SAVE TRANSACTION --TO CANCEL OR UNDO A PART OF THE TRANSACTION
============================================================================
TEMPORARY TABLES
=> THE TEMPORARY TABLES ARE CREATED IN THE TEMPDB DATABASE
=> THESE ARE CREATED TO STORE THE DATA TEMPORARILY AND THEY CAN PERFORM
CREATE, READ, UPDATE, DELETE, JOIN..OPERATIONS LIKE WE DO WITH NORMAL TABLES

=> THEY ARE DROPPED WHEN THE SESSION THAT CREATED THEM IS CLOSED
=> THEY CAN ALSO BE DROPPED EXPLICITLY BY USER USING DROP STATEMENT

TYPES OF TEMP TABLES


===========================
THERE ARE TWO TYPES OF TEMP TABLES BASED ON THEIR SCOPE
1. LOCAL TEMPORARY TABLES
2. GLOBAL TEMPORARY TABLES

1.LOCAL TEMPORARY TABLES:


========================
THE SCOPE OF THE LOCAL TEMP TABLE IS LIMITED BY THE CONNECTION IN WHICH THIS IS
CREATED.
THE LOCAL TEMP TABLES ARE VISIBLE FOR THE DURATION OF THE CONNECTION AND WHEN THE
SESSION
IS CLOSED THE LOCAL TEMP TABLE IS DROPPED AUTOMATICALLY.

THE LOCAL TEMP TABLE CAN BE CREATE USING CREATE STATEMENT BUT WE HAVE TO USE A #
SYMBOL
IN FRONT OF TEMP TABLE NAME ---

I WANT TO CREATE TEMP TABLE --- #EMP ---LOCAL TEMP TABLE

CREATE TABLE #EMP( ID INT,


ENAME VARCHAR(10),
SAL MONEY);

INSERT INTO #EMP VALUES(1,'A',5000),(2,'B',6000),(3,'C',4000);

SELECT * FROM #EMP WHERE SAL >= 5000

OTHER WAY OF CREATING TEMP TABLE:


================================
SELECT * INTO #ORDPROD FROM
(SELECT O.*, P.PNAME FROM ORDERSV AS O
INNER JOIN
PRODUCTSV AS P
ON O.PID=P.PID) AS W

SELECT * FROM #ORDPROD WHERE PNAME = 'REXONA'

=======================================================
2. GLOBAL TEMPORARY TABLES
WE CAN CREATE GLOBAL TEMP TABLES LIKE LOCAL TEMP TABLES BUT THE TABLENAME WILL
BE PREFIXED BY ##
=> THESE TABLES CAN BE ACCESSED BY ALL OTHER SESSIONS UNLIKE LOCAL ONES.

=> WE CAN DROP THE GLOBAL TEMP TABLE WITH DROP STATEMENT IN ANY OF SESSION AND ALSO
IT IS AUTOMATICALLY DROPPED WHEN THE SESSION IS CLOSES THAT CREATED THIS GLOBAL TEMP
TABLE.

IF IT IS IN USE BY OTHER SESSION AND WE ARE CLOSING THE SESSION WHICH CREATED IT THEN
SQL SERVER WAITS UNTIL THE COMPLETION OF THE LAST SQL STATEMENT ACTIVITY THAT USED THE
GLOBAL TEMP TABLE. ONCE DONE GLOBAL TEMP TABLE WILL BE DROPPED.

CREATE TABLE ##EMP( ID INT,


ENAME VARCHAR(10),
SAL MONEY);

INSERT INTO ##EMP VALUES(1,'A',5000),(2,'B',6000),(3,'C',4000);


==============================================================================
31-05-2022
VIEWS
=====
=> VIEW IS A SELECT STATEMENT WHICH IS STORED INSIDE DATABASE
=> IT DERIVES THE DATA FROM BASE TABLES
=> IT ALWAYS REFLECTS THE MOST CURRENT DATA IN THE BASE TABLES
=> IT IS A DATABASE OBJECT SO IT CAN BE ACCESSED BY USERS AS WELL AS APPLICATION
PROGRAMS
=> A VIEW IS A VIRTUAL TABLE ( TABLE WHICH DOES NOT EXISTS PHYSICALLY),
IT DOES NOT STORE THE DATA AND IT DERIVES THE DATA FROM
BASE TABLES.
=> VIEW IS A REPRESENTATION OF A QUERY

=> VIEWS CAN BE USED LIKE NORMAL TABLES. WE CAN SELECT, FILTER , SORT , JOIN VIEWS
WITH
OTHER VIEWS OR TABLES AND EVEN WE CAN UPDATE BASE TABLES WITH THE HELP OF VIEW(
WITH
SOME RESTRICTIONS)
=> VIEWS CAN BE NESTED.
=> OTHER VIEWS CAN BE BUILT FROM FROM A VIEW

WHY VIEWS ARE IMPORTANT


=======================
1. REUSABILITY OF SQL STATEMENTS
2. REDUCED COMPLEXITY
3. GIVEN ACCESS TO SUBSET OF TABLES (SECURITY)
4. TO EXPOSE ONLY PART OF TABLES INSTEAD OF COMPLETE TABLES (SECURITY)
=> WITH THE HELP OF VIEW WE CAN PROVIDE COLUMN LEVEL AND ROW LEVEL SECURITY BY
GRANTING
ACCESS TO SPECIFIC COLUMNS AND SPECIFIC ROWS OF THE TABLE TO USERS.

SYNTAX OF CREATING VIEWS


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

CREATE VIEW <VIEWNAME> [(C1,C2,C3,C4)]


[WITH ENCRYPTION | SCHEMABINDING | ENCRYPTION,SCHEMABINDING]
AS
SELECT STATEMENT
[WITH CHECK OPTION]
=========================================================
==> VIEWS TYPES
=================
1. SIMPLE VIEWS OR UPDATABLE VIEWS
2. COMPLEX VIEWS OR NON UPDATABLE VIEWS OR READ ONLY VIEWS

1. SIMPLE VIEWS OR UPDATABLE VIEWS


==================================
=>UPDATABLE VIEW IS THE ONE WHICH CAN BE USED IN AN INSERT,UPDATE AND DELETE STATEMENT
TO MODIFY THE BASE TABLES THAT THE VIEW REFERS TO.
=> THE VIEWS IN WHICH SQL SERVER DONT FIND ANY AMBIGUITY IN UPDATING THE BASE TABLES
ARE UPDATABLE VIEWS.
=> IF A VIEW DONT CONSIST OF MULTIPLE BASE TABLES,JOINS, GROUP BY, SUBQUERIES, UNION,
AGGREGATE FUNCTIONS, DISTINCT, DERIVED TABLES THEN SQL SERVER WILL BE ABLE TO UPDATE
THE BASE TABLES ..HENCE SUCH VIEWS ARE KNOWN AS UPDATABLE VIEWS OR SIMPLE VIEWS.

CREATING A SIMPLE VIEW


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

CREATE VIEW VIEW_EMP


AS
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP1;

=> SQL SERVER CREATES THE VIEW VIEW_EMP BUT DOES NOT STORE QUERY OUTPUT

=>AFTER CREATING OF THE VIEW THE USER CAN ACCESS IT LIKE A NORMAL TABLE:

SELECT * FROM VIEW_EMP;

=> WHEN ABOVE QUERY IS SUBMITTED--THEN SQL SERVER ACTUALLY EXECUTES THE QUERY AS
FOLLOWS

SELECT * FROM (SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP1)


=================================================================
CREATE VIEW VIEW_EMP_20
AS
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP1 WHERE DEPTNO =20;

UPDATE EMP1 TABLE USING VIEW:


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

INSERT INTO VIEW_EMP_20 VALUES(555,'XYZ','CLERK',30) => 1 ROW AFFECTED

WITH CHECK OPTION:


=================
IT PREVENTS A ROW FROM BEING UPDATED THROUGH A VIEW IF IT WOULD NO LONGER BE INCLUDED
IN THE VIEW

CREATE VIEW VIEW_EMP_20_WITHCHECK


AS
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP1 WHERE DEPTNO =20
WITH CHECK OPTION;

INSERT INTO VIEW_EMP_20_WITHCHECK VALUES(556,'YYZ','CLERK',30) ==> ERROR


INSERT INTO VIEW_EMP_20_WITHCHECK VALUES(556,'YYZ','CLERK',20)==> 1 ROW AFFECTED

============================================================================
01-06-2022
Complex Views
===========

=>IF A VIEW CONSISTS OF MULTIPLE BASE TABLES,JOINS, GROUP BY, SUBQUERIES, UNION,
AGGREGATE FUNCTIONS, DISTINCT, DERIVED TABLES..IN SUCH CASES SQL SERVER IS NOT ABLE
TO
UPDATE THE BASE TABLES BECAUSE OF AMBIQUITY. SUCH VIEWS ARE KNOWN AS COMPLEX VIEWS OR
NON UPDATABLE VIEWS

CREATE VIEW CV1


AS
SELECT E.*, D.DEPTNAME FROM EMP1 AS E
LEFT JOIN
DEPTT AS D
ON D.DEPTNO = E.DEPTNO

=>
SELECT * FROM CV1 WHERE DEPTNAME = 'HR'

=>
IN EMP1 TABLE , DEPARTMENT NAME, MIN SAL IN THE DEPARTMENT, MAX SAL IN THE DEPARTMENT
TOTAL SAL OF THE DEPARTMENT, COUNT OF EMPLOYEES IN THE DEPARTMENT

CREATE VIEW DEPT_SUMMARY


AS
SELECT D.DEPTNAME, MIN(E.SAL) AS MIN_SAL,MAX(E.SAL) AS MAX_SAL,SUM(E.SAL) AS
TOT_SAL,COUNT(E.EMPNO) AS NUM_EMP FROM EMP1 AS E
LEFT JOIN
DEPTT AS D
ON E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNAME;

=>
SELECT * FROM DEPT_SUMMARY

=> ALTERING THE VIEW

THE VIEW CAN BE ALTERED BY USING ALTER STATEMENT

=> THE SYNTAX OF ALTER VIEW IS SIMILAR TO CREATE VIEW

ALTER VIEW [dbo].[V1]


AS
SELECT O.*,P.PNAME,V.VNAME,V.VLOC FROM ORDERSV AS O
INNER JOIN
PRODUCTSV AS P ON O.PID=P.PID
INNER JOIN
VENDORS AS V ON P.PID = V.VID

=> DROPPING THE VIEW

DROP VIEW V1
================================

WITH ENCRYPTION:
================
WITH ENCRYPTION WILL NOT ALLOW USER TO SEE THE SQL CODE THAT DEFINES THE VIEW

CREATE VIEW V11


WITH ENCRYPTION
AS
select VID,VNAME,VLOC from vendors;

WITH SCHEMABINDING
===================
STEP1=> CREATE THE VIEW=>

CREATE VIEW VEND


AS
SELECT * FROM VENDORSNEW;

STEP 2 => DROP THE BASE TABLE

DROP TABLE VENDORSNEW;

=> VIEW IS STILL THERE BUT WE WILL NOT BE ABLE TO ACCESS THE VIEW

STEP 3 => RUN SELECT QUERY ON THE VIEW


SELECT * FROM VENDORSNEW ==>
ERROR ==> Invalid object name 'VENDORSNEW'.
Msg 4413, Level 16, State 1, Line 6
Could not use view or function 'VEND' because of binding errors.

=> IF A VIEW IS CREATED WITH SCHEMABINDING OPTION THEN SQL SERVER WILL NOT ALLOW
THE USER TO DROP THE BASE TABLE IF ANY VIEW EXISTS ON THE BASE TABLE.
=> TO DROP THE TABLE FIRST WE NEED TO DROP THE VIEW

RULES=> 1. * IS NOT ALLOWED IN SELECT STATEMENT


2. TABLENAME SHOULD BE SPECIFIED, PREFIXED BY SCHEMA NAME
=====>
CREATE VIEW VEND
WITH SCHEMABINDING
AS
SELECT VID,VNAME,VLOC,VMOB FROM dbo.VENDORSNEW;

drop table vendorsnew; ==> error ---Cannot DROP TABLE 'vendorsnew' because it is
being referenced by object 'VEND'

===================================================
INLINE TABLE-VALUED FUNCTIONS:
=============================
IN SQL SERVER WE CAN USE THESE FUNCTIONS TO ACHIVE THE FUNCTIONALITY OF PARAMETERIZED
VIEWS
THESE ARE LIKE VIEWS BUT WITH ABILITY TO ACCEPT THE PARAMETER.

IN INLINE TABEL -VALUED FUNCTION THE BODY OF THE FUNCTION WILL HAVE ONLY
A SINGLE SELECT STATEMENT.
-- CREATE A FUNCTION THAT RETURNS STUDENT NAME, DOB BY GENDER
CREATE FUNCTION FN_STUDENT_DETAILSBYGENDER
(
@GENDER VARCHAR(10)
)
RETURNS TABLE
AS
RETURN (SELECT [NAME],DOB FROM STUDENT WHERE GENDER = @GENDER);

=> CHECK THE RESULT


SELECT * FROM FN_STUDENT_DETAILSBYGENDER('MALE');
===============================================================
02-06-2022

/*CREATE A FUNCTION WHICH DISPLAYS EMPID , EMPNAME, DOB, DEPARTNAME


ACCORDING TO GENDER*/
CREATE FUNCTION FN_EMPLOYEE_GENDER
( @GENDER VARCHAR(10) )
RETURNS TABLE
AS
RETURN(
SELECT e.ID,e.[NAME],e.DOB,d.DepartmentName from
Employee as e
inner join
department as d
on e.DeptID = d.ID
where e.Gender = @GENDER)

select * from [dbo].[FN_EMPLOYEE_GENDER]('MALE');

FUNCTION WITH DEFAULT PARAMETER


============================
CREATE FUNCTION FN_EMPLOYEE_G
( @GENDER VARCHAR(10) = 'FEMALE')
RETURNS TABLE
AS
RETURN(
SELECT e.ID,e.[NAME],e.DOB,d.DepartmentName from
Employee as e
inner join
department as d
on e.DeptID = d.ID
where e.Gender = @GENDER)

select * from [dbo].[FN_EMPLOYEE_G](DEFAULT);


=================================================================
SYNONYMS:
=>A SYNONYM IS ANOTHER NAME OR ALTERNATIVAE NAME FOR A TABLE OR VIEW
=> IF A TABLE NAME IS LENGTHY THEN THE DEVELOPER CAN GIVE A SIMPLE AND SHORT NAME
TO THE TABLE CALLED AS SYNONYM AND WHERE EVER YOU WANT TO USE TABLENAME THEN INSTEAD
OF
USING TABLENAME WE CAN USE SYNONYMS.

SYNTAX:
CREATE SYNONYM <NAME> FOR <TABLENAME>

EXAMPLE : CREATE SYNONYM E FOR EMP1;

AFTER CREATING SYNONYM INSTEAD OF USING COMPLETE TABLE NAME WE CAN USE SYNONYM IN
SELECT/INSERT/UPDATE/DELETE QUERIES:

SELECT * FROM E;
DELETE FROM E WHERE EMPNO = 556;

DIFFERENCE BETWEEN ALIAS AND SYNONYM:


====================================
ALIAS SYNONYM
1. NOT PERMANENT IT IS PERMANENT
2. NOT STORED IN DB IT IS STORED IN DB
3. SCOPE OF ALIAS IS LIMITED TO QUERY SCOPE OF SYNONYM IS UPTO THE SCHEMA
=====================================================================================

SEQUENCES:
=> SEQUENCES ARE CREATED TO GENERATE SEQUENCE NUMBERS
=> USING SEQUENCE WE CAN AUTO INCREMENT COLUMN VALUES

SYNTAX:
CREATE SEQUENCE <NAME>
[START WITH <VALUE>]
[INCREMENT BY <VALUE>]
[MAXVALUE <VALUE>]
[MINVALUE <VALUE>]
[CYCLE/NOCYLE]
[CACHE <VALUE> |NO CACHE]

=> ALL ARGUMENTS ARE OPTIONAL


CREATE SEQUENCE S1 ==> WILL GENERATE SEQUENCE

=> CREATE A SEQUENCE TO GENERATE SEQUENCE FROM 1 TO 5

CREATE SEQUENCE S2
START WITH 1
INCREMENT BY 1
MAXVALUE 5;

CREATE TABLE STUDENT


(SID INT,
SNAME VARCHAR(10));

INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'A') -- 1 ROW AFFECTED


INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'B')---- 1 ROW AFFECTED
INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'C')----- 1 ROW AFFECTED
INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'D')------- 1 ROW AFFECTED
INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'E')-------- 1 ROW AFFECTED
INSERT INTO STUDENT VALUES(NEXT VALUE FOR S2,'F')---------ERROR

=================================
USING SEQUENCE IN UPDATE COMMAND

CREATE SEQUENCE S3
START WITH 100
INCREMENT BY 1
MAXVALUE 999;

UPDATE E SET EMPNO = NEXT VALUE FOR S3;


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

USING SEQUENCE IN EXPRESSION:

REQUIREMENT:
=============
INVOICENO INVOICEDATE
FKT/0622/1
FKT/0622/2
FKT/0622/3
FKT/0722/4
FKT/0722/5

CREATE TABLE INVOICE


(INVNO VARCHAR(20),
INVDTE DATE);
CREATE SEQUENCE S4
START WITH 1
INCREMENT BY 1
MAXVALUE 9999;

INSERT INTO INVOICE VALUES('FKT/'+ FORMAT(GETDATE(),'MMyy')+'/'+CAST(NEXT VALUE FOR S4


AS VARCHAR), GETDATE());
INSERT INTO INVOICE VALUES('FKT/'+ FORMAT(GETDATE(),'MMyy')+'/'+CAST(NEXT VALUE FOR S4
AS VARCHAR), GETDATE());

=============================
================================================================
HOW TO RESET THE SEQUENCE
---------------------------

1. USING ALTER COMMAND


2. USING CYCLE OPTION

1. USING ALTER COMMAND:

=> ALTER / RESET MY SEQUENCE WITH 1


ALTER SEQUENCE S4 RESTART WITH 1

SYNTAX OF ALTER SEQUENCE COMMAND:


==================================
ALTER SEQUENCE <NAME>
[RESTART WITH <VALUE>]
[INCREMENT BY <VALUE>]
[MAXVALUE <VALUE>]
[MINVALUE <VALUE>]
[CYCLE/NOCYLE]
[CACHE <VALUE> |NO CACHE]

CYCLE AND NOCYCLE OPTION:


=========================
=>DEFAULT OPTION IS NOCYCLE
=> IF SEQUENCE IS CREATED WITH NOCYCLE THEN IT STARTS AND GENERATES UPTO MAX AND
AFTER REACHING THE MAX, IT STOPS
=> IF SEQUENCE IS GENERATED WITH CYCLE THEN IT STARTS FROM FROM STAR WITH AND
GENERATES
UPTO MAX AND AFTER REACHING MAX THEN IT WILL BE AUTOMATICALLY RESET TO MIN
====================================
CREATE SEQUENCE S6
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE
===================================

CREATE SEQUENCE S7
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE -5
CYCLE

IMPORTANT---SELECT * FROM INFORMATION_SCHEMA.SEQUENCES


===============================================================
DIFFERENCE BETWEEN SEQUENCE AND IDENTITY
1. IDENTITY PROPERTY IS BIND TO A PARTICULAR COLUMN AND PARTICULAR TABLE BUT SEQUENCE
IS
NOT BIND TO ANY COLUMN OR ANY TABLE.
2. IDENTITY CAN NOT BE CONTROLLED BY APPLICATION CODE WHERE AS SEQUENCE CAN BE
CONTROLLED
BY APPLICATION CODE
3.IDENTITY PROPERTY OF A COLUMN IS AVAILABLE SINCE SQL SERVER 2000 WHERE SEQUENCE
OBJECT IS AVAILABLE SINCE SQL SERVER 2012
4.WE CAN NOT GET THE VALUE OF AN IDENTITY COLUMN BEFORE INSERTING A RECORD WHERE AS WE
CAN
GET THE VALUE OF SEQUENCE NUMBER FOR A SEQUENCE OBJECT BEFORE INSERTING A RECORD.
5.WE CAN RESEED AN IDENTITY PROPERTY BUT WE CAN NOT CHANGE THE STEP SIZE BUT WHERE AS
WE
CAN ALTER THE SEED AS WELL AS THE STEP SIZE OF A SEQUENCE OBJECT AT ANY TIME.

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

INDEXES:

-> INDEX IS A DB OBJECT WHICH IS CREATED TO IMPROVE THE PERFORMANCE OF DATA ACCESSING
OR DATA SEARCHING
--> INDEX IN DB IS SIMILAR TO INDEX IN TEXT BOOK. IN TEXT BOOK WITH THE HELP OF INDEX
WE CAN QUICKLY SEARCH FOR A PARTICULAR TOPIC
=> WHEN WE WRITE A QUERY LIKE SELECT * FROM EMP1 WHERE DEPTNO = 30 THEN SQL SERVER
MAY USE FOLLOWING METHODS TO LOCATE THE RECORD
1. TABLE SCAN -- WHERE EACH AND EVERY ROW OF THE TABLE IS SCANNED FOR THE RECORD
2. INDEX SCAN----IT WILL IMPROVE THE PERFORMANCE IN LOCATING THE RECORD-- THE RECORD
WILL BE LOCATED QUICKLY

SQL SERVER CAN STORE DATA IN DATABASE IN TWO MANNERS


1. UNORDERED------ HEAP STRUCTURE--
2. ORDERED OR SORTED DATA-----CLUSTERED INDEX --- B-TREE - ORDERED DATA -SORTED DATA

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

should I always create clustered index?


NO -- When THE TABLE has lots of insert, update, delete ..our table is highly
transactional
then creating clustered index actually degrades the performance.
Clustered index is good when you know that my table has many data access operations .
(select operations) not much insert, update, delete

=> we can have only one clustered index per table

=> SO IF NEED SEARCH ON THE BASIS OF ANY OTHER COLUMN THEN WE HAVE TO USE NONCLUSTERED
INDEX---- WE CAN HAVE 999 NON CLUSTERED INDEXES PER TABLE

=> HOW MANY INDEXES CAN WE HAVE IN TABLE


1000----> 1 CLUSTERED + 999 NON CLUSTERED

=> IN CLUSTERED INDEX WE HAVE DATA PAGES IN THE LEAF NODE(LAST NODE) OF B-TREE
=> BUT IN NON CLUSTERED INDEX WE HAVE INDEX PAGE IN THE LEAF NODE(LAST NODE) OF B-TREE

THERE ARE THREE KIND OF SCANS AVAILABLE


1. TABLE SCAN -- WE WILL SCAN EVERY ROW OF OUR TABLE...WHEN WE HAVE HEAP TABLE
2. INDEX SCAN --- WHEN WE CREAT CLUSTERED INDEX ..INDEX SCAN--THIS IS NORMALLY USED
WHEN WE DONT HAVE ANY FILTERING PREDICATE IN WHERE CLAUSE
SELECT * FROM EMP1

3. INDEX SEEK--IT IS FASTEST MODE OF SCANNING WHEN WE WANT TO SELECT FEW ROWS FROM
TABLE

==============================================================
07-6-2022
--clustered index
--we will create a primary key
--- when we create primary key clustered index is automatically created
---on the pk unique clustered index is created
/* BECAUSE OF THE CLUSTERED INDEX THE TABLE
DATA WILL BE STORED IN CLUSTERED TABLE FORMAT-- SORTED*/

CREATE TABLE T100


(ID INT PRIMARY KEY,
ENAME VARCHAR(20));

--SP_HELPINDEX T100
index_name index_description
index_keys
PK__T100__3214EC272B8AF133 clustered, unique, primary key located on PRIMARY
ID

CREATING CLUSTERED INDEX --EXPLICITLY:

CREATE TABLE T200


(ID INT,
ENAME VARCHAR(20));

CREATE CLUSTERED INDEX I5 ON T200(ID);

SP_HELPINDEX T200;
====
CREATING NON CLUSTERED INDEX:

CREATE NONCLUSTERED INDEX I6 ON T200(ENAME);


OR
CREATE INDEX I6 ON T200(ENAME);

index_name index_description index_keys


I5 clustered located on PRIMARY ID
I6 nonclustered located on PRIMARY ENAME

nonclustered index ---mobile

select name from students where mobile = 111

COVERING INDEX: TO IMPROVE SEARCH PERFORAMANCE


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

SELECT ENAME,JOB FROM EMP WHERE ENAME = 'JOHN'

=>IN THIS CASE ENAME IS KEY COLUMN


=>AND JOB IS A NON KEY COLUMN
=>TO IMPROVE THE PERFORMANCE OR AVOID KEY LOOKUP WE CAN INCLUDE JOB

WHEN WE CREATE NON CLUSTERED INDEX TO FETCH RESULTS OF PARTICULAR QUERY, SQL SERVER
USES KEY LOOKUP TO RETRIEVE NON KEY DATA.
COVERING INDEX IS AN INDEX THAT CONTAINS ALL INFORMATION TO RESOLVE QUERY.

=> BY INCLUDING NON KEY COLUMNS IN NON CLUSTERED INDEXES WE CAN DRAMATICALLY IMPROVE
THE
PERFORMANCE.

=>CREATE NONCLUSTERED INDEX I7 ON EMP(ENAME) INCLUDE(JOB)


SELECT ENAME,JOB FROM EMP WHERE ENAME = 'JOHN'
=> THIS INDEX I7 IS COVERING INDEX FOR ABOVE QUERY--NO KEY LOOKUP WILL HAPPEN

=> ALTER INDEX <INDEXNAME> ON <TABLENAME> DISABLE


=>ALTER INDEX <INDEXNAME> ON <TABLENAME> ENABLE

=>DROP INDEX TABLENAME.INDEXNAME


=> DROP INDEX EMP.I7

=> FILTERED INDEX : IT IS NON CLUSTERED INDEX WITH WHERE CLAUSE


CREATE INDEX I8 ON EMP(SAL) WHERE SAL>5000

TO IMPROVE THE PERFORMANCE OR AVOID KEY LOOKUP WE CAN INCLUDE JOB


=============================================================================
PIVOT --OPERATOR
=> WE USE PIVOTING FOR CROSS TABULATION OR MATRIX LIKE REPORTS
=> USED TO CONVERT ROWS INTO COLUMNS

SYNTAX:
SELECT * FROM (SELECT STATEMENT) AS ALIAS
PIVOT
(
AGGR EXPRESSION FOR COLNAME IN ([V1],[V2]...)
)
AS ALIAS
ORDER BY CLAUSE

=> JOB WISE DEPARTMENT WISE TOTAL SALARY

10 20 30
SALESMANSUM(SAL)SUM(SAL)SUM(SAL)
MANAGER SUM(SAL)SUM(SAL)SUM(SAL)
CLERK SUM(SAL)SUM(SAL)SUM(SAL)
CEO SUM(SAL)SUM(SAL)SUM(SAL)

SELECT * FROM (SELECT DEPTNO,JOB,SAL FROM EMP1) AS E


PIVOT
(
SUM(SAL) FOR DEPTNO IN ([10],[20],[30])
)
AS P;

JOB 10 20 30
CEO 4000.00 NULL NULL
CLERK 1300.00 1100.00 950.00
MANAGER 2450.00 4000.00 2850.00
SALESMANNULL NULL 8000.00

========>NUMBER OF EMPLOYEES JOINED IN EACH YEAR QUARTER WISE


YEAR 1 2 3 4
2018 C1 C2 C3 C4
2019 C5 C6 C7 C8
2020 C9 C10 C11 C12

SELECT * FROM (SELECT YEAR(HIREDATE) AS YEAR, DATEPART(QUARTER,HIREDATE) AS QTR,


EMPNO FROM EMP1) AS E
PIVOT
(
COUNT(EMPNO) FOR QTR IN ([1],[2],[3],[4])
)
AS P;

===> FOR ONLY 2019 DATA

SELECT * FROM (SELECT YEAR(HIREDATE) AS YEAR, DATEPART(QUARTER,HIREDATE) AS QTR,


EMPNO FROM EMP1) AS E
PIVOT
(
COUNT(EMPNO) FOR QTR IN ([1],[2],[3],[4])
)
AS P WHERE YEAR = 2019;

=> * IS NOT MANADATORY WE CAN CHOOSE WE COLUMNS TO DISPLAY LIKE

SELECT YEAR,[1],[2] FROM (SELECT YEAR(HIREDATE) AS YEAR, DATEPART(QUARTER,HIREDATE) AS


QTR,
EMPNO FROM EMP1) AS E
PIVOT
(
COUNT(EMPNO) FOR QTR IN ([1],[2],[3],[4])
)
AS P;

=> IN DERIVED TABLE USE ONLY THE COLUMN OR EXPRESSION WHICH ARE NEEDED AS A PART OF
PIVOT TABLE.
==============================================================================
08-06-2022

sid sname subject marks


1 A MAT 80
1 A PHY 90
1 A CHE 70
2 B MAT 60
2 B PHY 70
2 B CHE 50

SELECT * FROM studentmaster


PIVOT
(
sum(marks) FOR subject IN ([MAT],[PHY],[CHE])
)
AS ALIAS
ORDER BY SID;

SID SNAME MAT PHY CHE


1 A 80 90 70
2 B 60 70 50

===============================
UNPIVOT OPERATOR:

=> REVERSE PROCESS OF PIVOT


=> WANT TO CONVERT COLUMNS INTO ROWS

SID SNAME MAT PHY CHE


1 A 80 90 70
2 B 60 70 50

sid sname subject marks


1 A MAT 80
1 A PHY 90
1 A CHE 70
2 B MAT 60
2 B PHY 70
2 B CHE 50

SELECT.....
FROM INPUT TABLE
UNPIVOT
(VALUE COLUMN FOR NAME COLUMN IN (SOURCE COLUMNS)
AS ALIAS;

=>
SELECT sid, sname,subject,marks
FROM student_mas
UNPIVOT
(marks FOR subject IN (MAT,PHY,CHE))
AS A;
=====================================================================
MERGE COMMAND
================
=> MERGE COMMAND IS USED TO MERGE DATA FROM A SOURCE INTO TARGET APPLYING
DIFFERENT ACTIONS(INSERT, UPDATE, DELETE) BASED ON CONDITIONAL LOGIC
=> USED TO MERGE DATA INTO A TABLE

MERGE INTO TARGETTABLE AS ALIAS


USING SOURCETABLE AS ALIAS
ON MERGE CONDITION
WHEN MATCHED THEN
UPDATE
WHEN NOT MATCHED THEN
INSERT
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

=> DELETE IS USED TO DELETE RECORDS FROM TARGET IF CORRESPONDING RECORD IS NOT PRESENT
IN SOURCE
=> INSERT IS USED TO INSERT RECORDS INTO TARGET IF CORRESPONDING RECORD IS
NOT PRESENT IN TARGET TABLE
=>UPDATE IS USED TO UPDATE THE RECORDS OF TARGET AS PER SOURCE

=> A MERGE statement must be terminated by a semi-colon (;)

MERGE INTO CUSTOMERSNEW AS TGT


USING CUSTOMERSSTAGE AS SRC
ON TGT.CUSTID = SRC.CUSTID
WHEN MATCHED THEN
UPDATE
SET
TGT.COMPANYNAME = SRC.COMPANYNAME,
TGT.PHONE = SRC.PHONE,
TGT.ADDRESS = SRC.ADDRESS
WHEN NOT MATCHED THEN
INSERT(CUSTID,COMPANYNAME,PHONE,ADDRESS)
VALUES(SRC.CUSTID,SRC.COMPANYNAME,SRC.PHONE,SRC.ADDRESS)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
===> THE ABOVE STATEMENT UPDATES THE TARGET TABLE EVEN WHEN THERE IS SAME DATA
AVAILABLE
IN TARGET TABLE..I.E UPDATE WITHOUT CHECK OF SAME DATA
==> WHEN WE WANT TO UPDATE ONLY WHEN THERE IS CHANGE IN ATLEAST ONE OF THE TARGET
TABLE
COLUMNS

MERGE INTO CUSTOMERSNEW AS TGT


USING CUSTOMERSSTAGE AS SRC
ON TGT.CUSTID = SRC.CUSTID
WHEN MATCHED
AND (TGT.COMPANYNAME <> SRC.COMPANYNAME
OR TGT.PHONE <> SRC.PHONE
OR TGT.ADDRESS <> SRC.ADDRESS)
THEN
UPDATE
SET
TGT.COMPANYNAME = SRC.COMPANYNAME,
TGT.PHONE = SRC.PHONE,
TGT.ADDRESS = SRC.ADDRESS
WHEN NOT MATCHED THEN
INSERT(CUSTID,COMPANYNAME,PHONE,ADDRESS)
VALUES(SRC.CUSTID,SRC.COMPANYNAME,SRC.PHONE,SRC.ADDRESS)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

==< NOTE ---ITS NOT MANDATORY TO USE ALL when staement --WE CAN SKIP ANY CONDITION
AS PER OUR REQUIREMENT. LIKE IN FOLLOWING CODE WE ARE USING WHEN MATCHED STATEMENT.

MERGE INTO CUSTOMERSNEW AS TGT


USING CUSTOMERSSTAGE AS SRC
ON TGT.CUSTID = SRC.CUSTID
WHEN MATCHED THEN
UPDATE
SET
TGT.COMPANYNAME = SRC.COMPANYNAME,
TGT.PHONE = SRC.PHONE,
TGT.ADDRESS = SRC.ADDRESS;

========================================================
09-06-2022
TSQL PROGRAMMING

VARIABLE----VARIABLES ARE USED TO STORE THE DATA TEMPORARILY FOR LATER USE IN THE
SAME BATCH IN WHICH THEY ARE DECLARED.

BATCH IS ONE OR MORE T-SQL STATEMENT SENT BY A CLIENT APPLICATION


TO SQL SERVER FOR EXECUTION AS ONE UNIT
SYNTAX:
DECLARE @varname AS DATATYPE(SIZE)
OR
DECLARE @varname DATATYPE(SIZE)

CORRECT----WILL GIVE NULL VALUES WE HAVE ASSIGN ANY VALUE TO VARIABLE


DECLARE @x as int;
SELECT @x as x;
GO

=============
DECLARE @x as int;
GO
SELECT @x as x;

ERROR--Must declare the scalar variable "@x". BECAUSE WE USING VARIABLE OUTSIDE OF
ITS SCOPE

DECLARING VARIABLES ONE AT A TIME:


DECLARE @x as int;
DECLARE @y as varchar(10);
DECLARE @z as date;

DECLARING MULTIPLE VARIABLES AT A TIME:


DECLARE @x as int, @y as varchar(10),@z as date;

=================================
SET STATEMENT:
=> IT IS USED TO ASSIGN VALUE TO A VARIABLE
=> ONLY ONE VARIABLE IS ALLOWED AT A TIME

-- TO ASSIGN THE VALUES TO VARIABLES


SET @x = 23;
SET @y = 'hello'
SET @z = '2022-11-10'

=> INITIALIZING THE VARIABLE WHILE DECLARING THE VARIABLE

DECLARE @W AS INT = 10;

==============================================
WE CAN ALSO ASSIGN THE VALUES TO VARIABLES USING SELECT STATEMENT(ASSIGNMENT SELECT)
DECLARE @EMPNAME AS VARCHAR(20);
DECLARE @JOB AS VARCHAR(20);
DECLARE @SALARY AS MONEY;

SELECT @EMPNAME = ENAME,@JOB = JOB,@SALARY=SAL FROM EMP1 WHERE EMPNO = 100;


SELECT @EMPNAME,@JOB,@SALARY;
GO

==========================================
IF MULTIPLE ROWS QUALIFY, THEN WHEN ASSIGNMENT SELECT IS FINISHED, THE VALUES IN THE
VARIABLES ARE THOSE FROM THE LAST ROW THE SQL SERVER HAPPENED TO ACCESS

DECLARE @EMPNAME AS VARCHAR(20);


DECLARE @JOB AS VARCHAR(20);
DECLARE @SALARY AS MONEY;

SELECT @EMPNAME = ENAME,@JOB = JOB,@SALARY=SAL FROM EMP1 WHERE DEPTNO = 10;


SELECT @EMPNAME,@JOB,@SALARY;
GO

RESULT:
miller CLERK 1300.00
===========================================
DECLARE @SAL MONEY;
SET @SAL = (SELECT SAL FROM EMP1 WHERE EMPNO=100);
SELECT @SAL AS SALARY;

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

DECLARE @EMPNAME AS VARCHAR(20);


DECLARE @JOB AS VARCHAR(20);
DECLARE @SALARY AS MONEY;

SET @EMPNAME = (SELECT ENAME FROM EMP1 WHERE EMPNO =100);


SET @JOB = (SELECT JOB FROM EMP1 WHERE EMPNO =100);
SET @SALARY = (SELECT SAL FROM EMP1 WHERE EMPNO =100);
SELECT @EMPNAME,@JOB,@SALARY;

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

PRINT STATEMENT:
==============
IT IS USED TO RETURN A USER DEFINED MESSAGE TO THE CLIENT
PRINT 'HELLO'
PRINT @X
PRINT GETDATE()
============================================================
1. WRITE A PROGRAM TO ADD TWO NUMBERS

DECLARE @a int, @b int, @c int;


set @a = 100;
set @b = 200;
set @c = @a+@b;
print @c;

2. WRITE A PROGRAM TO TAKE INPUT DATE AND PRINT DAY OF THE WEEK
DECLARE @D DATE;
SET @D = '1947-08-15'
PRINT DATENAME(DW,@D);

3. WRITE A PROGRAM TO TAKE EMPNO AND PRINT CORRESPONDING NAME AND SALARY FROM EMP1
DECLARE @ENO INT, @ENME VARCHAR(20),@SAL MONEY;
SET @ENO = 100;
SET @ENME = (SELECT ENAME FROM EMP1 WHERE EMPNO = @ENO);
SET @SAL = (SELECT SAL FROM EMP1 WHERE EMPNO = @ENO);
PRINT @ENME + ' '+ CAST(@SAL AS VARCHAR);

===========================================================================
10-06-2022

4 . WRITE A PROGRAM TO INPUT EMPNO AND PRINT EMPLOYEE EXPERIENCE IN EMP1 TABLE
DECLARE @EMPNO INT, @DOJ DATE, @EXP INT;
SET @EMPNO = 100
SELECT @DOJ=HIREDATE FROM EMP1 WHERE EMPNO = @EMPNO
SET @EXP = DATEDIFF(YEAR,@DOJ,GETDATE())
PRINT 'EXPERIENCE = ' + CAST(@EXP AS VARCHAR) + ' YEARS';
====================================================================================
CONDITIONAL STATEMENT:
IF-ELSE
MULTI IF
NESTED IF

IF ELSE:
========

IF CONDITION
BEGIN
S1
S2
S3
END
[ELSE
BEGIN
S4
S5
S6
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 CONDITION
BEGIN
IF CONDITIONN
BEGIN
STATEMENTS
END
ELSE
BEGIN
STATEMENTS
END
END
ELSE
BEGIN
STATEMENTS
END
========================================================================
WRITE A PROGRAM TO INPUT EMPNO AND INCREMENT THE SALARY BY SPECIFIC AMOUNT.
AFTER THE INCREMENT IF SALARY EXCEEDS 5000 THAN CANCEL THE INCREMENT IN EMP1

DECLARE @EMPNO INT, @AMT MONEY, @SAL MONEY;


SET @EMPNO = 100
SET @AMT = 2500
BEGIN TRANSACTION
UPDATE EMP1 SET SAL = SAL + @AMT WHERE EMPNO = @EMPNO
SELECT @SAL = SAL FROM EMP1 WHERE EMPNO = @EMPNO
IF @SAL > 5000
ROLLBACK
ELSE
COMMIT;

===========================================================================
WRITE A PROGRAM TO INPUT EMPNO AND INCREMENT HIS/HER SALARY AS FOLLOWS

IF DEPTNO = 10 INCREMENT SALARY BY 10%


20 INCREMENT SALARY BY 15%
30 INCREMENT SALARY BY 20%
OTHERS BY 5%

DECLARE @EMPNO INT, @DNO INT, @PCT INT;


SET @EMPNO = 106
SELECT @DNO = DEPTNO FROM EMP1 WHERE EMPNO = @EMPNO
IF @DNO = 10
SET @PCT = 10
ELSE IF @DNO=20
SET @PCT = 15
ELSE IF @DNO = 30
SET @PCT = 20
ELSE
SET @PCT = 5
UPDATE EMP1 SET SAL = SAL + (SAL*@PCT/100) WHERE EMPNO = @EMPNO;

=================================================================================
WRITE A PROGRAM TO PROCESS BANK TRANSACTION(W/D) --W -- WITHDRAWL -- D --DEPOSIT

DECLARE @ACNO INT,@TYPE CHAR(1),@AMT MONEY,@BAL MONEY


SET @ACNO =100
SET @TYPE = "W"
SET @AMT = 1000
IF @TYPE ="W"
BEGIN
SELECT @BAL = BALANCE FROM ACCOUNTS WHERE ACCNO = @ACNO
IF @AMT>@BAL
PRINT "INSUFFICIENT BALANCE"
ELSE
UPDATE ACCOUNTS SET BALANCE = BALANCE - @AMT WHERE ACCNO = @ACNO
END
ELSE IF @TYPE = "D"
UPDATE ACCOUNTS SET BALANCE = BALANCE + @AMT WHERE ACCNO = @ACNO
ELSE
PRINT "INVALID TRANSACTION";
====================================================================================
13-06-2022

WHILE LOOP
==========

=> LOOPS ARE USED TO EXECUTE STATEMENT/STATEMENTS REPEATEDLY MULTIPLE TIMES


WHILE CONDITION
BEGIN
STATEMENTS
END

=> THE CONDITION SHOULD RESULT IN TRUE OR FALSE


=> IF CONDITION IS TRUE THE LOOP CONTINUES
=> IF CONDITION IS FALSE THE LOOP TERMINATES

=> PRINT HELLO WORLD 10 TIMES

DECLARE @COUNT INT = 1


WHILE @COUNT <=10
BEGIN
PRINT 'HELLO WORLD'
SET @COUNT = @COUNT + 1
END

NOTE ===> ENSURE TO MENTION A STATEMENT WHICH CAN CAUSE CONDITION TO BECOME FALSE
AS PER YOUR REQUIREMENT. IF CONDITION NEVER BECOMES FALSE THEN IT WILL BECOME
AN INFINITE LOOP AND WILL NEVER TERMINATE.

=> WRITE A PROGRAM TO PRINT NUMBERS FROM 1 TO 10

DECLARE @I INT = 1
WHILE @I<=10
BEGIN
PRINT @I
SET @I = @I+1
END;

=> WRITE A PROGRAM TO PRINT 1,2,3,4,5,7,8,9,10

CONTINUE --- THIS STATEMENT IS USED TO SKIP CURRENT ITERATION OR TO SKIP THE
STATEMENTS
MENTIONED AFTER THE CONTINUE FOR THE CURRENT ITERATION.
=================================================

WRONG---- INFINITE LOOP


DECLARE @I INT = 1
WHILE @I<=10
BEGIN
IF @I=6
CONTINUE
PRINT @I
SET @I = @I+1

CORRECT------------
DECLARE @I INT = 0
WHILE @I<10
BEGIN
SET @I = @I+1
IF @I=6
BEGIN
CONTINUE
END
print @I
END
=======================================================
BREAK STATEMENT -- THIS STATEMENT IS USED TO GET OUT OF LOOP AS PER OUR REQUIREMENT
-- THIS STATEMENT EXIT THE WHILE LOOP IMMEDIATELY WHEN BREAK STATEMENT
IS ENCOUNTERED.

=> GET OUT OF THE LOOP AFTER 5


DECLARE @I INT =1
WHILE @I<=10
BEGIN
PRINT @i
IF @I = 5
BEGIN
BREAK
END
SET @I = @I+1
END

===RESULT:
1
2
3
4
5
==================================================================
WRITE A PROGRAM TO INPUT STRING AND PRINT IN FOLLOWING PATTERN
NAME --'PRAVEER'
EXPECTED --OUTPUT
P
R
A
V
E
E
R

DECLARE @S VARCHAR(20), @X INT = 1


SET @S = 'PRAVEER'
WHILE @X <= LEN(@S)
BEGIN
PRINT SUBSTRING('PRAVEER',@X,1)
SET @X = @X+1
END
=================================================
WRITE A PROGRAM TO INPUT STRING AND PRINT IN FOLLOWING PATTERN
NAME --'PRAVEER'
EXPECTED --OUTPUT
P
PR
PRA
PRAV
PRAVE
PRAVEE
PRAVEER

DECLARE @S VARCHAR(20), @X INT = 1


SET @S = 'PRAVEER'
WHILE @X <= LEN(@S)
BEGIN
PRINT SUBSTRING('PRAVEER',1,@X)
SET @X = @X+1
END
=====================================
PROGRAM TO PRINT FOLLOWING PATTER
*
**
***
****
*****
DECLARE @X INT = 1
WHILE @X <= 5
BEGIN
PRINT REPLICATE('*',@X)
SET @X = @X+1
END
======================================================================================
=====
14-06-2022

CURSOR
======
=>CURSOR PROCESS ROWS FROM A RESULTSET ONE AT A TIME.
=>RESULTSET IS STORED IN SQL SERVER

=> CURSOR IS A DATABASE OBJECT THAT ALLOWS US TO RETRIEVE EACH ROW AT A TIME AND
MANIPULATE ITS DATA.
=> IT IS LIKE A POINTER TO A ROW.

=> CURSOR ARE USED TO ACCESS THE RESULT SET ROW BY ROW
=> FROM TSQL PROGRAM IF WE SUBMIT A QUERY TO SQL SERVER IT GOES TO THE DATABASE
AND GETS THE DATA FROM THE TABLE AND COPIES IT INTO TEMPORARY MEMORY.
USING CURSOR WE CAN GIVE NAME TO THAT MEMORY AND ACCESS THE RESULT SET ROW BY ROW AND
DO THE PROCESSING AS PER NEED.

=> STEPS TO USE A CURSOR --LIFE CYCLE OF A CURSOR

1. DECLARE A CURSOR
2. OPEN THE CURSOR
3. FETCH RECORDS FROM THE CURSOR
4. CLOSE THE CURSOR
5. DEALLOCATE CURSOR

1. DECLARE A CURSOR
==================

DECLARE <NAME> CURSOR FOR SELECT STATEMENT


=> JUST DEFINES THE SELECT STATEMENT TO BE USED

EX: DECLARE C1 CURSOR FOR SELECT * FROM EMP1;

2. OPEN THE CURSOR


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

SYN: OPEN <CURSOR NAME>

OPEN C1

=> SELECT STATEMENT WILL BE SENT TO SQL SERVER


=> THE DATA RETURNED BY SELECT STATEMENT WILL BE SAVED IN TEMPORARY MEMORY
=> CURSOR C1 POINTS TO TEMPORARY MEMORY

3. FETCH RECORDS FROM CURSOR


============================
=> FETCH STATEMENT IS USED TO FETCH RECORDS FROM CURSOR
=> FETCH STATEMENT FETCHES ONE ROW AT A TIME BUT TO FETCH MULTIPLE ROWS FETCH
STATEMENT
SHOULD BE EXECUTED MULTIPLE TIMES.
=> SO FETCH STATEMENT SHOULD BE USED INSIDE A LOOP

SYNTAX : FETCH NEXT FROM <CURSOR NAME> INTO <VARIABLES>

EXAMPLE: FETCH NEXT FROM C1 INTO @A,@B,@C

4. CLOSE THE CURSOR


==============
WHEN THE DESIRED DATA IS FETCHED, CURSOR SHOULD BE CLOSED.

SYN: CLOSE <CURSOR NAME>


EXAMPLE: CLOSE C1

5.DEALLOCATING THE CURSOR


==========================
FINALLY THE CURSOR SHOULD BE REMOVED

SYN: DEALLOCATE <CURSOR NAME>


EXAMPLE: DEALLOCATE C1

@@FETCH_STATUS
===============
=> IT IS A SYSTEM VARIABLE THAT TELLS STATUS OF FETCH
=> USING THIS WE CAN FIND THE WHETHER THE FETCH STATEMENT IS SUCCESFULL OR NOT
=> @@FETCH_STATUS RETURNS===>
0 => FETCH IS SUCCESFULL
-1=> FETCH IS UNSUCCESFULL

==============================================================================
=> WRITE A PROGRAM TO PRINT ALL EMPLOYEES NAMES AND SALARIES FROM EMP1 TABLE USING
CURSOR

DECLARE C1 CURSOR FOR SELECT ENAME, SAL FROM EMP1


DECLARE @NAME VARCHAR(20), @SALARY MONEY

OPEN C1

FETCH NEXT FROM C1 INTO @NAME,@SALARY

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @NAME + ' ' + CAST(@SALARY AS VARCHAR)
FETCH NEXT FROM C1 INTO @NAME,@SALARY
END

CLOSE C1
DEALLOCATE C1

=====================================================
WRITE A PROGRAM TO BACK UP SELECTED DATABASES

DECLARE @DBNAME VARCHAR(20)


DECLARE @QPATH VARCHAR(250)

DECLARE DBLIST CURSOR FOR


SELECT [NAME] FROM SYSDATABASES
WHERE NAME IN ('NARAYAN','BookStore','TSQLV4','SAMS')

OPEN DBLIST

FETCH NEXT FROM DBLIST INTO @DBNAME

WHILE @@FETCH_STATUS = 0
BEGIN
SET @QPATH = 'C:\dbbackup\'+ @DBNAME +'.BAK'
BACKUP DATABASE @DBNAME TO DISK = @QPATH
FETCH NEXT FROM DBLIST INTO @DBNAME
END
CLOSE DBLIST
DEALLOCATE DBLIST

=====
BACKING UP DATABASE OTHER THEN SYSTEM DATABASES
=============================================
DECLARE @DBNAME VARCHAR(20)
DECLARE @QPATH VARCHAR(250)

DECLARE DBLIST CURSOR FOR


SELECT [NAME] FROM SYSDATABASES
WHERE NAME NOT IN ('MASTER','TEMPDB','MODEL','MSDB')

OPEN DBLIST

FETCH NEXT FROM DBLIST INTO @DBNAME

WHILE @@FETCH_STATUS = 0
BEGIN
SET @QPATH = 'C:\dbbackup\'+ @DBNAME +'.BAK'
BACKUP DATABASE @DBNAME TO DISK = @QPATH
FETCH NEXT FROM DBLIST INTO @DBNAME
END
CLOSE DBLIST
DEALLOCATE DBLIST
===============================================================
15-06-2022

WRITE A PROGRAM USING CURSOR TO INCREMENT THE SALARIES BASED ON PCT IN RAISE_SALARY
TABLE.

RAISE_SALARY
========
EMPNO PCT
100 15
101 20
102 12
103 15

DECLARE C1 CURSOR FOR SELECT EMPNO, PCT FROM RAISE_SALARY


DECLARE @ENO INT, @PCT INT
OPEN C1
FETCH NEXT FROM C1 INTO @ENO,@PCT
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE EMP1 SET SAL = SAL + (SAL* @PCT/100) WHERE EMPNO = @ENO
FETCH NEXT FROM C1 INTO @ENO,@PCT
END
CLOSE C1
DEALLOCATE C1
===================================================================
STUDENT

SNO SNAME S1 S2 S3
1 A 80 90 70
2 B 30 60 50
3 C 45 73 65

RESULT
SNO STOT SAVG SRES

=> WRITE A PROG TO CALCULATE ALL THE STUDENTS TOTAL, AVG, RESULT AND INSERT THE
RECORDS
INTO RESULT TABLE..PASSING MARKS IN ANY SUBJECT SHOULD BE MINIMUM 35. A STUDENT
WILL BE CONSIDERED AS PASS ONLY WHEN HE/SHE IS PASS IN ALL THE SUBJECTS

CREATE TABLE STUDENT_S (SNO INT,


SNAME VARCHAR(10),
S1 INT,
S2 INT,
S3 INT);
INSERT INTO STUDENT_S VALUES(1,'A',80,90,70),
(2,'B',30,60,50),
(3,'C',45,73,65);

CREATE TABLE RESULT (SNO INT,


STOT INT,
SAVG INT,
SRES VARCHAR(10)
);

DECLARE C1 CURSOR FOR SELECT SNO,S1,S2,S3 FROM STUDENT_S


DECLARE @SNO INT, @S1 INT, @S2 INT, @S3 INT, @TOT 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 @TOT = @S1 + @S2 + @S3
SET @AVG = @TOT/3
IF @S1>=35 AND @S2>=35 AND @S3>=35
SET @RES = 'PASS'
ELSE
SET @RES = 'FAIL'
INSERT INTO RESULT VALUES(@SNO,@TOT,@AVG,@RES)
FETCH NEXT FROM C1 INTO @SNO, @S1, @S2,@S3
END
CLOSE C1
DEALLOCATE C1;
===================================================================================
SCROLLABLE CURSOR
=================
=> BY DEFAULT CURSOR IS CALLED FORWARD ONLY CURSORAND IT SUPPORTS FORWARD NAVIGATION
=> IF CURSOR IS DECLARED WITH SCROLL THEN IT IS CALLED SCROLLABLE CURSOR AND
IT SUPPORTS BOTH FORWARD AND BACKWARD NAVIGATION

=> FORWARD ONLY CURSOR SUPPORTS ONLY FETCH NEXT STATEMENT BUT SCROLLABLE CURSOR
SUPPORTS FOLLOWING FETCH STATEMENTS

FETCH FIRST => FETCHES FIRST RECORD


FETCH NEXT => FETCHES NEXT RECORD
FETCH PRIOR => FETCHES PREVIOUS RECORD
FETCH LAST => FETCHES LAST RECORD
FETCH ABSOLUTE N => FETCHES NTH RECORD FROM 1ST RECORD
FETCH RELATIVE N => FETCHES NTH RECORDS FROM CURRENT RECORD

DECLARE C1 CURSOR SCROLL FOR SELECT ENAME FROM EMP1


DECLARE @NAME VARCHAR(20)
OPEN C1
FETCH FIRST FROM C1 INTO @NAME
PRINT @NAME
FETCH ABSOLUTE 5 FROM C1 INTO @NAME
PRINT @NAME
FETCH RELATIVE 5 FROM C1 INTO @NAME
PRINT @NAME
FETCH LAST FROM C1 INTO @NAME
PRINT @NAME
FETCH PRIOR FROM C1 INTO @NAME
PRINT @NAME

===================================
WRITE A PROG TO PRINT EVERY 5TH RECORD
===========================================
EXCEPTION HANDLING----

=>EXCEPTIONS ARE THE RUNTIME ERRORS


=> WE CAN HANDLE THESE EXCEPTIONS OR RUNTIME ERRORS IN SQL SERVER
=> TO HANDLE THESE RUN TIME ERRORS WE USE TRY CATCH BLOCK

BEGIN TRY
STATEMENT1 ---THOSE STATEMENTS WHICH MAY RAISE EXCEPTION OR CAUSE RUNTIME ERRORS
STATEMENT2
STATEMENT3
END TRY
BEGIN CATCH
STATEMENTS ---WHICH HANDLES EXCEPTION --STATEMENTS WHICH YOU WANT TO EXECUTE IF
EXCEPTION
IS RAISED
END CATCH

=> IN TRY BLOCK IF STATEMENTS CAUSES RUNTIME ERROR THEN CONTROL IS TRANSFERED TO CATCH
BLOCK AND EXECUTES THE STATEMENTS IN CATCH BLOCK

DECLARE @A INT, @B INT, @C INT


SET @A = 100
SET @B = 0
BEGIN TRY
PRINT 'TRY BLOCK'
SET @C = @A/@B
PRINT @C
END TRY
BEGIN CATCH
PRINT 'ERROR'
PRINT 'I THINK UR DENOMINATOR IS ZERO'
END CATCH

OUTPUT:
TRY BLOCK
ERROR
I THINK UR DENOMINATOR IS ZERO
=======================================
DECLARE @A INT, @B INT, @C INT
SET @A = 100
SET @B = 10
BEGIN TRY
PRINT 'TRY BLOCK'
SET @C = @A/@B
PRINT @C
END TRY
BEGIN CATCH
PRINT 'ERROR'
PRINT 'I THINK UR DENOMINATOR IS ZERO'
END CATCH

OUTPUT:
TRY BLOCK
10
=====================================================
NOTE ---> SELECT * FROM SYSMESSAGES
TO SEE THE ERROR NUMBERS

PRINT CUSTOM ERROR MESSAGE AS PER OUR EXCEPTION


=============================================
DECLARE @A INT, @B INT, @C INT
SET @A = 100
SET @B = 0
BEGIN TRY
SET @C = @A/@B
PRINT @C
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 8134
PRINT 'DIVISOR CAN NOT BE ZERO'
END CATCH

OUTPUT:
DIVISOR CAN NOT BE ZERO

=========================================================
CREATE TABLE EMP250
(EMPNO INT PRIMARY KEY,
ENAME VARCHAR(10) NOT NULL,
SAL MONEY CHECK(SAL >= 3000)
);

DECLARE @ENO INT, @NAME VARCHAR(10), @SAL MONEY


BEGIN TRY
SET @ENO = 102
SET @NAME = 'A'
SET @SAL = 1000
INSERT INTO EMP250 VALUES(@ENO,@NAME,@SAL)
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 2627
PRINT 'ENO SHOULD NOT BE DUPLICATE'
ELSE IF ERROR_NUMBER() = 515
PRINT 'NAME CAN NOT BE NULL'
ELSE IF ERROR_NUMBER() = 547
PRINT 'SAL SHOULD BE MORE THAN 3000'
END CATCH

============================================================
DECLARE @A INT, @B INT, @C INT
SET @A = 100
SET @B = 0
BEGIN TRY
SET @C = @A/@B
PRINT @C
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
PRINT 'I THINK UR DENOMINATOR IS ZERO'
END CATCH
======================================================================================
16-06-2022

DECLARE @A INT, @B INT, @C INT


SET @A = 100
SET @B = 0
BEGIN TRY
SET @C = @A/@B
PRINT @C
END TRY
BEGIN CATCH
PRINT @@ERROR
PRINT ERROR_NUMBER()
PRINT ERROR_LINE()
PRINT 'I THINK UR DENOMINATOR IS ZERO'
END CATCH

OUTPUT:
======
8134
8134
5
I THINK UR DENOMINATOR IS ZERO

USER DEFINED ERRORS/EXCEPTIONS:


==============================
EXCEPTION RAISED BY USER ARE CALLED USER DEFINED EXCEPTION OR ERRORS
USER DEFINED EXCEPTIONS CAN BE RAISED BY USER BY USING
RAISERROR(ERROR MSG, SEVERITY LEVEL, STATE)

SEVERITY LEVEL --- 0-24

=> WRITE A PROGRAM TO INPUT EMPNO AND INCREMENT SALARY BY SPECIFIC AMOUNT BUT
ON SUNDAY UPDATES ARE NOT ALLOWED

DECLARE @ENO INT, @AMT MONEY


SET @ENO = 110
SET @AMT = 1000

IF DATENAME(DW,GETDATE()) = 'SUNDAY'
RAISERROR('ON SUNDAYS UPDATES ARE NOT ALLOWED', 15,1)
ELSE
UPDATE EMP1 SET SAL = SAL + @AMT WHERE EMPNO = @ENO
==========================================================================

STORED PROCEDURES
==================
=> IT IS A COLLECTION OF ONE OR MORE T-SQL STATEMENTS SAVED IN DATABASE FOR FUTURE USE

1 --VERIFY UR ACCOUNT NUMBER -SQLSTATEMENT


2. --- SELECT KIND OF TRANSACTION -SQL STATEMENT
3...FOR WITHDRAWL --- CHECK UR BALANCE --SQL STATEMENT
4. UPDATE UR ACCOUNT DETAILS -SQL STATEMENT

CHECK UR STOCK

UPDATE UR STOCK ----

ENSURE UR PRODUCT IS RESERVED

EXECUTE P1 3245

def add(a,b):
return a+b

add(3,4)---7
=============================================================================
17-6-2022

STORED PROCEDURES---
=================
=> A STORED PROCEDURE IS AN EXECUTABLE DATABASE OBJECT WHICH CONTAINS ONE OR MORE
SQL STATEMENTS.

TASK --- OPEN THE LOCK---

1. TAKE A KEY --- 2. INSERT THE KEY IN LOCK ---3. ROTATE THE KEY IN PROEPER DIRECTION

PROCEDURE : A SEQUENCE OF INSTRUCTIONS USED TO COMPLETE A TASK

TASK :

SEQUENCE OF INSTRUNCTIONS ------ SQL STATEMENTS


SQL
SQL
SQL
=> WITH IN STORED PROCEDURE--WE CAN DML , DDL, VIEWS, STORED PROCEDURES.....

=> THESE PROGRAMS ARE STORED IN THE DATABASE THAT'S WHY THEY ARE KNOWN AS STORED
PROCEDURE

ADVANTAGES:
===========

1.REUSABILITY :
===========
=>AS STORED PROCEDURES ARE SAVED IN DB THEY CAN BE REUSED BY USER OR AN
APPLICATION PROGRAM CONNECTED TO DB.

2.SECURITY
==========
BECAUSE STORED PROC ARE STORED IN DB SO ONLY AUTHORIZED PERSON/APPLICATION CAN EXECUTE
THESE

3. CAN BE CALLED FROM FRONT END APPLICATIONS:


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

STORED PROCEDURES CAN BE CALLED FROM FRONT END APPLICATIONS LIKE JAVA, .NET..

WEBSITE ---CLICK ON MOBILE

APPLICATION PROGRAM --- PARAMETER IS CAPTURED BY APPL PROGRAM --"MOBILE"

EXECUTE SPSTOCK "MOBILE","VIVO"

CREATE PROCEDURE SPSTOCK


@CATEGORY VARCHAR(20)
@BRAND VARCHAR(10)
AS
SELECT * FROM STOCK WHERE CATEGORY = @CATEGORY

4. IMPROVES PERFORMANCE
============================
FIRST TIME STORED PROC WILL BE EXECUTED, EACH SQL STATEMENT WILL BE COMPILED
AND EXECUTED TO CREATE AN EXECUTION PLAN. THEN THE PROCEDURE IS STORED IN COMPILED
FORM WITH IN THE DATABASE.

FOR EACH SUBSEQUENT EXECUTION, THE ALREADY COMPILED SQL STATEMENTS ARE EXECUTED.

FIRST TIME EXECUTION OF STORED--- TWO STEPS WILL HAPPEN

1.COMPILATION
2.EXECUTION

=> THEN THE PROCEDURE IS STORED IN COMPILED FORM WITH IN THE DATABASE.

SUBSEQUENT EXECUTION ==>

PRECOMPILED CODE WILL BE SENT FOR EXECUTION

SYNTAX:

=======

CREATE PROC|PROCEDURE <PNAME>


[PARAMETER DECLARATION]
[WITH [RECOMPILE] [,ENCRYPTION] [,EXECUTE_AS_CLAUSE]
AS
STATEMENTS
PARAMETERS:
=>PARAMTERS ARE USED TO PASS VALUES FROM CALLING PROGRAMMING TO STORED PROC OR FROM
STORED PROC TO CALLING PROGRAM

=> PARAMETERS ARE OF TWO TYPES:


1. INPUT PARAMETER
2. OUTPUT PARAMETER

INPUT PARAMETER: USED TO PASS VALUES FROM CALLING PROGRAM TO STORED PROC.
IT ALWAYS RECEIVES THE VALUE
IT IS DEFAULT
EXAMPLE : @CATEGORY VARCHAR(20)

OUTPUT PARAMETER: USED TO PASS VALUES FROM STORED PROC TO CALLING PROGRAM
IT RETURNS THE VALUE OR SENDS THE VALUE
EXAMPLE : @SAL MONEY OUTPUT

[RECOMPILE] ----> IT HAS TO BE COMPILED EACH TIME IT RUNS.

[ENCRYPTION]----> PREVENTS USER FROM VIEWING CODE

[,EXECUTE_AS_CLAUSE]----> ALLOWS USER TO EXECUTE SP WITH PERMISSIONS SPECIFIED BY


EXECUTE
AS CLAUSE

===================================================================
CREATE A STORED PROCEDURE WHICH DISPLAYS INFORMATION ABOUT DEPTNO 30 IN EMP1

CREATE PROC SPEMP1_1


AS
SELECT * FROM EMP1 WHERE DEPTNO = 30;

EXECUTION OF STORED PROCEDURE:


============================
EXEC | EXECUTE PROCEDURENAME

EXEC SPEMP1_1

===========================================================
CREATE A STORED PROCEDURE WHICH TAKES FROM USER EMPNO AND DISPLAY HIS DETAILS EMPNO,
NAME,SALARY

CREATE PROC SPEMP1_2


@ENO INT
AS
SELECT EMPNO, ENAME, SAL FROM EMP1 WHERE EMPNO = @ENO

========================================
EXECUTION OF STORE PROC

EXEC SPEMP1_2 104


====================================================================================
23-06-2022

=>TO MAKE THE CHANGES IN EXISTING STORED PROCEDURE WE CAN USE ALTER COMMAND
=> THE SYNTAX OF CREATING STORED PROC AND ALTERING STORED PROC IS VERY MUCH SIMILAR
WITH ONLY DIFFERENCE IS OF THE WORD CREATE/ALTER

ALTER PROC SPEMP1_1


AS
SELECT * FROM EMP1 WHERE DEPTNO = 20;
=============================================

ALTER PROC SPEMP1_1


@DEPTNO INT,
@JOB VARCHAR(20)
AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;

SUPPLYING PARAMETER VALUES BY POSITION: IN THIS CASE ORDER MATTERS:

EXEC SPEMP1_1 30, 'SALESMAN'


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

SUPPLYING PARAMTERS VALUES BY NAME: IN THIS CASE ORDER OF PARAMETERS DOES NOT MATTER
WHILE CALLING THE STORED PROC

EXEC SPEMP1_1 @JOB='SALESMAN', @DEPTNO = 30

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

MAKING ARGUMENTS/ PARAMETER OPTIONAL


===================================
WE CAN MAKE PARAMETERS TO BE OPTIONAL PARAMETERS BY ASSIGNING SOME DEFAULT VALUES.
SO IF USER DOES NOT SUPPLY THOSE ARGUMENTS WHILE EXECUTING/CALLING STORED PROC THEN
THESE DEFAULT VALUES WILL BE USED.

=> BUT IF USER SUPPLIES THE VALUES OF THESE PARAMETERS THEN THE DEFAULT VALUES WILL BE
OVER WRITTEN WHICH MEANS THE DEFAULT VALUE WILL BE REPLACED BY THE VALUES THE CALLER
HAS
SUPPLIED.

ALTER PROC SPEMP1_1


@DEPTNO INT = 10,
@JOB VARCHAR(20) = 'SALESMAN'
AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;
====================================
EXEC SPEMP1_1 ----> WILL USE DEFAULT VALUES

=======================================
EXEC SPEMP1_1 @DEPTNO = 30

THE DEFAULT VALUE OF @DEPTNO WILL BE OVERWRITTEN AND DEFAULT VALUES OF @JOB WILL BE
USED

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

HAVING SOME MANDATORY ARGUMENT AND SOME OPTIONAL ARGUMENTS


==============================
CREATE PROC SPEMP1_1
@DEPTNO INT, --MANADATORY
@JOB VARCHAR(20) = 'SALESMAN' --OPTIONAL
AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;

EXEC SPEMP1_1 30 ----

=> ITS A GOOD PRACTISE TO HAVE DEFAULT OR OPTIONAL ARGUMENTS AT LAST WHILE DECLARING
PARAMTERS....

CREATE PROC SPEMP1_1


@DEPTNO INT, -- MANDATORY
@MGR INT, --MANDATORY
@JOB VARCHAR(20) = 'SALESMAN', --OPTIONAL
@COMM MONEY = 500 --OPTIONAL
AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;

EXEC SPEMP1_1 10,1123-----

EXEC SPEMP1_1 @MGR = 1123, @DEPTNO = 10


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

GETTING THE CODE OF STORED PROCEDURE USING SYSTEM STORED PROCEDURE:

EXEC SP_HELPTEXT SPEMP1_1

WHERE SP_HELPTEXT IS SYSTEM STORED PROCEDURE AND SPEMP1_1 IS USER DEFINED STORED
PROCEDURE
AND SP_HELPTEXT CAN BE USED TO SEE THE CODE OF VIEW,STORED PROC, USER DEFINED
FUNCTIONS ETC
===========================================
ENCRYPTING THE EXISTING STORED PROCEDURE

ALTER PROC SPEMP1_1


@JOB VARCHAR(20) = 'SALESMAN', --OPTIONAL
@DEPTNO INT
WITH ENCRYPTION

AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;

=========================================
ENCRYPTING THE STORED PROCEDURE WHILE CREATING STORED PROC

CREATE PROC SPEMP1_1


@JOB VARCHAR(20) = 'SALESMAN', --OPTIONAL
@DEPTNO INT
WITH ENCRYPTION

AS
SELECT * FROM EMP1 WHERE DEPTNO = @DEPTNO AND JOB = @JOB;
======================================================================================
=========
24-06-2022

WE WANT TO PASS OR RETURN THE VALUE/VALUES TO CALLING PROGRAM


1. RETURN STATEMENT -- IT CAN RETURN ONLY SINGLE INTEGER VALUE
2. OUTPUT PARAMETER --- IT CAN RETURN MULTIPLE VALUES OF ANY DATA TYPE

1. RETURN STATEMENT:
BY DEFAULT WHEN WE EXECUTE A STORED PROCEDURE THEN IT RETURNS AN INTEGER VALUE AND
THIS
VALUE INDICATES EXECUTION STATUS OF STORED PROCEDURE. THE VALUE 0 INDICATES THE
PROCEDURE
IS COMPLETED SUCCESFULLY AND NON ZERO VALUE INDICATES AN ERROR.

=> TO USE THE RETURN VALUE IN THE CALLING PROGRAM, YOU MUST DECLARE A VARIABLE TO
STORE
ITS VALUE.
=> THE RETURN STATEMENT IMMEDIATELY EXITS THE PROCEDURE AND RETURNS AN OPTIONAL
INTEGER VALUE TO THE CALLING PROGRAM. IF YOU DONT SPECIFY A VALUE IN THIS STATEMENT
THE RETURN VALUE IS ZERO.

CREATE PROC SPEMP1_3


AS
SELECT * FROM EMP1 WHERE JOB = 'CLERK'

DECLARE @T INT
EXEC @T = SPEMP1_3
PRINT @T
===============================

=> RETURN THE EMPNO OF THE EMPLOYEE WHO IS CEO OF ORGANIZATION

CREATE PROC SPEMP1_4


AS
DECLARE @E INT
SELECT @E= EMPNO FROM EMP1 WHERE JOB = 'CEO'
RETURN @E

DECLARE @EMPNO INT


EXEC @EMPNO = SPEMP1_4
PRINT @EMPNO
============================================
2. OUTPUT PARAMETER: OUTPUT PARAMTERS STORE VALUES THAT ARE PASSED BACK TO THE CALLING
PROGRAM. WE IDENTIFY THE OUTPUT PARAMTERS BY OUTPUT KEYWORD AFTER THE PARAMETER NAME
AND DATA TYPE.

WHEN WE WANT TO RETURN SINGLE INTEGER VALUE--- BETTER TO GO WITH RETURN STATEMENT
BUT WHEN WE WANT TO RETURN MULTIPLE VALUES OR VALUES OF DIFFERENT DATA TYPES
THEN CHOOSE OUTPUT PARAMETER.

=> TO USE AN OUTPUT PARAMETER IN THE CALLING PROGRAM, YOU MUST


DECLARE A VARIABLE TO STORE ITS VALUE.

=> RETURN THE EMPNO OF THE EMPLOYEE WHO IS CEO OF ORGANIZATION

CREATE PROC SPEMP1_5


@DEPT INT OUTPUT
AS
SELECT @DEPT= EMPNO FROM EMP1 WHERE JOB = 'CEO'

DECLARE @DEPTNO INT


EXEC SPEMP1_5 @DEPTNO OUTPUT
print @DEPTNO
==================================

WE WANT TO TAKE JOB FROM CALLING PROGRAM AND RETURN CORRESPODING DEPTNO TO THE CALLING
PROGRAM
CREATE PROC SPEMP1_6
@DEPT INT OUTPUT,
@JOB VARCHAR(20)
AS
SELECT @DEPT = DEPTNO FROM EMP1 WHERE JOB = @JOB

EXECUTION USING POSITION:

DECLARE @D INT
EXEC SPEMP1_6 @D OUTPUT, 'CEO'
SELECT @D
PRINT @D

EXECUTION USING NAME:

DECLARE @D INT
EXEC SPEMP1_6 @JOB = 'CEO',@DEPT = @D OUTPUT
SELECT @D
=============================================================================

ARCHIVED TABLES:

CREATE A STORED PROCEDURE TO DELETE RECORD FROM A TABLE AND SAVE THE DELETED RECORDS
IN ANOTHER TABLE SO THAT ANY TIME WRONG DATA IS DELETED WE CAN RECOVER.
1. DELETE THE RECORD A FROM A TABLE 1
2. INSERT THE DELETED RECORD INTO TABLE 2

SELECT * INTO ARCHIVE FROM EMP1 WHERE 1=2

CREATE PROC SPDEL_EMP1


@ENO INT
AS
INSERT INTO ARCHIVE SELECT * FROM EMP1 WHERE EMPNO = @ENO
DELETE FROM EMP1 WHERE EMPNO = @ENO

EXEC SPDEL_EMP1 109

=======================================
CREATE A PROCEDURE TO INCREMENT SPECIFIC EMPLOYEE SALARY BY A SPECIFIC AMOUNT
IN EMP1 TABLE

CREATE PROC SP_INC


@ENO INT,
@AMT MONEY
AS
UPDATE EMP1 SET SAL = SAL + @AMT WHERE EMPNO = @ENO

EXEC SP_INC 107,500

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

CREATE A PROCEDURE TO INCREMENT SPECIFIC EMPLOYEE SALARY BY A SPECIFIC AMOUNT


IN EMP1 TABLE AND SEND THE UPDATED SAL TO CALLING PROGRAM

CREATE PROC SP_INC1


@ENO INT,
@AMT MONEY,
@SAL MONEY OUTPUT
AS
UPDATE EMP1 SET SAL = SAL + @AMT WHERE EMPNO = @ENO
SELECT @SAL = SAL FROM EMP1 WHERE EMPNO = @ENO

DECLARE @S MONEY
EXEC SP_INC1 107,1000,@S OUTPUT
PRINT @S
=============================================================================
25-06-2022
CREATE A PROCEDURE FOR MONEY WITHDRAWL

ACCOUNTS
ACN ACT BAL
100 S 10000
101 S 20000
102 S 5000

CREATE PROC DEBIT


@ACNO INT,
@AMT MONEY,
@NEWBAL MONEY OUTPUT
AS
DECLARE @BAL MONEY, @ERRMSG VARCHAR(100)
BEGIN TRY
IF NOT EXISTS(SELECT * FROM ACCOUNTS WHERE ACN = @ACNO)
RAISERROR('ACCOUNT DOES NOT EXISTS', 15,1)
SELECT @BAL = BAL FROM ACCOUNTS WHERE ACN = @ACNO
IF @AMT>@BAL
RAISERROR('INSUFFICIENT BALANCE',15,1)
UPDATE ACCOUNTS SET BAL = BAL - @AMT WHERE ACN = @ACNO
SELECT @NEWBAL = BAL FROM ACCOUNTS WHERE ACN = @ACNO
END TRY
BEGIN CATCH
SET @ERRMSG = ERROR_MESSAGE()
RAISERROR(@ERRMSG,15,1)
END CATCH

=> WE CAN CREATE STORED PROCEDURE WHICH IS REFERENCING SOME TABLES EVEN WITHOUT
EXISTENCE
OF TABLES IN DB. BECAUSE IT USES DEFERRED NAME RESOLUTION.

CREATE TABLE ACCOUNTS


(ACN INT,
ACT CHAR(1),
BAL MONEY);

INSERT INTO ACCOUNTS VALUES(100,'S',10000),(101,'S',20000),(102,'S',5000)

DECLARE @B MONEY
EXEC DEBIT 100, 1000,@B OUTPUT
PRINT @B

DROP THE PROCEDURE:


------------------------
DROP PROCEDURE PROCEDURENAME
DROP PROC SPEMP1

============================================================
TEMPORARY STORED PROCEDURES

=>THEY ARE SAVED IN TEMPDB

LOCAL STORED PROC -- WILL HAVE NAME STARTING WITH #


GLOBAL STORED PROC -- WILL HAVE NAMES STARRTING WITH ##

LOCAL STORED PROC


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

CREATE PROC #SPTEMP1


@ENO INT
AS
SELECT EMPNO, ENAME, SAL FROM EMP1 WHERE EMPNO = @ENO
GO

GLOBAL STORED PROC


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

CREATE PROC ##SPTEMP2


@ENO INT
AS
SELECT EMPNO, ENAME, SAL FROM EMP1 WHERE EMPNO = @ENO
GO
=============================================================
USER DEFINED FUNCTIONS
-----------------------

UDF IS AN EXECUTABLE DATABASE OBJECT THAT CONTAINS SQL STATEMENTS


THERE ARE TWO KIND OF FUNCTIONS:
SQL SERVER BUILT IN FUNCTIONS :DATEPART, DATEDIFF ETC
USER DEFINED FUNCTIONS: FUNCTIONS CREATED BY THE USER AND THESE ARE SAVED INSIDE THE
DATABASE WHICH CAN REUSE WHEN REQUIRED
USER DEFINED FUNCTIONS ARE OF TWO TYPES:
1.SCALAR VALUED FUNCTIONS(SVF) - FUNCTION RETURNING A SCALAR VALUE
2.TABLE VALUED FUNCTIONS(TVF) -- FUNCTION RETURNING A TABLE
27-06-2022
==========
=> A FUNCTION ALWAYS RETURNS A VALUE
=> FUNCTION CAN NOT HAVE OUTPUT PARAMETER
=> WE HAVE TO USE RETURN STATEMENT TO RETURN VALUE TO CALLING PROGRAM
=> PARAMETERS PASSING BY NAME IS NOT ALLOWED IN FUNCTION SO ONLY PARAMTER PASSING BY
POSITION CAN BE USED.
=> UNLIKE STORED PROCEDURE , AN UDF CAN NOT MAKE PERMANENT CHANGES TO THE OBJECTS IN
THE
DATABASE. FOR EXAMPLE IT CAN NOT ISSUE INSERT, UPDATE AND DELETE STATEMENTS AGAINST
TABLES OR VIEWS IN THE DATABASE
=> ALTHOUGH A TABLE VARIABLE CAN BE CREATED AND WE CAN ISSUE INSERT, UPDATE , DELETE
AGAINST
TABLE VARIABLE.
=> UNLIKE OTHER DATABASE OBJECTS WE MUST SPECIFY THE NAME OF THE SCHEMA WHEN INVOKING
AN UDF. SELECT DBO.FN_SUM(A,B)--MANDATORY FOR SCALAR UDF.

1. SCALAR UDF:
===============
IT RETURNS A SCALAR VALUE

SYNTAX:
=======
CREATE FUNCTION [SCHEMANAME.]FUNCTIONNAME
([PARAMETERNAME DATA_TYPE [=DEFAULT],......)
RETURNS DATA_TYPE
[WITH [ENCRYPTION] [,SCHEMABINDING] [,EXECUTE_AS_CLAUSE]]
AS
BEGIN
[SQL STATEMENTS]
RETURN SCALAR_EXPRESSION
END

ENCRYPTION --- PREVENTS USERS FROM VIEWING THE CODE IN THE FUNCTION
SCHEMABINDING ---BINDS THE FUNCTION TO THE DATABASE SCHEMA. THIS PREVENTS YOU FROM
DROPPING
OR ALTERING TABLES OR VIEWS THAT ARE USED BY THE FUNCTION
EXECUTE_AS_CLAUSE -- THIS OPTION SPECIFIES THE SECURITY CONTEXT UNDER WHICH THE
FUNCTION
IS EXECUTED
===================================================================
CREATE A UDF WHICH ACCEPTS TWO SCALAR INTEGER INPUT AND ONE CHAR INPUT WHICH SPECIFIES
THE
OPERATION TO BE PERFORMED. AND RETURNS THE RESULT OF THE OPERATION
ADDITION(A,B,OPERATION) --->
IF OPERATION = '+' ----> RETURN A + B
IF OPERATION = '-' ----> RETURN A - B
IF OPERATION = '*' ----> RETURN A * B

CREATE FUNCTION FN_CALC


(@a int, @b int, @c char(1))
RETURNS INT
AS
BEGIN
DECLARE @TOTAL INT
IF @C = '+'
SET @TOTAL = @A + @B
ELSE IF @C = '-'
SET @TOTAL = @A - @B
ELSE
SET @TOTAL = @A * @B
RETURN @TOTAL
END

=> invoking ----> select dbo.fn_calc(20,10,'*') as result


=> invoking ---->
select ename, sal, comm, dbo.fn_calc(sal,coalesce(comm,0),'+') as total from emp1
=> invoking --->
select ename, sal, deptno from emp1 where deptno = dbo.fn_calc(20,10,'+') is
equivalent to
select ename, sal, deptno from emp1 where deptno = 30
=> invoking --->
update emp1
set deptno = dbo.fn_calc(20,0,'+') where empno = 110
=> invoking--->
insert into emp1 values(111,
'prav','clerk',7782,getdate(),dbo.fn_calc(4000,1000,'+'),null,10,null)

2. TABLE VALUED FUNCTIONS--- THEY RETURN TABLE

1. INLINE TABLE VALUED FUNCTION : IT RETURNS A TABLE BASED ON SINGLE SELECT STATEMENT
=================================
IN SQL SERVER WE CAN USE THESE FUNCTIONS TO ACHIVE THE FUNCTIONALITY OF PARAMETERIZED
VIEWS
THESE ARE LIKE VIEWS BUT WITH ABILITY TO ACCEPT THE PARAMETER.

IN INLINE TABLE -VALUED FUNCTION THE BODY OF THE FUNCTION WILL HAVE ONLY
A SINGLE SELECT STATEMENT.

CREATE FUNCTION [SCHEMANAME.]FUNCTIONNAME


([PARAMETERNAME DATA_TYPE [=DEFAULT],......)
RETURNS TABLE
[WITH [ENCRYPTION] [,SCHEMABINDING]]
AS
RETURN (SELECT STATEMENT)

-- CREATE A FUNCTION THAT RETURNS STUDENT NAME, DOB BY GENDER


CREATE FUNCTION FN_STUDENT_DETAILSBYGENDER
(
@GENDER VARCHAR(10)
)
RETURNS TABLE
AS
RETURN (SELECT [NAME],DOB FROM STUDENT WHERE GENDER = @GENDER);

=> CHECK THE RESULT


SELECT * FROM DBO.FN_STUDENT_DETAILSBYGENDER('MALE');
===============================================================

/*CREATE A FUNCTION WHICH DISPLAYS EMPID , EMPNAME, DOB, DEPARTNAME


ACCORDING TO GENDER*/
CREATE FUNCTION FN_EMPLOYEE_GENDER
( @GENDER VARCHAR(10) )
RETURNS TABLE
AS
RETURN(
SELECT e.ID,e.[NAME],e.DOB,d.DepartmentName from
Employee as e
inner join
department as d
on e.DeptID = d.ID
where e.Gender = @GENDER)

select * from [dbo].[FN_EMPLOYEE_GENDER]('MALE');

FUNCTION WITH DEFAULT PARAMETER


============================
CREATE FUNCTION FN_EMPLOYEE_G
( @GENDER VARCHAR(10) = 'FEMALE')
RETURNS TABLE
AS
RETURN(
SELECT e.ID,e.[NAME],e.DOB,d.DepartmentName from
Employee as e
inner join
department as d
on e.DeptID = d.ID
where e.Gender = @GENDER)

select * from [dbo].[FN_EMPLOYEE_G](DEFAULT);

==========================================================
CREATE A FUNCTION WHICH RETURNS DETAILS OF EMPLOYEE AS PER JOB AND DEPTNO SUPPLIED

CREATE FUNCTION FN_EMP1_DET


(@J VARCHAR(10),@D INT)
RETURNS TABLE
AS
RETURN (SELECT * FROM EMP1 WHERE JOB = @J AND DEPTNO = @D)

SELECT * FROM DBO.FN_EMP1_DET('SALESMAN',30)

==============================================================
28-06-2022
2. MULTISTATEMENT TABLE VALUED FUNCTION

RETURNS A TABLE THAT IS BASED ON MULTIPLE STATEMENTS

SYNTAX:

CREATE FUNCTION [SCHEMANAME.]FUNCTIONNAME


([@PARAMETER DATATYPE [=DEFAULT][,.....])
RETURNS @RETURN_VARIABLE TABLE (C1 DATATYPE, C2 DATATYPE.....)
[WITH [ENCRYPTION] [,SCHEMABINDING] [,EXECUTE_AS_CLAUSE]]
AS
BEGIN
SQL STATEMENTS
RETURN
END
=====================================

CREATE A FUNCTION WHICH RETURNS A TABLE HAVING EMPNO AND EMPNAME FROM EMP1
TABLE CORRESPONDING TO DEPARTMENT NUMBER SUPPLIED BY USER.

INLINE TABLE VALUED FUNCTION


============================
CREATE FUNCTION FN_NR
(@D INT)
RETURNS TABLE
AS
RETURN (SELECT EMPNO, ENAME FROM EMP1 WHERE DEPTNO = @D)
=======================
INVOKING UDF ----> SELECT * FROM DBO.FN_NR(30)
==========================
MULTISTATEMENT TABLE VALUED FUNCTION

CREATE FUNCTION FN_MS


(@D INT)
RETURNS @T TABLE (ENO INT, ENME VARCHAR(20))
AS
BEGIN
INSERT INTO @T SELECT EMPNO, ENAME FROM EMP1 WHERE DEPTNO = @D
RETURN
END
====================
INVOKING UDF---->SELECT * FROM DBO.FN_MS(30)
==================================================================
IN MY DATABASE I HAVE TWO TABLES STAFF_NY AND CUSTOMER_NY...I WANT TO RETURN
COMBINED DATA FROM BOTH THE TABLES TO THE CALLING PROGRAM..ALSO IT IS MENTIONED
THAT STAFF_NY AND CUSTOMER_NY CONTAINS SAME TABLE STRUCTURE. JUST THAT
STAFF TABLES CONSISTS OF INFORMATION REGARDING STAFF AND CUSTOMER TABLE CONSISTS
OF INFORMATION REGARDING CUSTOMERS

CREATE FUNCTION FN_MERGED


()
RETURNS @T TABLE (FNAME VARCHAR(10), LNAME VARCHAR(10),
MOB BIGINT, LOC VARCHAR(10))
AS
BEGIN
INSERT INTO @T SELECT * FROM STAFF_NY
INSERT INTO @T SELECT * FROM CUSTOMERS_NY
RETURN
END

=====================
INVOKING FUNCTION ---> SELECT * FROM DBO.FN_MERGED()
==========================================================================

V.V.IMP FOR INTERVIEWS:


DIFFERENCE BETWEEN FUNCTIONS AND STORED PROCEDURES

FUNCTIONS STORED PROC


======================================================================================
======
1. FUNCTION MUST RETURN A SINGLE VALUE SP CAN RETURN ZERO, SINGLE OR MULTIPLE
VALUES
(WHICH MAY BE SCALAR OR A TABLE)

2. FOR EXECUTING OR CALLING THE FUNCTION SP CAN BE EXECUTED USING EXEC OR


EXECUTE
THE FUNCTION SHOULD BE A PART OF A SQL
STATEMENT

3. FUNCTION CAN HAVE ONLY INPUT PARAMETERS SP CAN HAVE BOTH INPUT AND OUTPUT
PARAMETERS

4. FUNCTION CAN NOT MAKE CHANGES IN DB OBJECTS SP CAN MAKE CHANGES IN DB OBJECTS

FUNCTON CAN NOT ISSUE INSERT, UPDATE, DELETE SP CAN ISSUE INSERT, UPDATE DELETED
AGAINST DB OBJECTS
STATEMENTS AGAINST TABLES OR VIEWS IN DB

5.FUNCTIONS DOES NOT SUPPORT TRY/CATCH BLOCKS SP SUPPORT TRY CATCH BLOCK

6. FUNCTION DOES NOT SUPPORT TRANSACTION MGMT SP SUPPORTS TRANSACTION MGMT

7. A PROCEDURE CAN NOT BE CALLED FROM UDF A FUNCTION CAN BE CALLED FROM A
PROCEDURE

8. FUNCTION DOES NOT SUPPORT DEFERRED NAME SP SUPPORTS DEFERRED NAME RESOULTION
RESOLUTION

====================================================
DROPPING A FUNCTION:

DROP FUNCTION [SCHEMANAME.]<FUNCTION NAME>

=> DROP FUNCTION DBO.FN_NR

DROP FUNCTION <FUNCTIONNAME>


=> DROP FUNCTION FN_2
==============================================
ALTER A FUNCTION--
SYNTAX IS SIMILAR TO THE CREATION OF FUNCTION..
INSTEAD OF CREATE USE ALTER..

ALTER FUNCTION [dbo].[FN_MERGED]


()
RETURNS @T TABLE (FNAME VARCHAR(10), LNAME VARCHAR(10),
MOB BIGINT, LOC VARCHAR(10))
AS
BEGIN
INSERT INTO @T SELECT * FROM STAFF_NY
INSERT INTO @T SELECT * FROM CUSTOMERS_NY
RETURN
END
GO
======================================================

TABLE VARIABLE:
=================
THE TABLE VARIABLE IS A SPECIAL TYPE OF THE LOCAL VARIABLE WHICH HELPS TO STORE
THE DATA TEMPORARILY SIMILAR TO TEMP TABLES IN SQL SERVER.

DECLARE @TABLE_VAR TABLE (COL1 DATA TYPE, COL2 DATA TYPE....)

=> WE CAN INSERT, UPDATE, DELETE DATA INSIDE TABLE VARIABLE.


=> ALTER, TRUNCATE DOES NOT WORK ON TABLE VARIABLE BUT THEY WORK ON TEMP TABLES
=> UNLIKE TEMP TABLES THE TABLE VARIABLE IS ACCESIBLE WITH IN THE CURRENT BATCH
=>TABLE VARIABLES ARE USEFUL WHEN DEALING SMALL AMOUNTS OF DATA OTHERWISE SQL SERVER
TEMP TABLE IS USEFUL WHEN DEALING WITH LARGE AMOUNT OF DATA

DECLARE @T TABLE (ENO INT, ENAME VARCHAR(20), DPT INT)


INSERT INTO @T SELECT EMPNO, ENAME, DEPTNO FROM EMP1 WHERE DEPTNO = 30
SELECT * FROM @T
================================================================================
29-06-2022

TRIGGERS:
=========
A TRIGGER IS A DATABASE OBJECT THAT IS "EXECUTED AUTOMATICALLY" WHEN AN EVENT OCCURS
IN DB.
A TRIGGER IS A SPECIAL TYPE OF STORED PROCEDURE THAT "AUTOMATICALLY EXECUTES" OR RUNS
WHEN
AN EVENT OCCURS IN DATABASE SERVER.

=> TRIGGERS ARE CREATED:


1. TO CONTROL DML/DDL
2. TO ENFORCE COMPLEX RULES AND VALIDATIONS
3. TO AUDIT TABLES

IN SQL SERVER WE HAVE 3 KIND OF TRIGGERS:


1.DML TRIGGERS
2.DDL TRIGGERS
3.LOGON TRIGGERS

1. DML TRIGGERS: IT RUNS/FIRES WHEN A USER TRIES TO MODIFY DATA THROUGH A DML EVENT
LIKE
INSERT, UPDATE, DELETE ON A TABLE/VIEW.

2.DDL TRIGGERS: IT RUNS/FIRES IN RESPONSE TO DDL EVENTS LIKE CREATE, ALTER , DROP AND
SOME STORED PROCEDURES THAT PERFORMS DDL

3.LOGON TRIGGERS: IT FIRES/RUNS IN RESPONSE TO THE LOGON EVENT THAT IS RAISED WHEN A
USER SESSION IS ESTABLISHED.

DML TRIGGERS:
-----------
IT RUNS/FIRES WHEN A USER TRIES TO MODIFY DATA THROUGH A DML EVENT LIKE
INSERT, UPDATE, DELETE ON A TABLE/VIEW. UPDATE EMP1

CREATE TRIGGER <TRIGGERNAME>


ON {TABLENAME|VIEWNAME}
[WITH [ENCRYPTION] [,] [EXECUTE_AS_CLAUSE]]
{FOR|AFTER|INSTEAD OF} [INSERT] [,] [UPDATE] [,] [DELETE]
AS
SQL STATEMENTS

FOR OR AFTER TRIGGER -->


=========================
IT SPECIFIES THAT THE DML TRIGGER FIRES ONLY WHEN ALL OPERATIONS
SPECIFIED IN TRIGGER SQL STATEMENTS HAVE LANUCHED SUCCESFULLY.

=> IF THE TRIGGER IS AFTER TRIGGER THEN SQL SERVER EXECUTES THE TRIGGER AFTER
EXECUTING DML.

OBJECTIVE -- FIRE A TRIGGER WHEN EVER SOME BODY ISSUE A INSERT COMMAND ON EMP1 TABLE
STEPS:
1. CREATED A AFTER TRIGGER FOR INSERT COMMAND ON EMP1 -- TRIGGER SAVED IN DB

2. USER ISSUED A INSERT COMMAND ON EMP1


INSERT INTO EMP1 VALUES(10,'JACK....)

3. AS IT IS A AFTER TRIGGER SO FIRST DML COMMAND WILL BE EXECUTED I. .E


INSERT INTO EMP1 VALUES(10,'JACK....)
4. IF DML COMMAND GETS EXECUTED SUCCESFULLY THEN THE AFTER TRIGGER WILL FIRE
BUT IF THE DML COMMAND DOES NOT GET EXECUTED SUCCESFULLY THEN AFTER TRIGGER WILL
NOT FIRE.

INSTEAD OF TRIGGER:
===================
IF THE TRIGGER IS INSTEAD OF TRIGGER, THEN SQL SERVER EXECUTES THE TRIGGER INSTEAD OF
EXECUTING DML.

OBJECTIVE --- WHEN EVER SOME BODY ISSUE A INSERT COMMAND ON EMP1 THEN INSTEAD OF
COMMAND ISSUED WE WANT SOME OTHER COMMANDS TO BE EXECUTED

INSERT INTO EMP1 VALUES------------------S1,S2,S3,

NOTE-> THERE IS NO AFTER TRIGGER ON VIEWS


YOU CANT SPECIFY INSTEAD OF TRIGGER FOR DDL AND LOGON TRIGGERS

=> CREATE A TRIGGER TO NOT TO ALLOW ANY DML ON EMP1 TABLE ON SUNDAY

CREATE TRIGGER T1
ON EMP1
AFTER INSERT, UPDATE, DELETE
AS
IF DATENAME(DW,GETDATE()) = 'SUNDAY'
BEGIN
ROLLBACK TRANSACTION
RAISERROR('ON SUNDAY IT IS NOT ALLOWED',15,1)
END

SUPPOSE WE ISSUED THE BELOW COMMAND ON SUNDAY


DELETE FROM EMP1 WHERE EMPNO = 111 ----->

ON Msg 50000, Level 15, State 1, Procedure T1, Line 8 [Batch Start Line 11]
SUNDAY IT IS NOT ALLOWED
Msg 3609, Level 16, State 1, Line 12
The transaction ended in the trigger. The batch has been aborted.

HOW TO ALTER THE TRIGGER-->


ALTER TRIGGER T1
ON EMP1
AFTER INSERT, UPDATE, DELETE
AS
IF DATENAME(DW,GETDATE()) = 'WEDNESDAY'
BEGIN
ROLLBACK TRANSACTION
RAISERROR('ON WEDNESDAY IT IS NOT ALLOWED',15,1)
END
====================================================================
CREATE A TRIGGER TO NOT ALLOW DELETE ON EMP1 TABLES AS PER FOLLOWING RULE
MON-FRI -----10 AM - 4PM ALLOWED
SATURDAY ----10AM - 2PM ALLOWED
SUN --------------------------NOT ALLOWED
=================================================================
CREATE TRIGGER T2
ON EMP1
AFTER DELETE
AS
IF DATEPART(DW,GETDATE()) BETWEEN 2 AND 6
AND
DATEPART(HH,GETDATE()) NOT BETWEEN 10 AND 15
BEGIN
ROLLBACK TRANSACTION
RAISERROR('ONLY ALLOWED BETWEEN 10AM -4PM',15,1)
END
ELSE IF DATEPART(DW,GETDATE()) = 7
AND
DATEPART(HH,GETDATE()) NOT BETWEEN 10 AND 13
BEGIN
ROLLBACK TRANSACTION
RAISERROR('ONLY ALLOWED BETWEEN 10AM- 2PM', 15,1)
END
ELSE IF DATEPART(DW,GETDATE()) = 1
BEGIN
ROLLBACK
RAISERROR('ON SUNDAY NOT ALLOWED', 15,1)
END
=====================================================
30-06-2022
=> CREATE A TRIGGER NOT TO ALLOW UPDATE THE COLUM EMPNO

CREATE TABLE EMP510


(EMPNO INT,
ENAME VARCHAR(20),
GENDER VARCHAR(10));

INSERT INTO EMP510 VALUES (1, 'JOHN', 'MALE')


INSERT INTO EMP510 VALUES (2, 'SMITH', 'MALE')
INSERT INTO EMP510 VALUES (3, 'STACY', 'FEMALE')
INSERT INTO EMP510 VALUES (4, 'STELLA', 'FEMALE')

CREATE TRIGGER T3
ON EMP510
AFTER UPDATE
AS
IF UPDATE(EMPNO)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('EMPNO COLUMN CAN NOT BE UPDATED', 15,1)
END

UPDATE EMP510 SET EMPNO = 5 WHERE ENAME = 'JOHN'


MESSAGE==>
Msg 50000, Level 15, State 1, Procedure T3, Line 8 [Batch Start Line 12]
EMPNO COLUMN CAN NOT BE UPDATED
Msg 3609, Level 16, State 1, Line 13
The transaction ended in the trigger. The batch has been aborted.

===========================================================
MAGIC TABLES--- THESE ARE TEMPORARY LOGICAL TABLES WHICH ARE CREATED BY SQL SERVER
WHEN WE EXECUTE ANY DML COMMAND --INSERT, UPDATE , DELETE
1. INSERTED
2. DELETED

WITH IN THE TRIGGER, WE CAN REFER TO THESE TWO TABLES CREATED BY SQL SERVER.

1.INSERTED --> IT CONTAINS NEW ROWS FOR INSERT AND UPDATE OPERATIONS
2. DELETED---> CONTAINS ORIGINAL ROW FOR DELETE AND UPDATE OPERATIONS

INSERT COMMAND ---> NEW ROW ----> INSERTED TABLE


DELETE COMMAND-----> ORIGINAL ROW ----> DELETED TABLE
UPDATE COMMAND------>ORIGINAL ROW BEFORE UPDATION ---> DELETED TABLE
--------> NEW ROW AFTER UPDATION ------> INSERTED TABLE

==========================================================
CREATE A TRIGGER NOT TO ALLOW DECREMENT OF SALARY IN EMP511

CREATE TABLE EMP511


(EMPNO INT,
ENAME VARCHAR(10),
DEPT VARCHAR(10),
SAL MONEY);

INSERT INTO EMP511 VALUES(1, 'JOHN', 'IT',5000)


INSERT INTO EMP511 VALUES(2, 'SMITH', 'IT',7000)
INSERT INTO EMP511 VALUES(3, 'DAVY', 'HR',4000)
INSERT INTO EMP511 VALUES(4, 'JOHNB', 'FIN',3000)

CREATE TRIGGER T4
ON EMP511
AFTER UPDATE
AS
DECLARE @NEWSAL MONEY, @OLDSAL MONEY
SELECT @NEWSAL = SAL FROM INSERTED
SELECT @OLDSAL = SAL FROM DELETED
IF @NEWSAL < @OLDSAL
BEGIN
ROLLBACK TRANSACTION
RAISERROR('DECREMENT OF SALARY IS NOT ALLOWED', 15,1)
END

UPDATE EMP511 SET SAL = 3000 WHERE EMPNO = 1---> ERROR --Y IS NOT ALLOWED

==============================================================================
CREATE TRIGGER TO INSERT EMPLOYEE DETAILS INTO EMP_RESIGN TABLE WHENEVER EMPLOYEE
RESIGNS FROM ORGANIZATION.

EMP_RESIGN
CREATE TABLE EMP_RESIGN
(EMPNO INT,
ENAME VARCHAR(10),
DEPT VARCHAR(10),
SAL MONEY);

CREATE TRIGGER T5
ON EMP511
AFTER DELETE
AS
DECLARE @EMP INT, @ENME VARCHAR(10),@D VARCHAR(10),@SAL MONEY
SELECT @EMP = EMPNO,
@ENME = ENAME,
@D = DEPT,
@SAL = SAL FROM DELETED
INSERT INTO EMP_RESIGN VALUES(@EMP,@ENME,@D,@SAL)

DELETE FROM EMP511 WHERE EMPNO = 3===>


WHEN WE EXECUTE ABOVE COMMAND THEN --FOLLOWING THINGS WILL HAPPEND
1.CORRESPONDING ROW FROM EMP511 WILL BE DELETED
2. CORRESPONDING ROW WILL BE INSERTED INTO EMP_RESIGN TABLE

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

INSTEAD OF TRIGGER ----->

=>IT ALLOWS YOU TO SKIP AN INSERT , UPDATE , DELETE STATEMENT ON TABLES OR VIEWS AND
EXECUTE
OTHER STATEMENTS DEFINED IN THE TRIGGER.
=> ORIGINAL INSERT, UPDATE, DELETE OPERATION DOES NOT OCCUR AT ALL.
=>The INSTEAD OF triggers are the DML triggers that are fired instead of the
triggering event such as the INSERT, UPDATE or DELETE events.
So, when you fire any DML statements such as Insert, Update, and Delete,
then on behalf of the DML statement, the instead of trigger is going to execute.
In real-time applications, Instead Of Triggers are used to correctly update a
complex view.

CREATE TRIGGER T1000DEL


ON TBLEMPLOYEE
INSTEAD OF DELETE
AS
PRINT 'DELETE ON THIS TABLE IS NOT ALLOWED'

SET NOCOUNT ON
DELETE FROM TBLEMPLOYEE WHERE ID = 6
====================================================================================

CREATE TABLE TBLEMPLOYEE


(ID INT ,
NAME VARCHAR(20),
GENDER VARCHAR(10),
DEPARTMENTID INT);

INSERT INTO TBLEMPLOYEE VALUES ( 1, 'JOHN','MALE',3)


INSERT INTO TBLEMPLOYEE VALUES ( 2, 'MIKE','MALE',2)
INSERT INTO TBLEMPLOYEE VALUES ( 3, 'PAM','FEMALE',1)
INSERT INTO TBLEMPLOYEE VALUES ( 4, 'TODD','MALE',4)
INSERT INTO TBLEMPLOYEE VALUES ( 5, 'SARA','FEMALE',1)
INSERT INTO TBLEMPLOYEE VALUES ( 6, 'BEN','MALE',3)

CREATE TABLE TBLDEPARTMENT


(DEPTID INT ,
DEPTNAME VARCHAR(10));

INSERT INTO TBLDEPARTMENT VALUES ( 1, 'IT')


INSERT INTO TBLDEPARTMENT VALUES ( 2, 'PAYROLL')
INSERT INTO TBLDEPARTMENT VALUES ( 3, 'HR')
INSERT INTO TBLDEPARTMENT VALUES ( 4, 'ADMIN')

CREATE VIEW VWEMPLOYEEDETAILS


AS
SELECT ID,[NAME],GENDER,DEPTNAME FROM TBLEMPLOYEE AS E
INNER JOIN
TBLDEPARTMENT AS D
ON E.DEPARTMENTID = D.DEPTID

INSERT INTO VWEMPLOYEEDETAILS VALUES(7, 'VALY','FEMALE','IT') ==> ERROR


=> View or function 'VWEMPLOYEEDETAILS' is not updatable because the modification
affects multiple base tables.
==========================================================
01-07-2022

CREATE TRIGGER TR_VIEWEMPDETL


ON VWEMPLOYEEDETAILS
INSTEAD OF INSERT
AS
DECLARE @DEPTID INT
/*FIRST CHECK IF THERE IS VALID DEPARTMENT ID IN THE DEPARTMENT TABLE
FOR THE GIVEN DEPARTMENT NAME*/
SELECT @DEPTID = DEPTID FROM TBLDEPARTMENT
INNER JOIN INSERTED
ON INSERTED.DEPTNAME = TBLDEPARTMENT.DEPTNAME
--IF THE DEPARTMENTID IS NULL THEN THROW AN ERROR
IF @DEPTID IS NULL
BEGIN
RAISERROR('INVALID DEPT NAME', 15,1)
RETURN
END
--FINALLY INSERT THE DATA INTO EMPLOYEE TABLE
INSERT INTO TBLEMPLOYEE(ID,NAME,GENDER,DEPARTMENTID) SELECT ID,NAME, GENDER,@DEPTID
FROM INSERTED

------------------------------------------------------------------
INSERT INTO VWEMPLOYEEDETAILS VALUES(8, 'DANNY','MALE','IT') --->DATA SUCCESFULLY
INSERTED

============================================================================
DDL TRIGGERS:
===========
DDL TRIGGERS FIRE IN RESPONSE TO A VARIETY OF DDL EVENTS. CREATE, ALTER, DROP,GRANT,
DENY, REVOKE..EVEN CERTAIN STORED PROCEDURES THAT PERFORM DDL OPERATIONS.
WE CAN USE DDL TRIGGERS WHEN WE WANT TO DO THE FOLLOWING:

1. PREVENT SOME CHANGES IN DATABASE


2. RECORD CHANGES OR EVENTS IN DATABASE SCHEMA
3. HAVE SOMETHING TO OCCURE IN THE DATABASE IN RESPONSE TO CHANGE IN DATABASE SCHEMA

THERE ARE TWO TYPES OF DDL TRIGGERS:


1. DATABASE SCOPED DDL TRIGGER
2. SERVER SCOPED DDL TRIGGER

THE DDL TRIGGERS CAN BE CREATED IN A SPECIFIC DATABASE OR AT THE SERVER LEVEL.
IF WE SET THE SCOPE TO SERVER LEVELE THEN IT IS APPLIED TO ALL THE DATABASES OF
THAT SERVER.

=========================================================================
CREATE A TRIGGER THAT WILL RESTRICT CREATING A NEW TABLE ON SPECIFIC DATABASE
USE NARAYAN
GO
CREATE TRIGGER TR_TABLEPREV
ON DATABASE
FOR CREATE_TABLE
AS
PRINT 'YOU CAN NOT CREATE A TABLE ON THIS DATABASE'
ROLLBACK TRANSACTION
==================================
CREATE TABLE T450 (ID INT, NAME VARCHAR(10)) ---> ERROR
=====================================================
CREATE A TRIGGER THAT WILL RESTRICT ALTER OPERATIONS ON A SPECIFIC DATABASE
USE NARAYAN
GO
CREATE TRIGGER TR_ALTERPREV
ON DATABASE
FOR ALTER_TABLE
AS
PRINT 'YOU CAN NOT ALTER A TABLE ON THIS DATABASE'
ROLLBACK TRANSACTION
==================================
ALTER TABLE DEPT
ADD LASTNAME VARCHAR(10) ----ERROR
==========================================
CREATE A TRIGGER THAT WILL RESTRICT DROP OPERATIONS ON A SPECIFIC DATABASE
USE NARAYAN
GO
CREATE TRIGGER TR_DROPPREV
ON DATABASE
FOR DROP_TABLE
AS
PRINT 'YOU CAN NOT DROP A TABLE ON THIS DATABASE'
ROLLBACK TRANSACTION
=======================
DROP TABLE DEPT --- ERROR
==============================================
CREATE A TRIGGER WHICH PREVENTS USERS FROM CREATING, ALTERING, DROPING TABLES FROM
A SPECIFIC DATABASE USING SINGLE TRIGGER

USE NARAYAN
GO
CREATE TRIGGER TR_ANYMOD
ON DATABASE
FOR DROP_TABLE,CREATE_TABLE,ALTER_TABLE
AS
PRINT 'YOU CAN NOT RUN DDL COMMAND ON THIS DATABASE'
ROLLBACK TRANSACTION

===================================================
DROPPINNG THE DATABASE SCOPPED TRIGGERS

DROP TRIGGER TR_DROPPREV ON DATABASE


=================================================
DISABLING THE DATABASE SCOPPED TRIGGERS

DISABLE TRIGGER <TRIGGERNAME> ON DATABASE

===================================
ENABLING THE DATABASE SCOPPED TRIGGERS

ENABLE TRIGGER <TRIGGERNAME> ON DATABASE

===============================================================
HOW TO CREATED SERVER SCOPPED TRIGGER

WHEN WE CREATE A SERVER SCOPPED DDL TRIGGER, THEN IT WILL BE FIRED IN RESPONSE TO
DDL EVENTS HAPPENING IN ALL OF THE DATABASES ON THAT PARTICULAR SERVER

=> CREATE TRIGGER FOR NOT ALLOWING CREATION, ALTERING AND DELETING ANY TABLE IN ALL OF
THE DATABASES IN SERVER

CREATE TRIGGER TR_SERVER


ON ALL SERVER
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
PRINT 'YOU ARE NOT ALLOWED TO CREATE, ALTER, DROP A TABLE IN ANY DATABASE
OF THIS SERVER'
ROLLBACK TRANSACTION

=======================================
DISABLE TRIGGER TR_SERVER ON ALL SERVER
ENABLE TRIGGER TR_SERVER ON ALL SERVER
DROP TRIGGER TR_SERVER ON ALL SERVER
===================================================================
04-07-2022

=> WHEN EVER SOME ONE ISSUES COMMAND CREATE TABLE, ALTER TABLE, DROP TABLES
WE WANT TO SAVE HIS INFORMATION --DATABASE NAME, TABLENAME, EVENTTYPE,LOGINNAME,
SQL COMMAND, AUDITDATETIME

CREATE TABLE TABLECHANGES(


DATABASENAME NVARCHAR(100),
TABLENAME NVARCHAR(100),
EVENTTYPE NVARCHAR(250),
LOGINNAME NVARCHAR(250),
SQLCOMMAND NVARCHAR(2000),
AUDITDATETIME DATETIME);

CREATE TRIGGER tr_AuditTableChanges


on ALL SERVER
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
DECLARE @EventData XML
SELECT @EventData =EVENTDATA()
INSERT INTO PRAVEER.DBO.TABLECHANGES(DATABASENAME,TABLENAME,EVENTTYPE,
LOGINNAME,SQLCOMMAND,AUDITDATETIME)
VALUES (
@EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','NVARCHAR(100)'),
@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(100)'),
@EventData.value('(/EVENT_INSTANCE/EventType)[1]','NVARCHAR(250)'),
@EventData.value('(/EVENT_INSTANCE/LoginName)[1]','NVARCHAR(250)'),
@EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]','NVARCHAR(2000)'),
GETDATE()
)

=================================================================
LOGON TRIGGER:
SQL SERVER AUTOMATICALLY EXECUTES THE LOGON TRIGGERS ONCE A LOGON EVENT OCCURS.
IT GETS EXECUTED BEFORE A USER SESSION IS ESTABLISHED AND AUTHENTICATION IS
SUCCESFULL.

IF USER IS UNABLE TO AUTHENTICATE TO SQL SERVER( WRONG CREDENTIALS) SQL SERVER DOES
NOT
EXECUTE LOGON TRIGGER.

MAINLY IT IS USED FOR:

1. AUDITING AND CONTROLLING SERVER SESSIONS


2. TRACKING LOGIN ACTIVITY
3. RESTRICTING LOGINS
4. LIMITING THE NUMBER OF SESSIONS FOR A SPECIFIC LOGIN
5. LIMITING THE LOGON HOURS FOR A SPECIFIC LOGIN

==> CREATE A TRIGGER TO RESTRICT TOTAL NUMBER OF SQL SERVER CONNECTIONS USING
LOGON TRIGGER

CREATE TRIGGER tr_LogonSessionRestriction


ON ALL SERVER
FOR LOGON
AS
if (select count(*) from sys.dm_exec_sessions
where is_user_process = 1 AND login_name = ORIGINAL_LOGIN()) > 3
begin
PRINT 'Fourth connection for ' + original_login() + 'blocked'
rollback
end

==================================================
DISABLE TRIGGER tr_LogonSessionRestriction ON ALL SERVER
ENABLE TRIGGER tr_LogonSessionRestriction ON ALL SERVER
DROP TRIGGER tr_LogonSessionRestriction ON ALL SERVER

05-07-2022
==============
===> LIMIT SESSION UPTO 2 ONLY FOR ALL USERS EXCEPT 'sa' USER
The following logon trigger will limit the maximum number of open connections for a
user to 2
except the sa user. That means the following logon trigger will limit the open
connections for
all Logins except the ‘sa’ user once the open connection limit is reached to 2,
then the user will
not be able to create a new connection. Instead, the user will get an error message.

CREATE TRIGGER tr_Conn_Limit_LogonTriggers


ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
DECLARE @LoginName NVARCHAR(100)
SET @LoginName = ORIGINAL_LOGIN()
IF @LoginName <> 'sa'
AND
( SELECT COUNT(*)
FROM sys.dm_exec_sessions
WHERE Is_User_Process = 1 AND
Original_Login_Name = @LoginName
) > 2
BEGIN
PRINT 'Third session for the user ' + @LoginName + ' is blocked'
ROLLBACK
END
END

================================================================================
ALTERING OF TRIGGERS

ALTER THE TRIGGER TO RESTRICT TOTAL NUMBER OF SQL SERVER CONNECTIONS NOT MORE THAN 5
USING LOGON TRIGGER

ALTER TRIGGER tr_LogonSessionRestriction


ON ALL SERVER
FOR LOGON
AS
if (select count(*) from sys.dm_exec_sessions
where is_user_process = 1 AND login_name = ORIGINAL_LOGIN()) > 5
begin
PRINT 'Fourth connection for ' + original_login() + 'blocked'
rollback
end
===============================================================================
DYNAMIC SQL
-----------
=> SQL COMMANDS BUILT AT RUNTIME ARE CALLED DYNAMIC SQL COMMANDS
=> DYNAMIC SQL IS USEFUL WHEN WE DONT KNOW TABLE NAMES AND COLUMN NAMES UNTIL RUN
TIME.
=> SELECT * FROM EMP1 (STATIC QUERY)

=> DYNAMIC -- SQL


DECLARE @TNAME VARCHAR(20)
DECLARE @STMT VARCHAR(200)
SET @TNAME = 'EMP1'
SET @STMT = 'SELECT * FROM ' + @TNAME
EXEC (@STMT)

=> DYNAMIC SQL CAN BE EXECUTED BY USING


1. EXEC OR EXECUTE COMMAND
2. SP_EXECUTESQL PROCEDURE --SUPPORTS INPUT AND OUTPUT PARAMTERS

=> CREATE A PROCEDURE TO DROP A PARTICULAR TABLE


CREATE PROC DROP_TABLE
@TNAME VARCHAR(20)
AS
EXEC ('DROP TABLE ' + @TNAME)

EXECUTION --> EXEC DROP_TABLE 'EMP11'


==========
=====================================================
DECLARE @TNAME VARCHAR(20)
SET @TNAME = 'EMP1'
DECLARE @COL1 VARCHAR(20)
SET @COL1 = 'ENAME'
DECLARE @COL2 VARCHAR(20)
SET @COL2 = 'JOB'
DECLARE @STMT VARCHAR(500)

SET @STMT = 'SELECT '+ @COL1 + ',' + @COL2 + ' FROM ' + @TNAME
PRINT @STMT

=========

CREATE A PROCEDURE TO DISPLAY DESIRED TWO COLUMNS FROM A DESIRED TABLE


MEANS -- USER WILL SUPPLY THE COL NAMES AND TABLE NAME

CREATE PROC DYNAMIC_TABLE


@TNAME VARCHAR(20),
@COL1 VARCHAR(20),
@COL2 VARCHAR(20)
AS
DECLARE @STMT VARCHAR(500)
SET @STMT = 'SELECT '+ @COL1 + ',' + @COL2 + ' FROM ' + @TNAME
PRINT @STMT
EXEC (@STMT)

EXEC DYNAMIC_TABLE 'EMP1','ENAME','JOB'


===================================================================
CREATE A PROCEDURE TO DROP ALL THE TABLES FROM DATABASE CONTOSO RETAILS
USE ContosoRetailDW
GO

CREATE PROC DROP_ALL_TABLES


AS
DECLARE C1 CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
DECLARE @TNAME VARCHAR(20)
DECLARE @STMT VARCHAR(200)
OPEN C1
FETCH NEXT FROM C1 INTO @TNAME
WHILE @@FETCH_STATUS = 0
BEGIN
SET @STMT = 'DROP TABLE ' + @TNAME
EXEC (@STMT)
FETCH NEXT FROM C1 INTO @TNAME
END
CLOSE C1
DEALLOCATE C1

EXECUTE PROCEDURE ---> EXEC DROP_ALL_TABLES


=======================================================
06-07-2022
==========

SEE THE DETAILS OF A PARTICULAR EMPLOYEE FROM EMP1

DECLARE @E VARCHAR(10) = '''SMITH'''


DECLARE @STMT VARCHAR(200)
SET @STMT = 'SELECT * FROM EMP1 WHERE ENAME = ' + @E
PRINT @STMT
EXEC (@STMT)

===================================
CREATE PROC P_D
@TABLE VARCHAR(50)
AS
DECLARE @CMD VARCHAR(200)
SET @CMD = 'SELECT * FROM ' + @TABLE
EXEC(@CMD)

===> EXEC P_D 'EMP1' ----> EVERYTHING FINE

=> EXEC P_D 'EMP1;DROP TABLE CUST1' ------>


TWO STATEMENTS WILL BE EXECUTED
1. SELECT * FROM EMP1;
2.DROP TABLE CUST1; ---> IT WILL DROP TABLE CUST1 ---> SQL INJECTION
=======================================================================
SP_EXECUTESQL ----> IT IS A SYSTEM STORED PROCEDURE USED TO RUN ONE OR MULTIPLE SQL
STATEMENTS STORED INSIDE A STRING. IT SUPPORTS INPUT AND OUTPUT PARAMETERS

EXEC SP_EXECUTESQL N'STATEMENT [{PARAMTERS DEFINITIONS}, {PARAMTER VALUES}]

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

EXEC SP_EXECUTESQL N'SELECT * FROM EMP1 WHERE EMPNO = 105'


==============================================================
DECLARE @T VARCHAR(10) = 'CLARK'
DECLARE @STMT NVARCHAR(500)
SET @STMT = 'SELECT * FROM EMP1 WHERE ENAME = @EMPL'
PRINT @STMT
exec sp_executesql @stmt, N'@EMPL VARCHAR(20)',@EMPL = @T
===========================================================
PREVENT SQL INJECTION--
1. DO VALIDATION OF DATA --USED IF EXISTS
2. USE QUOTENAME() TO PACK PARAMETER VALUE SUPPLIED INSIDE []

CREATE PROC P_SQLPREVN


@TABLE VARCHAR(50)
AS
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TABLE)
BEGIN
DECLARE @CMD NVARCHAR(200)
SET @CMD = 'SELECT * FROM ' + QUOTENAME(@TABLE)
EXEC SP_EXECUTESQL @CMD
END
ELSE
BEGIN
RAISERROR('INVALID TABLE NAME', 15,1)
END
==============================
=>EXEC P_SQLPREVN 'EMP1' ---> COMMAND SUCCESFULL

=>EXEC P_SQLPREVN 'EMP1;DROP TABLE EMP1' ----> INVALID TABLE NAME


====================================
07-07-2022

=> DISPLAY ALL TABLES IN DB


SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE ='BASE TABLE'
SELECT * FROM SYS.TABLES

=> => DISPLAY ALL VIEW IN DB


SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE ='VIEW'
SELECT * FROM SYS.VIEWS

=>SELECT * FROM SYS.procedures


=>SELECT * FROM SYS.triggers

=>SELECT * FROM SYS.OBJECTS => ALL OBJECTS OF DB

=>SELECT * FROM SYS.OBJECTS WHERE TYPE = 'U'=> USER TABLES OF DB

SELECT * FROM SYS.OBJECTS WHERE TYPE = 'V'


SELECT * FROM SYS.OBJECTS WHERE TYPE = 'P'
SELECT * FROM SYS.OBJECTS WHERE TYPE = 'TR'
SELECT * FROM SYS.OBJECTS WHERE TYPE = 'FN'
SELECT * FROM SYS.OBJECTS WHERE TYPE = 'PK'
SELECT * FROM SYS.OBJECTS WHERE TYPE = 'F'
SELECT * FROM SYS.OBJECTS WHERE TYPE = 'C'
========================================

=> LIST OF COLUMNS OF EMP1 TABLE

=> SELECT * FROM SYS.TABLES WHERE NAME = 'EMP1' ---> GET OBJECT_ID OF EMP1---
>997578592
=> SELECT * FROM SYS.COLUMNS WHERE OBJECT_ID = 997578592 ---> COLUMNS OF EMP1 TABLE
=> COUNT OF NUMBER OF COLUMNS IN EMP1 TABLE
=>SELECT COUNT(*) AS NUMBER_COLS FROM SYS.COLUMNS WHERE OBJECT_ID = 997578592

=> SHOW TABLE NAMES AND CORRESPONDING COL NAMES


TABLE NAME COLNAME
EMP1 EMPNO
EMP1 ENAME
ORDERS OID
ORDERS QTY

====>
SELECT T.NAME AS TABLE_NAME, C.NAME AS COL_NAME FROM SYS.TABLES AS T
INNER JOIN
SYS.COLUMNS AS C
ON T.object_id = C.object_id

====>
SHOW TABLE NAMES AND NUMBER OF COLS IN EACH TABLE
TABLE NAME NUMBEROFCOLS
EMP1 9
ORDERS 5

=>SELECT T.NAME AS TABLE_NAME, COUNT(*) AS NUMBER_COLS FROM SYS.TABLES AS T


INNER JOIN
SYS.COLUMNS AS C
ON T.object_id = C.object_id GROUP BY T.NAME ORDER BY TABLE_NAME
====>
TABLE NAME COLS
EMP1 EMPNO,ENAME,JOB,SAL,COMMISION,EMAIL

SELECT T.NAME, STRING_AGG(C.NAME,',') AS COLS FROM SYS.TABLES AS T


INNER JOIN
SYS.COLUMNS AS C
ON T.object_id = C.object_id WHERE T.NAME = 'EMP1' GROUP BY T.NAME
==============================
ALL TABLES AND THEIR CORRESPONDING COLNAMES IN ONE ROW

SELECT T.NAME, STRING_AGG(C.NAME,',') AS COLS FROM SYS.TABLES AS T


INNER JOIN
SYS.COLUMNS AS C
ON T.object_id = C.object_id GROUP BY T.NAME

STRING_AGG()---> THIS FUNCTIONS IS AN AGGREGATE FUNCTION THAT CONCATENATES ROWS OF


STRINGS INTO A SINGLE STRING SEPERATED BY A SPECIFIED SEPERATOR.

STRING_AGG(INPUT STRING, SEPERATOR) [ORDER CLAUSE]


=>SELECT DEPTNO,STRING_AGG(ENAME,',') AS employees FROM EMP1 GROUP BY DEPTNO
=>SELECT STRING_AGG(ENAME,',') WITHIN GROUP(ORDER BY ENAME ASC) AS employees FROM EMP1

=====================>
DATABASE SECURITY--->

CREATE NEW LOGIN


USE [master]
GO
CREATE LOGIN NARAYAN WITH PASSWORD = '123'

======================>
CREATE NEW USER IN NARAYAN DB
USE [NARAYAN]
GO
CREATE USER [NARAYAN1] FOR LOGIN [NARAYAN]
GO
================================================================================
08-07-2022
----------
GRANT --SELECT PERMISSION ON EMP1 TO NARAYAN1

USE NARAYAN
GO
GRANT SELECT ON DBO.EMP1 TO NARAYAN1

GRANT --DELETE PERMISSION ON EMP1 TO NARAYAN1

USE NARAYAN
GO
GRANT DELETE ON DBO.EMP1 TO NARAYAN1

==========================================
REVOKE DELETE PERMISSION ON EMP1 FROM NARAYAN1
----------------------------
USE NARAYAN
GO
REVOKE DELETE ON DBO.EMP1 FROM NARAYAN1
-----------------------------------------------------------

GRANT MULTIPLE PERMISSION AT SAME TIME


------------------------------------
USE NARAYAN
GO
GRANT INSERT,UPDATE,DELETE ON EMP1 TO NARAYAN1

NOW NARAYAN1 WILL BE ABLE TO INSERT DATA, UPDATE DATA AND DELETE DATA FROM EMP1
EXAMPLE:
USE NARAYAN
GO

UPDATE EMP1
SET MGR = 7900 WHERE ENAME = 'CLARK'
=============================================================================
REVOKE MULTIPLE PERMISSIONS BACK
USE NARAYAN
GO
REVOKE DELETE,UPDATE ON EMP1 FROM NARAYAN1

===========================================================================
GRANT PERMISSION TO CREATE A SCHEMA
----------------------------------------
USE NARAYAN
GO
GRANT CREATE SCHEMA TO NARAYAN1

===> CREATE SCHEMA HR --- CREATED SUCCESSFULLY BY NARAYAN1

==GRANTING CREATE TABLE PERMISSION IN HR SCHEMA


USE NARAYAN
GO
GRANT CREATE TABLE TO NARAYAN1

==============================
CREATE TABLE HR.T100199(ID INT)
============================================

You might also like