SQL Server Training with AdventureWorks Sample Database

آموزش گام‌به‌گام SQL Server با دیتابیس نمونه‌ی AdventureWorks | از مبتدی تا پیشرفته | (قسمت ۸)


درس ۸: ایجاد و استفاده از Viewها (View)

🎯 هدف درس:

در این درس یاد می‌گیرید که View چیست، چگونه ساخته می‌شود و چه کاربردی در ساده‌سازی کوئری‌ها دارد. Viewها به شما کمک می‌کنند داده‌های پیچیده را در قالب جداول مجازی ذخیره و استفاده کنید.

📘 مفهوم نظری:

View در SQL Server یک جدول مجازی است که نتیجهٔ اجرای یک کوئری را نمایش می‌دهد. داده‌های View به‌صورت فیزیکی ذخیره نمی‌شوند، بلکه هر بار از کوئری اصلی بازیابی می‌شوند. هدف آن افزایش خوانایی، امنیت و سادگی کوئری‌هاست.

۱. ساخت View ساده:

CREATE VIEW vw_EmployeeInfo
AS
SELECT
  p.FirstName,
  p.LastName,
  e.JobTitle,
  e.HireDate
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

کاربرد: ایجاد نمایی برای مشاهده سریع اطلاعات کارمندان بدون نیاز به JOINهای مکرر.

۲. مشاهده داده‌های داخل View:

SELECT * FROM vw_EmployeeInfo;

کاربرد: مثل یک جدول معمولی از View استفاده می‌کنید.

۳. حذف View:

DROP VIEW vw_EmployeeInfo;

کاربرد: حذف نما از پایگاه داده.

۴. بازنویسی View (با ALTER):

ALTER VIEW vw_EmployeeInfo
AS
SELECT
  p.FirstName,
  p.LastName,
  e.JobTitle,
  e.HireDate,
  d.Name AS Department
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.Department AS d
  ON e.DepartmentID = d.DepartmentID;

۵. View با شرط (WHERE):

CREATE VIEW vw_ActiveEmployees
AS
SELECT FirstName, LastName, JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS p
  ON e.BusinessEntityID = p.BusinessEntityID
WHERE e.CurrentFlag = 1;

۶. View با تابع تجمیعی:

CREATE VIEW vw_SalesSummary
AS
SELECT
  ProductID,
  SUM(LineTotal) AS TotalSales,
  COUNT(*) AS TotalOrders
FROM Sales.SalesOrderDetail
GROUP BY ProductID;

۷. View تو در تو (Nested View):

CREATE VIEW vw_TopSales
AS
SELECT ProductID, TotalSales
FROM vw_SalesSummary
WHERE TotalSales > 100000;

۸. محدود کردن دسترسی کاربران با View:

می‌توان به کاربران فقط دسترسی به View داد، بدون اینکه به جدول اصلی دسترسی داشته باشند. این روش برای امنیت داده‌ها بسیار کاربردی است.

۹. View قابل‌به‌روزرسانی (Updatable View):

UPDATE vw_ActiveEmployees
SET JobTitle = 'Senior Engineer'
WHERE LastName = 'Adams';

شرط: فقط در صورتی مجاز است که View از چند جدول پیچیده یا تابع تجمیعی استفاده نکند.

۱۰. بررسی تعریف یک View:

sp_helptext 'vw_EmployeeInfo';

کاربرد: مشاهده کوئری‌ای که View براساس آن ساخته شده است.

🧠 تمرین‌های عملی:

  • تمرین ۱: ساخت View با نام vw_ProductPrice برای نمایش نام و قیمت محصولات.
  • تمرین ۲: ساخت View vw_EmployeeList برای نمایش نام، سمت و تاریخ استخدام.
  • تمرین ۳: ایجاد View خلاصه فروش محصولات با مجموع LineTotal.
  • تمرین ۴: ایجاد View جدید از View خلاصه فروش که فقط محصولات بالای ۵۰٬۰۰۰ را نشان دهد.
  • تمرین ۵ (چالشی): ایجاد View از کارکنان فعال و امکان ویرایش عنوان شغلی در آن.

💡 پاسخ تمرین‌های عملی:

-- تمرین ۱
CREATE VIEW vw_ProductPrice
AS
SELECT Name, ListPrice
FROM Production.Product;

-- تمرین ۲
CREATE VIEW vw_EmployeeList
AS
SELECT p.FirstName, p.LastName, e.JobTitle, e.HireDate
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

-- تمرین ۳
CREATE VIEW vw_SalesSummary
AS
SELECT ProductID, SUM(LineTotal) AS TotalSales
FROM Sales.SalesOrderDetail
GROUP BY ProductID;

-- تمرین ۴
CREATE VIEW vw_TopProducts
AS
SELECT ProductID, TotalSales
FROM vw_SalesSummary
WHERE TotalSales > 50000;

-- تمرین ۵ (چالشی)
CREATE VIEW vw_EditableActiveEmployees
AS
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.CurrentFlag = 1;

UPDATE vw_EditableActiveEmployees
SET JobTitle = 'Team Lead'
WHERE LastName = 'Adams';

📚 جمع‌بندی درس:

در این درس با مفهوم Viewها آشنا شدید — ساختارهایی مجازی که اجرای کوئری‌ها را ساده‌تر، امن‌تر و خواناتر می‌کنند. Viewها به شما امکان می‌دهند داده‌های پیچیده را در قالبی ساده برای گزارش‌گیری یا مدیریت کاربران ارائه دهید. در درس بعد، به سراغ Stored Procedureها و نحوهٔ استفاده از پارامترها در SQL Server خواهیم رفت.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *