1. Create
database |
create
database sample2 |
2. Use the
database |
use sample2 |
3. Create
table |
create table
customer ( customerid
int identity(1,1) primary key, customernumber
int not null unique check (customernumber>0), lastname
varchar(30) not null, firstname
varchar(30) not null, areacode int
default 71000, address
varchar(50), country
varchar(50) default 'Malaysia' ) |
4. Insert
values into table |
insert into
customer values (100,'Fang
Ying','Sham','418999','sdadasfdfd',default), (200,'Mei
Mei','Tan',default,'adssdsadsd','Thailand'), (300,'Albert','John',default,'dfdsfsdf',default) |
5. Display
record from table |
-- display
all records select * from
customer -- display
particular columns select
customerid, customernumber, lastname, firstname from customer |
6. Add new
column to table |
alter table
customer add
phonenumber varchar(20) |
7. Add values
to newly added column/ Update table |
update
customer set phonenumber='1234545346' where customerid=1 update
customer set phonenumber='45554654' where customerid=2 |
8. Delete a
column |
alter table
customer drop column
phonenumber |
9. Delete
record from table --if not put
‘where’, will delete all
record |
delete from customer where
country='Thailand' |
10. Delete
table |
drop table
customer |
11. Change
data type |
alter table
customer alter column
phonenumber varchar(10) |
12. Check
what table inside |
select * from
information_schema.tables |
13. View
specific row |
--top: show
only the first two select top 2
* from customer --top 40
percent: also means show the first two select top 40
percent * from customer |
14. View
specific column |
--sort result
(by default is ascending) select
customerfirstname, customerlastname from customer order by
customerlastname desc select customerfirstname,
customerlastname from customer order by 4,
2, 3 desc -- Order By Based on column no. without typing column name --distinct:
only show unique value select
distinct customerlastname from customer order by
customerlastname |
15. Save
table to another table |
--into
file_name: save result in another table (BASE TABLE) select
distinct customerlastname into temp from customer order by
customerlastname select * from
temp --see the table (data type will remain) |
16. Like
(search something) |
--
(underscore sign) _ is only specific for one character only -- (percent
sign) % represents zero, one, or multiple characters select * from
customer where
customerlastname like '_r%' |
17. In
(search something) |
-- search
multiple items select * from
customer where
customerlastname in ('Brown', ‘Michael’, ’Jim’) |
18. >
(search something) |
select * from
customer where customerlastname > 'Brown' or customerlastname>'Cross' |
19. <>
(Not Equal) |
select * from
customer where
customerlastname <> 'Brown' |
20. IS NULL |
-- check null
values select * from
customer where
customerlastname IS NULL |
21. IS NOT
NULL |
select * from
customer where customerlastname
IS NOT NULL |
22. between |
select * from
sale where
saleunitprice between 5 and 10 --not include 5 & 10 |
23. count |
-- returns
the number of rows in a table -- AS means
aliasing, temporary giving name to a column/ table select
count(*) as [Number of Records] from customer where
customerfirstname like 'B%' |
24. sum |
select
sale.employeeid ,EmployeeFirstName, EmployeeLastName , count(*) as [Number of
order] , sum(salequantity)
as [Total Quantity] from
sale,employee where
sale.employeeid = employee.employeeid group by
sale.employeeid ,EmployeeFirstName, EmployeeLastName |
25. count
month |
select
month(saledate) as [Month], count ( * ) as [Number of sale], sum(salequantity*saleunitprice)
as [Total Amount] from sale group by
month(saledate) |
26. Max/Min/Average |
SELECT
MAX(Salary) FROM
EmployeeSalary |
27. having |
SELECT
JobTitle, COUNT(JobTitle) FROM
EmployeeDemographics ED JOIN
EmployeeSalary ES ON ED.EmployeeID = ES.EmployeeID GROUP BY
JobTitle HAVING COUNT(JobTitle)
> 1 SELECT
JobTitle, AVG(Salary) FROM
EmployeeDemographics ED JOIN
EmployeeSalary ES ON ED.EmployeeID = ES.EmployeeID GROUP BY
JobTitle HAVING
AVG(Salary) > 45000 ORDER BY
AVG(Salary) |
28. Change
data type temporary for use |
--
CAST(expression AS datatype(length)) SELECT
CAST('2017-08-25 00:00:00.000' AS date) --
CONVERT(data_type(length), expression, style) SELECT
CONVERT(date,'2017-08-25 00:00:00.000') |
29. CASE
Statement |
SELECT
FirstName, LastName, Age, CASE WHEN Age > 30 THEN 'Old' WHEN Age BETWEEN 27 AND 30 THEN 'Young' ELSE 'Baby' END FROM
EmployeeDemographics ED WHERE Age IS
NOT NULL ORDER BY Age -- SELECT
FirstName, LastName, JobTitle, Salary, CASE WHEN JobTitle = 'Salesman' THEN Salary +
(Salary *.10) WHEN JobTitle = 'Accountant' THEN Salary +
(Salary *.05) WHEN JobTitle = 'HR' THEN Salary + (Salary
*.000001) ELSE Salary + (Salary *.03) END AS
SalaryAfterRaise FROM
EmployeeDemographics ED JOIN
EmployeeSalary ES ON
ED.EmployeeID = ES.EmployeeID |
30. Partition
By --returns a single value for each row |
SELECT
FirstName, LastName, Gender, Salary, COUNT(Gender)
OVER (PARTITION BY Gender) AS TotalGender FROM
EmployeeDemographics ED JOIN
EmployeeSalary ES ON
ED.EmployeeID = ES.EmployeeID |
31. String
Functions |
-- Remove
space Select
EmployeeID, TRIM(EmployeeID) AS IDTRIM FROM
EmployeeErrors Select
EmployeeID, RTRIM(EmployeeID) as IDRTRIM FROM
EmployeeErrors Select
EmployeeID, LTRIM(EmployeeID) as IDLTRIM FROM
EmployeeErrors -- Replace Select
LastName, REPLACE(LastName, '- Fired', '') as LastNameFixed FROM
EmployeeErrors -- Substring Select
Substring(err.FirstName,1,3), Substring(dem.FirstName,1,3),
Substring(err.LastName,1,3), Substring(dem.LastName,1,3) FROM
EmployeeErrors err JOIN
EmployeeDemographics dem on Substring(err.FirstName,1,3) = Substring(dem.FirstName,1,3) and Substring(err.LastName,1,3) = Substring(dem.LastName,1,3) -- UPPER and
LOWER CASE Select
firstname, LOWER(firstname) from
EmployeeErrors Select
Firstname, UPPER(FirstName) from
EmployeeErrors" |
32. Stored
Procedure |
CREATE
PROCEDURE Temp_Employee @JobTitle
nvarchar(100) AS DROP TABLE IF
EXISTS #temp_employee Create table
#temp_employee ( JobTitle
varchar(100), EmployeesPerJob
int , AvgAge int, AvgSalary int ) Insert into
#temp_employee SELECT
JobTitle, Count(JobTitle), Avg(Age), AVG(salary) FROM
EmployeeDemographics emp JOIN
EmployeeSalary sal ON emp.EmployeeID = sal.EmployeeID where
JobTitle = @JobTitle --- make sure to change this in this script
from original above group by
JobTitle Select * From
#temp_employee GO; By Fang Ying,
Sham 6 --- only need
to run this on next time EXEC
Temp_Employee @JobTitle = 'Salesman' |
33. Subquery |
-- Subquery
in Select SELECT
EmployeeID, Salary, (SELECT AVG(Salary) FROM EmployeeSalary)
AS AllAvgSalary FROM
EmployeeSalary -- with
Partition By SELECT
EmployeeID, Salary, AVG(Salary) OVER () AS AllAvgSalary FROM
EmployeeSalary -- Subquery
in From SELECT
a.EmployeeID, AllAvgSalary FROM (SELECT
EmployeeID, Salary, AVG(Salary) OVER () AS AllAvgSalary FROM EmployeeSalary) a ORDER BY
a.EmployeeID -- Subquery
in Where SELECT
EmployeeID, JobTitle, Salary FROM
EmployeeSalary WHERE
EmployeeID in (SELECT EmployeeID FROM EmployeeDemographics WHERE Age > 30) SELECT
EmployeeID, JobTitle, Salary FROM
EmployeeSalary WHERE Salary
in (SELECT Max(Salary) FROM EmployeeSalary) |
|
|
1. getting
data from multiple tables (explicit join - without using join command) |
select * from
inventory,sale where
sale.inventoryid=inventory.inventoryid select inventoryname,saledate,saleunitprice,salequantity,salequantity*saleunitprice as [Total
amount] from
sale,inventory where
sale.inventoryid=inventory.inventoryid group by
sale.inventoryid,inventoryname,saledate,salequantity,saleunitprice order by
inventoryname |
2. getting
data from multiple tables (implicit
join - using join command) |
--inner join select * from
inventory inner join
sale on sale.inventoryid=inventory.inventoryid select inventoryname,saledate,saleunitprice,salequantity,saleunitprice*salequantity as [Total
Amount] from
inventory inner join sale on
sale.inventoryid=inventory.inventoryid order by
inventoryname |
|
--full outer
join (shows everything) select
sale.inventoryid,inventoryname from
inventory full outer
join sale on sale.inventoryid=inventory.inventoryid where
sale.inventoryid is NULL |
|
--left join
(might have NULL value, since some inventory might not have sales) select
inventory.inventoryid,inventoryname from
inventory left join sale on sale.inventoryid=inventory.inventoryid |
|
--left join select
inventory.inventoryid,inventoryname from
inventory left join sale on sale.inventoryid=inventory.inventoryid where
sale.inventoryid is NULL -- without
join: use subquery select
inventoryid,inventoryname from inventory where
inventoryid not in (select inventoryid from sale) |
|
--right join select
sale.inventoryid,inventoryname from
inventory right join sale on sale.inventoryid=inventory.inventoryid |
3. Self Join
--commonly used in processing hierarchy |
--inner join Staff Table employeeID
employeefirstname employeelastname managerID 1001 Tan Mei Ling NULL 1002 Kelvin Koh 1001 1003 Amin
Wong 1002 select
E.employeeID, E.employeefirstname+' '+E.employeelastname as [Full Name],
E.managerID, , M.employeefirstname+' '+M.employeelastname as [Manager
Name] from staff E inner join
staff M on
E.managerID = M.employeeID --left outer
join (list all the employees) select E.employeeID, E.employeefirstname+'
'+E.employeelastname as [F Name], E.managerID, , M.employeefirstname+'
'+M.employeelastname as [Manager Name] from staff E left outer join staff M
on E.managerID = M.employeeID |
4. Cross Join
--generate all combination of records (all possibility |
select * from
inventory1 cross join
inventory2 |
|
|
1. Union --allow you
to combine two tables together (but
the no. of columns & each column’s
data types for 2 tables must be
match) --don't need
common key, only need common
attributes --merge, not
showing duplicate record |
select
cust_lname,cust_fname from customer union select
cust_lname,cust_fname from customer_2 |
2. Union all
--merge, but show you everything, even the duplicate record |
select
cust_lname,cust_fname from customer union all select
cust_lname,cust_fname from customer_2 |
3. Intersect --keep only
the rows in common to both query --not showing
duplicate record |
select
cust_lname,cust_fname from customer intersect select
cust_lname,cust_fname from customer_2 |
|
select
c.cust_lname,c.cust_fname from customer c,customer_2 c2 where
c.cust_lname=c2.cust_lname and c.cust_fname=c2.cust_fname |
4. Except --generate
only the records that are unique to the CUSTOMER
table |
select
cust_lname,cust_fname from customer except select
cust_lname,cust_fname from customer_2 |
|
--use
subquery select
cust_lname,cust_fname from customer where(cust_lname)
not in (select
cust_lname from customer_2) and (cust_fname)
not in (select
cust_fname from customer_2) |
Table & View |
|
1. view table (view will be
updated when update base) --view is a
result set of SQL statements,
exists only for a single query |
create view
CustomerView as select
customerfirstname+' '+customerlastname as [Customer Name] , customerphonenumber, inventoryname,saledate,salequantity,saleunitprice,salequantity*saleunitprice as [Total
Amount] from customer
inner join sale on customer.customerid=sale.customerid inner join
inventory on
sale.inventoryid=inventory.inventoryid |
2. Temp table
(temp will NOT be updated when update base) --a single hashtag (#) sign must
be added in front of their names --used to store data temporarily, physically
created in the Tempdb database --can perform CRUD, join, and some other
operations like the persistent database tables |
DROP TABLE IF
EXISTS #temp_Employee Create table
#temp_Employee ( JobTitle
varchar(100), EmployeesPerJob
int, AvgAge int, AvgSalary int ) Insert INTO
#temp_Employee SELECT
JobTitle, Count(JobTitle), Avg(Age), AVG(salary) FROM
EmployeeDemographics emp JOIN
EmployeeSalary sal ON emp.EmployeeID = sal.EmployeeID group by
JobTitle SELECT * FROM
#temp_Employee |
3. CTE
(Common Table Expression) --create temporary result set which is used to
manipulate the complex sub-queries data --created in memory rather than
Tempdb database, so cannot create any index on CTE. |
WITH
CTE_Employee AS ( SELECT
FirstName, LastName, Gender, Salary, COUNT(Gender)
OVER (PARTITION BY Gender) AS TotalGender FROM
EmployeeDemographics ED JOIN
EmployeeSalary ES ON
ED.EmployeeID = ES.EmployeeID WHERE Salary
> '45000' ) SELECT
FirstName, LastName, Gender, TotalGender FROM
CTE_Employee WHERE
TotalGender = (SELECT MIN(TotalGender) FROM CTE_Employee) |
4. Duplicate
Table |
select
customerfirstname+' '+customerlastname as [Customer Name] , customerphonenumber, inventoryname,saledate,salequantity,saleunitprice,salequantity*saleunitprice as [Total
Amount] into customerRec from customer
inner join sale on customer.customerid=sale.customerid inner join
inventory on
sale.inventoryid=inventory.inventoryid order by
customerfirstname +' '+ customerlastname,inventoryname |
SQL RANKS |
|
1. ROW_NUMBER() |
--get a
unique sequential number for each row --get
different ranks for the row having similar values SELECT *, ROW_NUMBER() OVER(ORDER BY Salary DESC)
SalaryRank FROM
EmployeeSalary |
2. RANK() |
--specify
rank for each row in the result set --use
PARTITION BY to performs calculation on each group --each subset
get rank as per Salary in descending order USING
PARTITION BY SELECT *, RANK() OVER(PARTITION BY JobTitle ORDER BY
Salary DESC) SalaryRank FROM
EmployeeSalary ORDER BY
JobTitle, SalaryRank NOT
USING PARTITION BY -- get SAME
ranks for the row having similar values SELECT *, RANK() OVER(ORDER BY Salary DESC) SalaryRank FROM
EmployeeSalary ORDER BY
SalaryRank |
3.
DENSE_RANK() |
-- if have
duplicate values, SQL assigns different ranks to those rows. -- will get
the same rank for duplicate or similar values SELECT *, DENSE_RANK() OVER(ORDER BY Salary DESC)
SalaryRank FROM
EmployeeSalary ORDER BY
SalaryRank |
3. Split by
delimiter ❖ SUBSTRING(string, start, length) ❖
CHARINDEX(substring, string, start) ❖ LEN(string) |
SELECT
PropertyAddress, SUBSTRING(PropertyAddress,
1, CHARINDEX(',', PropertyAddress)
-1 ) as Address ,
SUBSTRING(PropertyAddress, CHARINDEX(',', PropertyAddress)
+ 1 , LEN(PropertyAddress)) as City From
NashvilleHousing ALTER TABLE
NashvilleHousing Add
PropertySplitAddress Nvarchar(255); ALTER TABLE
NashvilleHousing Add
PropertySplitCity Nvarchar(255); Update
NashvilleHousing SET
PropertySplitAddress = SUBSTRING(PropertyAddress, 1, CHARINDEX(',',
PropertyAddress) -1 ) Update
NashvilleHousing SET
PropertySplitCity = SUBSTRING(PropertyAddress, CHARINDEX(',',
PropertyAddress) + 1 , LEN(PropertyAddress)) |
PARSENAME('object_name' ,
object_piece) --numbering
works from right to left ❖
REPLACE(string, old_string, new_string) |
Select
OwnerAddress, PARSENAME(REPLACE(OwnerAddress,
',', '.') , 3) ,PARSENAME(REPLACE(OwnerAddress,
',', '.') , 2) ,PARSENAME(REPLACE(OwnerAddress,
',', '.') , 1) From
NashvilleHousing ALTER TABLE
NashvilleHousing Add
OwnerSplitAddress Nvarchar(255); ALTER TABLE
NashvilleHousing Add
OwnerSplitCity Nvarchar(255); ALTER TABLE
NashvilleHousing Add
OwnerSplitState Nvarchar(255); Update
NashvilleHousing SET
OwnerSplitAddress = PARSENAME(REPLACE(OwnerAddress, ',', '.') ,
3) Update
NashvilleHousing SET
OwnerSplitCity = PARSENAME(REPLACE(OwnerAddress, ',', '.') , 2) Update
NashvilleHousing SET OwnerSplitState
= PARSENAME(REPLACE(OwnerAddress, ',', '.') , 1) |
5. Remove
duplicate records |
WITH
RowNumCTE AS( Select *, ROW_NUMBER()
OVER ( PARTITION BY
ParcelID, PropertyAddress, SalePrice, SaleDate, LegalReference ORDER BY
UniqueID) as row_num From
NashvilleHousing order by
ParcelID ) --DELETE Select * From
RowNumCTE Where row_num
> 1 Order by
PropertyAddress |
|
|
No comments:
Post a Comment