Practise
Practise
-- select ename from emp where job='clerk' order by sal asc limit 1;
-- select sal from emp where job='clerk' order by hiredate asc limit 1;
-- select * from emp where job='manager' and sal=(select max(sal) from emp where
job='manager') order by hiredate asc limit 1;
-- --or
-- select * from emp where job='manager' order by hiredate asc, sal desc limit 1;
-- select * from emp where job='clerk' order by hiredate desc, sal asc limit 1;
-- select * from emp where job='clerk' and sal>800 order by sal desc;
-- select extract(year from hiredate) as year, count(*) from emp group by year
order by year desc;
-- --3
-- select ename, sal from emp where job='clerk' and deptno=(select deptno from dept
where loc='dallas' );
-- select * from dept where deptno in (select distinct deptno from emp where
job='salesman');
-- select ename,sal from emp where deptno=(select deptno from dept where
loc='chicago') order by hiredate asc limit 1;
-- select loc from dept where deptno=(select deptno from emp where ename='allen');
-- select dname from dept where deptno=(select deptno from emp where
ename='scott');
-- select ename from emp where deptno=(select deptno from dept where
dname='accounting');
-- -----------
-- select ename from emp where deptno=(select deptno from dept where loc='new
york') and ename like 'c%';
-- --or
-- select e.ename from emp e join dept d on e.deptno=d.deptno where d.loc='new
york' and e.ename like 'c%';
-- --or
-- select e.*, d.dname, d.loc from emp e join dept d on e.deptno=d.deptno
-- where d.loc='chicago' and job='salesman'
-- order by sal desc limit 1;
-- select e.* from emp e join dept d on e.deptno=d.deptno where e.job='clerk' and
d.loc='dallas' order by hiredate asc limit 1;
-- select e.* from emp e join dept d on e.deptno=d.deptno where e.job='clerk' and
d.dname='research' and extract(year from hiredate)<=1981;
-- --or
-- SELECT e.*
-- FROM emp e
-- JOIN dept d ON e.deptno = d.deptno
-- WHERE e.job = 'clerk' AND d.dname = 'research' AND e.hiredate <= '1981-12-31';
--
----------------------------------------------------------------------------------
-- --2nd ASSIGNMENT
-- select
-- min(dbms), max(dbms),
-- min(oops), max(oops),
-- min(coa), max(coa),
-- min(toc), max(toc),
-- min(daa), max(daa)
-- from student;
-- select
-- sum(case when dbms<17.5 then 1 else 0 end),
-- sum(case when daa<17.5 then 1 else 0 end),
-- sum(case when coa<17.5 then 1 else 0 end),
-- sum(case when toc<17.5 then 1 else 0 end),
-- sum(case when oops<17.5 then 1 else 0 end)
-- from student;
-- select
-- sum(case when dbms is null then 1 else 0 end),
-- sum(case when daa is null then 1 else 0 end),
-- sum(case when coa is null then 1 else 0 end),
-- sum(case when toc is null then 1 else 0 end),
-- sum(case when oops is null then 1 else 0 end)
-- from student;
-- select sbranch, count(*) from student where dbms>=17.5 and daa>=17.5 and
coa>=17.5 and toc>=17.5 and oops>=17.5 group by sbranch;
-- select sbranch, count(*) from student where dbms is null or daa is null or coa
is null or toc is null or oops is null group by sbranch;
-- select sbranch, count(*) from student where dbms is not null or daa is not null
or coa is not null or toc is not null or oops is not null group by sbranch;
-- SELECT 'DBMS' AS subject, MAX(DBMS) AS max_marks FROM Student WHERE DBMS > 35
-- UNION
-- SELECT 'DAA', MAX(DAA) FROM Student WHERE DAA > 35
-- UNION
-- SELECT 'COA', MAX(COA) FROM Student WHERE COA > 35
-- UNION
-- SELECT 'TOC', MAX(TOC) FROM Student WHERE TOC > 35
-- UNION
-- SELECT 'OOPS', MAX(OOPS) FROM Student WHERE OOPS > 35;
-- SELECT 'DBMS' AS subject, MIN(DBMS) FROM Student WHERE DBMS > 17.5
-- UNION
-- SELECT 'DAA', MIN(DAA) FROM Student WHERE DAA > 17.5
-- UNION
-- SELECT 'COA', MIN(COA) FROM Student WHERE COA > 17.5
-- UNION
-- SELECT 'TOC', MIN(TOC) FROM Student WHERE TOC > 17.5
-- UNION
-- SELECT 'OOPS', MIN(OOPS) FROM Student WHERE OOPS > 17.5
-- ORDER BY MIN DESC;
-- SELECT 'DBMS' AS subject, sid FROM Student WHERE DBMS = (SELECT MAX(DBMS) FROM
Student)
-- UNION
-- SELECT 'DAA', sid FROM Student WHERE DAA = (SELECT MAX(DAA) FROM Student)
-- UNION
-- SELECT 'COA', sid FROM Student WHERE COA = (SELECT MAX(COA) FROM Student)
-- UNION
-- SELECT 'TOC', sid FROM Student WHERE TOC = (SELECT MAX(TOC) FROM Student)
-- UNION
-- SELECT 'OOPS', sid FROM Student WHERE OOPS = (SELECT MAX(OOPS) FROM Student);
--
----------------------------------------------------------------------------------
-- --common table expression
-- union all
-- select e.empno,e.ename,e.mgr,h.level+1
-- from emp e join emp_hierarchy h
-- on e.mgr=h.empno
-- )
-- select * from emp_hierarchy
-- order by level,mgr asc nulls first ;
-- do $$
-- declare
-- rec record;
-- stack int[] := array[]::int[];
-- curr_mgr int := null;
-- begin
-- for rec in select empno from emp where mgr is null
-- loop
-- stack := array_append(stack,rec.empno);
-- end loop;
-- while array_length(stack,1)>0
-- loop
-- curr_mgr := stack[array_length(stack,1)];
-- stack := stack[1:array_length(stack,1)-1];
-- raise notice 'Manager: %', curr_mgr;
-- loop
-- raise notice ' Employee: %', rec.empno;
-- stack := array_append(stack, rec.empno);
-- end loop;
-- end loop;
-- INSERT INTO emp(empno, ename, job, hiredate, mgr, sal, comm, deptno) VALUES
-- (1, 'Alice', 'Manager', '2020-01-01', 3, 5000, NULL, 10),
-- (2, 'Bob', 'Clerk', '2020-02-01', 1, 3000, NULL, 10),
-- (3, 'Charlie', 'Analyst', '2020-03-01', 2, 4000, NULL, 10);
-- union all
-- -- Create the 'reg' table with RegID as PRIMARY KEY and a unique constraint on
(RegNo, CourseCode)
-- CREATE TABLE reg (
-- RegID INT PRIMARY KEY,
-- RegNo VARCHAR NOT NULL,
-- RollNo VARCHAR,
-- Ayear INT,
-- Asem INT,
-- PYS VARCHAR,
-- CourseCode VARCHAR NOT NULL,
-- Dept VARCHAR,
-- FOREIGN KEY (CourseCode) REFERENCES course(CourseCode),
-- FOREIGN KEY (RegNo) REFERENCES students(RegNo),
-- CONSTRAINT unique_student_course UNIQUE (RegNo, CourseCode)
-- );
-- select
-- r.regno,SUM(c.credits * gp.points) / SUM(c.credits) AS cgpa
-- from
-- reg r
-- join
-- course c ON r.coursecode = c.coursecode
-- join
-- marksgrade m ON r.regno = m.regno
-- join
-- gradepoints gp ON m.grade = gp.grade
-- group by r.regno
-- order by cgpa desc;
--
----------------------------------------------------------------------------------
-- do $$
-- declare rec record;
-- cur cursor
-- for select r.regno, sum(c.credits*gp.points)/sum(c.credits) as cgpa,
sum(c.credits) as credits from reg r join course c on r.coursecode=c.coursecode
join marksgrade m on r.regno=m.regno join gradepoints gp on m.grade=gp.grade group
by r.regno having sum(c.credits*gp.points)/sum(c.credits)>=7.5 and
sum(c.credits)>=80;
-- begin
-- open cur;
-- loop
-- fetch cur into rec;
-- exit when not found;
-- raise notice 'regno: %, cgpa: %, credits: %',rec.regno,rec.cgpa,rec.credits;
-- end loop;
-- close cur;
-- end $$;
-- do $$
-- declare rec record;
-- cur cursor
-- for select r.regno, sum(c.credits) as credits from reg r join course c
on r.coursecode=c.coursecode join marksgrade m on r.regno=m.regno join gradepoints
gp on m.grade=gp.grade group by r.regno having sum(c.credits)>=190;
-- begin
-- open cur;
-- loop
-- fetch cur into rec;
-- exit when not found;
-- raise notice '% ',rec.credits;
-- end loop;
-- close cur;
-- end $$;
-- -- do $$
-- -- declare rec record;
-- -- cur cursor for
-- -- query;
-- -- begin
-- -- open cur;
-- -- loop
-- -- fetch cur into rec;
-- -- exit when not found;
-- -- raise notice
-- -- end loop;
-- -- close cur;
-- -- end $$;
-- do $$
-- declare rec record;
-- cur cursor for
-- select r.regno, sum(c.credits*gp.points)/sum(c.credits) as cgpa,
sum(c.credits) as credits from reg r join course c on r.coursecode=c.coursecode
join marksgrade m on r.regno=m.regno join gradepoints gp on m.grade=gp.grade group
by r.regno having sum(c.credits*gp.points)/sum(c.credits)>=8.0 and
sum(c.credits)>=190 and count(*) filter (where m.grade='F')>0;
-- begin
-- open cur;
-- loop
-- fetch cur into rec;
-- exit when not found;
-- raise notice 'reg: % | cgpa: % | credits: % ',rec.regno,
rec.cgpa,rec.credits;
-- end loop;
-- close cur;
-- end $$;
--
----------------------------------------------------------------------------------
-- do $$
-- declare rec record;
-- cur cursor for
-- select * from (
-- select r.dept,
-- r.regno,
-- sum(c.credits*gp.points)/sum(c.credits) as cgpa,
-- sum(c.credits) as credits, rank() over (partition by r.dept order by
sum(c.credits*gp.points)/sum(c.credits) desc) as rnk
-- from reg r
-- join
-- course c on r.coursecode=c.coursecode
-- join
-- marksgrade m on r.regno=m.regno
-- join
-- gradepoints gp on m.grade=gp.grade
-- group by
-- r.dept,r.regno
-- having
-- count(*) filter (where m.grade='F')=0
-- ) ranked where rnk<=5;
-- begin
-- open cur;
-- loop
-- fetch cur into rec;
-- exit when not found;
-- raise notice 'dept: %, regno: %, cgpa: %
',rec.dept,rec.regno,round(rec.cgpa,2);
-- end loop;
-- close cur;
-- end $$;
--
----------------------------------------------------------------------------------
-- update adm
-- set name='Celia'
-- where name='Celi';
-- select * from adm;
--
----------------------------------------------------------------------------------
--insert into dept(deptno,dname,loc) values (50,'hr','california');
-- insert into dept(deptno,dname,loc) values (50,'hr','california'),
(60,'web&network','san francisco');
-- INSERT INTO emp(empno, ename, job, hiredate, mgr, sal, comm, deptno) VALUES
-- (7769, 'sam', 'clerk', '1981-05-20', 7839, 2000, 0, NULL),
-- (7469, 'ram', 'analyst', '1982-06-10', 7698, 3000, 0, NULL),
-- (7596, 'rahul', 'clerk', '1981-11-13', 7639, 2500, 200, NULL),
-- (7367, 'rajesh', 'salesman', '1982-08-11', 7769, 3200, 500, NULL),
-- (7473, 'aman', 'analyst', '1982-07-07', 7839, 2700, 300, NULL),
-- (7639, 'vishal', 'salesman', '1981-12-08', 7473, 2000, 0, NULL);
-- select e.* from emp e left join dept d on e.deptno=d.deptno where d.deptno is
null;
-- select * from emp where job='clerk' and sal>2000 and deptno is null;
-- select * from emp where job='salesman' and deptno is null and extract(year from
hiredate)=1981;
-- select * from emp where deptno is null and extract(year from hiredate)=1981;
-- select d.*,e.ename from dept d left outer join emp e on d.deptno=e.deptno where
e.empno is null;
-- select e.ename, e.empno from emp e left join dept d on e.deptno=d.deptno where
d.dname is null and d.loc is null;
-- select e.*,d.* from emp e full outer join dept d on e.deptno=d.deptno where
e.deptno is null or e.empno is null;
-- select count(*) from dept d left outer join emp e on d.deptno=e.deptno where
e.empno is null;
-- select * from emp where deptno is null and job='analyst' and sal<3000;
-----------------------------------------
-- DROP TRIGGER IF EXISTS upst ON emp;
-- DROP FUNCTION IF EXISTS ups();
-- create or replace function ups()
-- returns trigger
-- language plpgsql
-- as $$
-- begin
-- if new.sal<old.sal then
-- raise exception 'nope %',new.sal;
-- end if;
-- return new;
-- end;
-- $$;
-- update emp
-- set sal=20
-- where empno=7369;
-- update emp
-- set age=20
-- where empno=7369;
-- return old;
-- end;
-- $$;
-----------------------------------------------------------------------------------
---
-- select pt();
-----------------------------------------------------------------------------------
---
begin;
savepoint sp1;
update BankAccounts
set Balance=Balance+100
where Name='Alex'
savepoint sp2;
update BankAccounts
set Balance=Balance-300
where Name='Bob';
savepoint sp3;
commit;
begin;
savepoint sp4;
commit;
create or replace view mgr as select case when Role='Admin' then Name else null end
from Users;