ה-View הוא טבלה שמאחסנת נתונים משאילתא.
יתרונות השימוש ב-VIEW:
- פיקוח על המידע המוצג ל-user.
- הסתרת מידע מגורמים שהמידע אינו רלוונטי להם.
- הסתרת עיצוב מורכב של ה-database.
- שיפור ביצועים.
- מארגן מידע עבור ייצוא לאפליקציות אחרות.
- מקל על כתיבת שאילתות מסובכות.
יצירת view:
CREATE VIEW view_name [(alias,…)]
AS
שאילתה
[WITH CHECK OPTION]
דוגמא: view המציג את פרטי העובדים שמוגדר להם איזור.
CREATE VIEW emp_det_vw
AS
SELECT employeeID, lastname, firstname, birthdate
FROM employees
WHERE Region IS NOT NULL
הרצת ה-view:
SELECT * FROM emp_det_vw
דוגמא: יצירת view המציג פרטים לגבי הזמנות שהמשלוח שלהן לא מבוצע בזמן, עבור כל הזמנה כזו יוצג שם הלקוח מספר ההזמנה ותאריך המשלוח.
CREATE VIEW shipStatusView
AS
SELECT o.OrderId,o.ShippedDate,c.ContactName
FROM Customers c Inner Join Orders o
ON c.CustomerId=o.CustomerId
WHERE RequiredDate<ShippedDate
אפשר להפעיל על view שאילתות כמו על טבלאות רגילות.
פקודות DML אפשריות אם:
- יש הרשאה.
- ה-view מורכב מנתונים של טבלה אחת בלבד.
- יש בפעולה ערך לכל השדות שלא יכולים לקבל NULL או שיש להם ברירת מחדל.
- אין שימוש ב=DISTINCT או ב-GROUP BY.
שינוי View
ALTER VIEW view_name [(alias,…)]
AS
שאילתה
הגבלת נתונים
במידה ויש שימוש ב-WITH CHECK OPTION, אפשר יהיה לבצע פעולות DML שתואמות לתנאי ה-Where בלבד.
למשל בדוגמא לא ניתן להוסיף מור שמחירו מעל 20 ולא ניתן לעדכן מוצר מחיר שגדול מ-20.
CREATE VIEW LOW_PRICED_PRODUCTS
AS
SELECT *
FROM Products
WHERE UnitPrice < 20
WITH CHECK OPTION
מחיקת view
DROP VIEW view_name
תרגול View
use Northwind
-- ex1
CREATE VIEW emp_vw
AS
SELECT employeeID, lastname, firstname, [address]
FROM employees
WHERE city = 'Tacoma' or city = 'London'
SELECT * FROM emp_vw
-- ex2
CREATE VIEW pro_vw
AS
SELECT avg(UnitPrice) as avg_price
FROM Products
WHERE ProductID in (1, 2, 4)
select * from pro_vw
-- ex3
alter view pro_vw
as
SELECT p.ProductName, c.CategoryName, avg(UnitPrice) as avg_price
FROM Products p INNER JOIN Categories c
On p.CategoryID = c.CategoryID
GROUP BY c.CategoryName, p.ProductName
having avg(UnitPrice) > 25
-- ex4
CREATE VIEW cust_orders_vw
as
SELECT o.CustomerID, c.CompanyName, count(*) as "num of orders"
FROM Orders o INNER JOIN Customers c
ON o.CustomerID = c.CustomerID
GROUP BY o.CustomerID, c.CompanyName
select * from cust_orders_vw
-- ex5
select companyName
from cust_orders_vw
where [num of orders] > 10
-- ex6
CREATE VIEW Prods
as
select ProductID, ProductName, UnitPrice, (UnitsInStock-UnitsOnOrder) as UnitsLeft
from products
where UnitPrice < 30
select * from Prods
-- ex7
BEGIN TRAN
update products
set ProductName = 'Jiffa'
where ProductID = 52
update products
set UnitPrice = 31
where ProductID = 52
COMMIT
select *
from Prods
where ProductID = 52