CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

28
CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS <select> [WITH CHECK OPTION];

Transcript of CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Page 1: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

CREATE VIEW SYNTAX

CREATE VIEW name [(view_col [, view_col …])]

AS <select> [WITH CHECK OPTION];

Page 2: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views Question: Since views look like tables to

users, can they be updated? Answer: Yes – a view update changes the

underlying base table to produce the requested change to the view

CREATE VIEW CsReg (StudId, CrsCode, Semester) ASSELECT E.StudId, E.CrsCode, E.SemesterFROM Enrolled EWHERE E.CrsCode LIKE ‘CS%’ AND E.Semester=‘S2000’

Page 3: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views - Problem 1

Question: What value should be placed in attributes of underlying table that have been projected out (e.g., Grade)?

Answer: NULL (assuming null allowed in the missing attribute) or DEFAULT

INSERT INTO CsReg (StudId, CrsCode, Semester)VALUES (1111, ‘CSE305’, ‘S2000’)

Page 4: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views - Problem 2

Problem: New tuple not in view Solution: Allow insertion (assuming

the ‘WITH CHECK OPTION’ clause has not been appended to the CREATE VIEW statement)

INSERT INTO CsReg (StudId, CrsCode, Semester)VALUES (1111, ‘ECO105’, ‘S2000’)

Page 5: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views - Problem 3

Update to the view might not uniquely specify the change to the base table(s) that results in the desired modification of the view

CREATE VIEW ProfDept (PrName, DeName) ASSELECT P.Name, D.NameFROM Professor P, Department DWHERE P.DeptId = D.DeptId

Page 6: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views - Problem 3 Tuple (Smith, CS) can be deleted from

ProfDept by: Deleting row for Smith from Professor (but this

is inappropriate if he is still at the University) Deleting row for CS from Department (not

what is intended) Updating row for Smith in Professor by setting

DeptId to null (seems like a good idea)

Page 7: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Updating Views -Restrictions

Updatable views are restricted to those in which No Cartesian product in FROM clause no aggregates, GROUP BY, HAVING …For example, if we allowed: CREATE VIEW AvgSalary (DeptId, Avg_Sal ) AS SELECT E.DeptId, AVG(E.Salary) FROM Employee E GROUP BY E.DeptIdthen how do we handle: UPDATE AvgSalary SET Avg_Sal = 1.1 * Avg_Sal

Page 8: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Nested QueriesList all courses that were not taught in S2000

SELECT C.CrsNameFROM Course CWHERE C.CrsCode NOT IN (SELECT T.CrsCode --subquery FROM Teaching T WHERE T.Sem = ‘S2000’)

Evaluation strategy: subquery evaluated once toproduces set of courses taught in S2000. Each row(as C) tested against this set.

Page 9: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Correlated Nested Queries

Output a row <prof, dept> if prof has taught a course in dept.

SELECT T.ProfId --subqueryFROM Teaching T, Course CWHERE T.CrsCode=C.CrsCode AND C.DeptId=D.DeptId --correlation

SELECT P.Name, D.Name --outer query FROM Professor P, Department D WHERE P.Id IN (set of Id’s of all profs who have taught a course in D.DeptId)

Page 10: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Correlated Nested Queries Tuple variables T and C are local to subquery Tuple variables P and D are global to subquery Correlation: subquery uses a global variable, D The value of D.DeptId parameterizes an

evaluation of the subquery Subquery must (at least) be re-evaluated for

each distinct value of D.DeptId Correlated queries can be expensive to evaluate

Page 11: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Set Operators

SQL provides UNION, EXCEPT (set difference), and INTERSECT for union compatible tables.

Example: Find all professors in the CS Department and all professors that have taught CS courses

(SELECT P.NameFROM Professor P, Teaching TWHERE P.Id=T.ProfId AND T.CrsCode LIKE ‘CS%’)UNION(SELECT P.NameFROM Professor PWHERE P.DeptId = ‘CS’)

Page 12: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Exists and not exists

Query: Addresses of the depots where product P35 is stocked.

Solution1:

Select d.#dep, d.address from depot d, stock s where s.#prod=‘P35’ and s.#dep=d.#dep

Solution 2:

Select d.#depot, d.address from depot d where exists (select * from stock s where s.#prod=‘P35’ and s.#depot = d.#depot)

Page 13: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Division Query type: Find the subset of

items in one set that are related to all items in another set

Example: Find professors who have taught courses in all departments

ProfId DeptIdDeptId

All department IdsContains row<p,d> if professorp has taught acourse in department d

Page 14: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Division – Example 1 Strategy for implementing

division in SQL: Find set of all departments in which

a particular professor, p, has taught a course - A

