CREATE TABLE DEPARTMENT( name VARCHAR(50) NOT NULL, code CHAR(5) NOT NULL, total_staff_number DECIMAL(2) NOT NULL, chair VARCHAR(50) NULL, budget DECIMAL(9,1) NOT NULL, CONSTRAINT dept_pkey PRIMARY KEY(name), CONSTRAINT dept_ckey1 UNIQUE(code), CONSTRAINT dept_ckey2 UNIQUE(chair), CONSTRAINT dept_check1 CHECK (total_staff_number BETWEEN 1 AND 50) );
CREATE TABLE COURSE(
cnum CHAR(7) NOT NULL,
title VARCHAR(200) NOT NULL,
credits DECIMAL(2) NOT NULL,
offered_by VARCHAR(50) NULL,
CONSTRAINT course_pkey PRIMARY KEY(cnum),
CONSTRAINT course_check1 CHECK (credits IN (6, 12)),
CONSTRAINT course_fkey1 FOREIGN KEY(offered_by)
REFERENCES DEPARTMENT(name) ON DELETE CASCADE );
( SELECT count(*) FROM COURSE WHERE COURSE.offered_by = ... )
SELECT DEPARTMENT.chair
FROM DEPARTMENT
WHERE ( SELECT count(*)
FROM COURSE
WHERE COURSE.offered_by = DEPARTMENT.name ) > 1;
( SELECT offered_by, count(*) total FROM COURSE GROUP BY offered_by HAVING count(*) > 1 ) MORETHAN1
SELECT DEPARTMENT.chair, MORETHAN1.total
FROM DEPARTMENT JOIN ( SELECT offered_by, count(*) total
FROM COURSE
GROUP BY offered_by
HAVING count(*) > 1 ) MORETHAN1
ON DEPARTMENT.name = MORETHAN1.offered_by;
( SELECT count(*) FROM COURSE WHERE COURSE.offered_by = ... ) TOTALC
( SELECT chair, ( SELECT count(*)
FROM COURSE
WHERE COURSE.offered_by = DEPARTMENT.name ) TOTALC
FROM DEPARTMENT ) CHAIRTOTAL
SELECT chair, TOTALC
FROM ( SELECT chair, ( SELECT count(*)
FROM COURSE
WHERE COURSE.offered_by = DEPARTMENT.name ) TOTALC
FROM DEPARTMENT ) CHAIRTOTAL
WHERE CHAIRTOTAL.TOTALC > 1;
WITH DEPT_COURSE AS
( SELECT name, cnum
FROM DEPARTMENT LEFT OUTER JOIN COURSE
ON DEPARTMENT.name = COURSE.offered_by ),
WITH DEPT_COURSE AS
( SELECT name, cnum
FROM DEPARTMENT LEFT OUTER JOIN COURSE
ON DEPARTMENT.name = COURSE.offered_by ),
DC_COUNT AS
( SELECT name, COUNT(cnum) total_courses
FROM DEPT_COURSE
GROUP BY name )
WITH DEPT_COURSE AS
( SELECT name, cnum
FROM DEPARTMENT LEFT OUTER JOIN COURSE
ON DEPARTMENT.name = COURSE.offered_by ),
DC_COUNT AS
( SELECT name, COUNT(cnum) total_courses
FROM DEPT_COURSE
GROUP BY name )
SELECT name
FROM DC_COUNT);
WITH COURSE6CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 6 ),
WITH COURSE6CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 6 ),
COURSE12CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 12 ),
WITH COURSE6CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 6 ),
COURSE12CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 12 ),
COURSE6_12CR AS
( SELECT COURSE6CR.offered_by
FROM COURSE6CR JOIN COURSE12CR
ON COURSE6CR.offered_by = COURSE12CR.offered_by ),
WITH COURSE6CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 6 ),
COURSE12CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 12 ),
COURSE6_12CR AS
( SELECT COURSE6CR.offered_by
FROM COURSE6CR JOIN COURSE12CR
ON COURSE6CR.offered_by = COURSE12CR.offered_by ),
CHAIR AS
( SELECT DEPARTMENT.chair
FROM COURSE6_12CR JOIN DEPARTMENT
ON COURSE6_12CR.offered_by = DEPARTMENT.name )
WITH COURSE6CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 6 ),
COURSE12CR AS
( SELECT offered_by
FROM COURSE
WHERE credits = 12 ),
COURSE6_12CR AS
( SELECT COURSE6CR.offered_by
FROM COURSE6CR JOIN COURSE12CR
ON COURSE6CR.offered_by = COURSE12CR.offered_by ),
CHAIR AS
( SELECT DEPARTMENT.chair
FROM COURSE6_12CR JOIN DEPARTMENT
ON COURSE6_12CR.offered_by = DEPARTMENT.name )
SELECT *
FROM CHAIR;


CREATE VIEW VDEPT( name, total_courses ) AS
( SELECT name, count(COURSE.cnum)
FROM DEPARTMENT LEFT OUTER JOIN COURSE
ON DEPARTMENT.name = COURSE.offered_by
GROUP BY DEPARTMENT.name );
SELECT name FROM VDEPT WHERE total_courses > 1;
SELECT name, count(cnum)
FROM DEPARTMENT LEFT OUTER JOIN COURSE
ON DEPARTMENT.name = COURSE.offered_by
GROUP BY name
HAVING count(cnum) > 1;
CREATE VIEW V6( name ) AS ( SELECT offered_by FROM COURSE WHERE credits = 6 );
CREATE VIEW V12( name ) AS ( SELECT offered_by FROM COURSE WHERE credits = 12 );
CREATE VIEW VNAME( name ) AS
( SELECT V6.name
FROM V6 JOIN V12
ON V6.name = V12.name );
CREATE VIEW VCHAIR( chair ) AS ( SELECT DEPARTMENT.chair FROM VNAME JOIN DEPARTMENT ON VNAME.name = DEPARTMENT.NAME );
SELECT * FROM VCHAIR;