| 
   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 
   | 
 
 
  | 
     
   | 
  
     
   |