Find set of all departments - B Output p if A B, or equivalently if

B-A is empty

Page 15: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Division – SQL Solution 1

SELECT P.IdFROM Professor PWHERE NOT EXISTS (SELECT D.DeptId -- B: set of all dept Ids FROM Department D EXCEPT SELECT C.DeptId -- A: set of dept Ids of depts in -- which P has taught a course FROM Teaching T, Course C WHERE T.ProfId=P.Id --global variable AND T.CrsCode=C.CrsCode)

Page 16: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Division – Example 2

Depots numbers and addresses of the depots that stocked all the products.

Tuple relational calculus:

{d.#depot, d.address | depot(d) and for all p, product(p) there exists s, stock(s) and s.#prod=p.#prod and s.#depot=d.#depot}

Page 17: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

SQL code – Example 2Select d.#depot, d.address

From depot d

Where not exists (select * from product p

where not exists (

select * from stock s

where

s.#prod=p.#prod

and

s.#depot = d.#depot)

Page 18: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Duplicates Duplicate rows not allowed in a

relation However, duplicate elimination from

query result is costly and not automatically done; it must be explicitly requested:

SELECT DISTINCT …..FROM …..

Page 19: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Aggregates

Functions that operate on sets: COUNT, SUM, AVG, MAX, MIN

Produce numbers (not tables) Not part of relational algebra

SELECT COUNT(*)FROM Professor P

SELECT MAX (Salary)FROM Employee E

Page 20: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Aggregates

SELECT COUNT (T.CrsCode)FROM Teaching TWHERE T.Semester = ‘S2000’

SELECT COUNT (DISTINCT T.CrsCode)FROM Teaching TWHERE T.Semester = ‘S2000’

Count the number of courses taught in S2000

But if multiple sections of same course are taught, use:

Page 21: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Aggregates: Proper and Improper Usage

SELECT COUNT (T.CrsCode), T. ProfId …… --makes no sense (in the absence of GROUP BY clause)

SELECT COUNT (*), AVG (T.Grade) …… --but this is OK

WHERE T.Grade > COUNT (SELECT …. --aggregate cannot be applied to result of SELECT statement

Page 22: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

GROUP BY Table output by WHERE clause: - Divide rows into groups based on subset of attributes; - All members of a group agree on those attributes

Each group can be described by a singlerow in a table with attributes limited to: -Attributes all group members share (listed in GROUP BY clause) -Aggregates over group

grou

p

GROUPBYattributes

aabbcccccddd

Page 23: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

GROUP BY - Example

SELECT E.StudId, AVG(E.Grade), COUNT (*)FROM Enrolled EGROUP BY E.StudId

Enrolled

Attributes: -student’s Id -avg grade -number of courses

1234 3.3 41234123412341234

Page 24: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

HAVING Clause

Eliminates unwanted groups (analogous to WHERE clause) HAVING condition constructed from attributes of GROUP

BY list and aggregates of attributes not in list

SELECT E.StudId, AVG(E.Grade) AS CumGpa, COUNT (*) AS NumCrsFROM Enrolled EWHERE E.CrsCode LIKE ‘CS%’GROUP BY E.StudIdHAVING AVG (E.Grade) > 3.5

Page 25: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Example Output the name and address of all

seniors on the Dean’s List

SELECT S.Name, S.AddressFROM Student S, Enrolled TWHERE S.StudId = T.StudId AND S.Status = ‘senior’

GROUP BY

HAVING AVG (T.Grade) > 3.5 AND SUM (T.Credit) > 90

S.StudId -- wrongS.Name, S.Address -- right

Page 26: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

ORDER BY Clause Causes rows to be output in a

specified order

SELECT T.StudId, COUNT (*) AS NumCrs, AVG(T.Grade) AS CumGpaFROM Enrolled TWHERE T.CrsCode LIKE ‘CS%’GROUP BY T.StudIdHAVING AVG (T.Grade) > 3.5ORDER BY DESC CumGpa, ASC StudId

Page 27: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Query Evaluation Strategy

1 Evaluate FROM: produces Cartesian product, A, of tables in FROM list

2 Evaluate WHERE: produces table, B, consisting of rows of A that satisfy WHERE condition

3 Evaluate GROUP BY: partitions B into groups that agree on attribute values in GROUP BY list

Page 28: CREATE VIEW SYNTAX CREATE VIEW name [(view_col [, view_col …])] AS [WITH CHECK OPTION];

Query Evaluation Strategy

4 Evaluate HAVING: eliminates groups in B that do not satisfy HAVING condition5 Evaluate SELECT: produces table C containing a row for each group. Attributes in SELECT list limited to those in GROUP BY list and aggregates over group6 Evaluate ORDER BY: orders rows of C