כל מה שצריך לדעת על Views ב-SQL

Views הן אחד מהכלים החשובים והחזקים ביותר ב-SQL, והן מאפשרות לנו לעבוד בצורה חכמה ויעילה עם נתונים מבלי לשכפל מידע או להעמיס על בסיס הנתונים. במאמר הזה, נפרק את המושג הזה לפרטי פרטים, נסביר כיצד להשתמש בו בצורה נכונה, ונדגים מקרים שכיחים שבהם תשתמשו ב-Views בעבודה היומיומית שלכם.

תוכן עניינים

מהו View?

View הוא בעצם שאילתה שמאוחסנת בבסיס הנתונים, ומחזירה לנו נתונים כמו טבלה וירטואלית. ניתן להתייחס אליו כאל טבלה רגילה, אבל במקום לאחסן את הנתונים פיזית, הוא אוגר את הלוגיקה של השאילתה. כל פעם שתשאלו את ה-View, הוא יריץ את השאילתה שבניתם ויחזיר את התוצאות העדכניות ביותר מתוך הטבלאות המקוריות.

למה להשתמש ב-Views?

  • פישוט של לוגיקה מורכבת: במקום להריץ שאילתה מורכבת מחדש בכל פעם, אפשר לאחסן אותה כ-View. לדוגמה, אם יש לכם חיבור (JOIN) בין מספר טבלאות או שאילתות מסובכות אחרות, תוכלו ליצור View שישמש כאילו הוא טבלה רגילה.

  • שכבת אבטחה: View יכול לשמש כמסנן לנתונים רגישים. לדוגמה, אפשר ליצור View שמציג רק חלק מהעמודות בטבלה, וכך להסתיר עמודות רגישות מבלי לתת גישה לטבלה המקורית.

  • ביצועים משופרים: Views אינן מאחסנות נתונים בעצמן, אבל במקרים מסוימים אפשר לשפר ביצועים על ידי יצירת View, ובשימוש נכון ניתן להימנע משאילתות כבדות מדי שמעמיסות על המערכת.

  • הפשטת המידע: במערכות מידע גדולות, ייתכן שתהיו חייבים לחבר מספר טבלאות ממקורות שונים כדי לקבל את הנתונים הדרושים לכם. View מאפשר לכם לבנות שאילתה אחת שתאחד את כל הנתונים, ואז פשוט לקרוא ל-View כמו לקרוא לטבלה רגילה.

איך יוצרים View?

התחביר ליצירת View ב-SQL הוא פשוט וברור. בואו נראה דוגמה:

				
					<xmp>CREATE VIEW ViewName AS
SELECT column1, column2, column3
FROM TableName
WHERE condition;
</xmp>
				
			

במקרה הזה, אנחנו יוצרים View שמחזיר עמודות מסוימות מתוך טבלה קיימת, על בסיס תנאי שהגדרנו.

דוגמה מעשית

נניח שיש לנו טבלת עובדים עם פרטי משכורות. אנחנו רוצים ליצור View שיציג רק את שם העובד והמשכורת שלו, מבלי לחשוף פרטים אחרים כמו כתובת או תעודת זהות:

				
					<xmp>CREATE VIEW EmployeeSalaries AS
SELECT EmployeeName, Salary
FROM Employees;
</xmp>
				
			

עכשיו, כל פעם שנרצה לקבל את פרטי המשכורות, נוכל פשוט להריץ:

				
					<xmp>SELECT * FROM EmployeeSalaries;</xmp>
				
			

עדכון נתונים באמצעות View

