You are on page 1of 4

select * from emp_data; -- empid,salary,loc,dept_id

select * from dept; --


empid,emp_name,dept_id,dept_name,travel_required

-- details of emp from chicago loc and their dept names

select emp_data.empid,emp_data.fname,salary,dept_name,emp_data.loc
from emp_data
left join
dept
on emp_data.empid=dept.empid
and dept.dept_name='HR'
where emp_data.loc='chicago';
-- and condition;

/*
group by. partition by
returns one row for each group returns all rows along with the
additional column of aggregated values
cant use non-aggregated column can use all required columns in
select
in select
sum,min,max,avg,count
row_number(),lag(),lead(),rank(),dense_rank()
*/

-- max() as window function


select * from emp;
select *,max(salary) over () as max_sal from emp;
select *,max(salary) over (partition by dept_name) from emp;
select *,max(salary) over (partition by dept_name order by salary desc)
from emp;

-- row_number() : used to assign a sequence value to each row of the


partition
select *,row_number() over () as rn from emp;
select *,row_number() over (partition by dept_name) as rn from emp;

-- fetch the first 2 emp to join the compny


select * from emp order by emp_id limit 2;

-- to fetch oldest emp for each dept


select dept_name,min(emp_id) from emp group by dept_name;
/*
'Admin','101'
'HR','102'
'IT','103'
'Finance','104'
*/

-- fetch the first 2 emp from each dept to join the compny
select * from (
select * ,
row_number() over (partition by dept_name order by emp_id) as rn
from emp) sq
where rn<3;

select * from emp;

-- fetch the top 3 emp from each dept earning max salary
-- rank () : -- assigns ranks with gap
-- mandatory order by clause
-- dense_rank() : assigns ranks without gaps

select * , rank() over () from emp;

select * from (
select * ,
rank() over (partition by dept_name order by salary desc) as rnk,
dense_rank() over (partition by dept_name order by salary desc) as
dense_rnk,
row_number() over (partition by dept_name order by salary desc) as rn
from emp) sq
where dense_rnk<4;

select * from emp where dept_name='admin' order by salary desc limit 2;

-- lead: next value : lead(column_name,offset,default value)


-- lag : priv value : lag(column_name,offset,default value)
-- column= value
-- tbl1.col=tbl2.col
select * from emp;
select *,
lead(salary) over () as next_sal ,
lag(salary) over () as priv_sal from emp;

select * from emp;


select *,
lead(salary) over (partition by dept_name) as next_sal ,
lag(salary) over (partition by dept_name) as priv_sal from emp;

select *,
lead(salary,2) over () as next_sal ,
lag(salary,2) over () as priv_sal from emp;

select *,
lead(salary,1,0) over () as next_sal ,
lag(salary,1,0) over () as priv_sal from emp;

select * from cars;


-- distance travelled by each car per day

select *,
lag(distance_travlled,1,0) over (partition by cars) ,
distance_travlled - lag(distance_travlled,1,0) over (partition by cars) as
dis_per_day
from cars;
/*
row_number() : assigns the index value to each row os the partition
rank() : assigns ranks to each row of the partition but with gaps
,it is mandatory to use order by with it
dense_rank() : assigns ranks to each row of the partition but without gaps
,it is mandatory to use order by with it
lead(column_name,offset,default_value)
-- : it fetches the next row value for a column
-- : offset : defines which next value /step size
-- : default value : if preceeding row is not present,populate this
default value

lag(column_name,offset,default_value)
-- : it fetches the previous row value for a column
-- : offset : defines which previous value /step size
-- : default value : if previous row is not present,populate this default
value
*/

select * from student_mark;


-- fetch a sub with min marks for each student
select * from (
select stud_name,sub,marks,
dense_rank() over(partition by rollno order by marks) as dense_rnk
from student_mark
) sq
where dense_rnk=1;

select * from movies;


-- list the movies having highest star rating from each genre
select * from (
select `movie name`,genre, star_rating,
dense_rank() over (partition by genre order by star_rating desc) as rnk
from movies) sq
where rnk=1;

select * from emp;

-- write a query to display only the details of emp


-- who earns the highest and lowest salary from each dept

select emp.emp_id,emp.emp_name,emp.dept_name,emp.salary from emp


inner join
(select *,
min(salary) over (partition by dept_name) as min_sal,
max(salary) over (partition by dept_name) as max_sal
from emp) sq
on emp.emp_id=sq.emp_id
and emp.salary=sq.max_sal
or emp.salary=sq.min_sal;

-- self join
select * from emp_data;
-- employees who are managers
select e.empid,e.mgr_id,e.fname,e.salary
from emp_data e
join emp_data d
on e.empid=d.mgr_id;

/*
inner join /join
left join /left outer join
right join /right outer join
full join /full outer join
*/

You might also like