חשוב לדעת ש-Views מסוימים ניתנים גם לעדכון. אם View מבוסס על טבלה אחת ואין בו שימוש בפונקציות אגרגטיביות (כמו SUM, AVG, וכו'), תוכלו לעדכן נתונים דרכו ממש כמו שהייתם מעדכנים טבלה רגילה.

אם לדוגמה יש לנו View פשוט כמו:

 
				
					<xmp>CREATE VIEW EmployeeContact AS
SELECT EmployeeID, EmployeeName, PhoneNumber
FROM Employees;
</xmp>
				
			

נוכל לעדכן את מספר הטלפון של עובד מסויים בצורה הבאה:

				
					<xmp>UPDATE EmployeeContact
SET PhoneNumber = '123-456-7890'
WHERE EmployeeID = 1;</xmp>
				
			

השינוי הזה יתבצע ישירות על הטבלה המקורית שממנה ה-View נוצר.

מתי אי אפשר לעדכן View?

למרות הנוחות שבעדכון Views, ישנם מספר מקרים בהם לא ניתן לעדכן View, והם נובעים בעיקר מהמורכבות של השאילתה שמגדירה את ה-View. אם השאילתה כוללת מאפיינים שאינם נתונים לעדכון ישיר, זה יגרום לבעיות בעדכון ה-View.

View עם פונקציות אגרגטיביות

אם ה-View שלכם משתמש בפונקציות אגרגטיביות כמו SUM, AVG, COUNT, MAX, או MIN, לא תוכלו לעדכן אותו. הסיבה לכך היא שפונקציות אלו מחזירות ערכים המחושבים על בסיס מספר רשומות, ולכן אין דרך לעדכן רשומה בודדת ישירות.

				
					<xmp>CREATE VIEW EmployeeSalariesSummary AS
SELECT DepartmentID, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY DepartmentID;</xmp>
				
			

ב-View הזה, לא נוכל לעדכן את הערך של AvgSalary כי מדובר בערך מחושב שמבוסס על מספר רשומות. כל ניסיון לעדכן אותו יהיה בלתי אפשרי מבחינת המערכת.

View שמבוסס על JOIN בין מספר טבלאות

אם ה-View מבוסס על חיבור בין מספר טבלאות (JOIN), העדכון הופך להיות בעייתי או בלתי אפשרי. הסיבה היא שהמנוע של SQL מתקשה להבין איזו טבלה לעדכן במקרה של חיבור בין מספר טבלאות.

				
					<xmp>CREATE VIEW EmployeeDepartment AS
SELECT Employees.EmployeeID, Employees.EmployeeName, Departments.DepartmentName
FROM Employees
JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;</xmp>
				
			

כאן, לא ניתן יהיה לעדכן את העמודות של ה-View, משום שהן מבוססות על נתונים משתי טבלאות שונות. אם היינו מנסים לעדכן את השם של המחלקה למשל, בסיס הנתונים לא היה יודע איך לעדכן את הנתון הזה בכל אחת מהטבלאות המעורבות.

View עם DISTINCT או TOP

אם ה-View כולל שימוש ב-DISTINCT (למניעת כפילויות) או ב-TOP (להגבלת מספר הרשומות המוחזרות), לא ניתן יהיה לעדכן אותו. הסיבה היא שהמנוע של SQL לא יכול לדעת בוודאות איזו רשומה בדיוק יש לעדכן, כי הוא מסתמך על תוצאות מסוננות או מוגבלות.

				
					<xmp>CREATE VIEW TopEmployees AS
SELECT TOP 10 EmployeeID, EmployeeName, Salary
FROM Employees
ORDER BY Salary DESC;</xmp>
				
			

במקרה הזה, לא ניתן לעדכן את השכר של עובד מתוך ה-View הזה, משום שה-View מחזיר רק את עשרת העובדים עם השכר הגבוה ביותר ולא את כל העובדים.

View עם UNION

אם ה-View מבוסס על איחוד טבלאות באמצעות UNION, לא נוכל לעדכן אותו. הסיבה היא שהאיחוד יכול לכלול מספר טבלאות עם מבנים שונים, ולכן אין דרך ישירה לעדכן נתונים במבנה מורכב כזה.

				
					<xmp>CREATE VIEW AllEmployees AS
SELECT EmployeeID, EmployeeName FROM Employees
UNION
SELECT ContractorID, ContractorName FROM Contractors;</xmp>
				
			

במקרה הזה, לא נוכל לעדכן את שמות העובדים או הקבלנים דרך ה-View כי הוא מבוסס על שני מקורות שונים.

View עם Subquery

במקרים שבהם ה-View מבוסס על שאילתות פנימיות (Subqueries), המצב נהיה מורכב יותר ולעיתים קרובות לא ניתן לעדכן נתונים דרך ה-View.

				
					<xmp>CREATE VIEW EmployeeSales AS
SELECT EmployeeID, EmployeeName, 
       (SELECT SUM(SalesAmount) FROM Sales WHERE Sales.EmployeeID = Employees.EmployeeID) AS TotalSales
FROM Employees;</xmp>
				
			

במקרה הזה, השאילתה הפנימית מחזירה סך מכירות עבור כל עובד, ולכן לא ניתן לעדכן את ה-View באופן ישיר.

דברו איתנו