# پایگاه‌های داده > SQL Server >  view چیست

## کم حوصله

سلام
view چیست ؟؟؟
مکان استفاده از آن کجاست ؟؟؟
چگونه بار گذاری می شود ؟؟

!!!!!
در اکسس مکانی بود که برای نام فیلد ها تعریف می کردیم و نام سر ستون را با آن نمایش می داد مثلا به جای fl1  می نوشت " شماره " 
حال آیا این view همان است ؟؟؟

چگونه از آن می توان استفاده کرد ؟؟ و نوع کارش چیست ؟؟؟

خلاصه همون این view  چیه کامل توضیح بدید خواهشن  :oops: 

قبلا از لطف تون ممنونم  :wink:

----------


## sql_qassem

ویو یک درخواسته که می تونی اون رو ذخیره کنی و معمولا همیشه از اون استفاده می کنی 
یک query که پر استفاده هست . در sql server می تونی اون رو بسازی و ذخیره کنی مثل access بعد هم با object ی مثل table  به اون وصل شی و استفاده کنی البته اگر query تو ترکیبی از چند جدول نباشه حتی می تونی تمام عملیاتهای مربوط به یک table  رو از قبیل درج و حذف و ویرایش و ... رو هم انجام بدی :wink:

----------


## Developer Programmer

مزایا و معایب استفاده از ویو چیه؟

----------


## AminSobati

دوست عزیزم،
View به خاطر کاربردش دارای دو لقب(یا اسم) هستش:
1) Saved Select
2) Virtual Table

اولی به این دلیله که شما یک Query طولانی رو تحت عنوان یک اسم ذخیره میکنین، و برای بدست آوردن نتیجه اون View، نیازی ندارین دوباره اون Query رو بنویسین. به عنوان مثال در دیتابیس Northwind میتونیم یک View بسازیم تا همیشه نام شرکت و تعداد سفارشهای اون رو برگردونه:

CREATE VIEW BestCustomers &#40;&#91;Company&#93;,&#91;OrderCount&#93;&#41  ;
AS
SELECT C.CompanyName, Count&#40;O.OrderID&#41; FROM Customers C
	JOIN Orders O ON C.CustomerID=O.CustomerID
		GROUP BY C.CompanyName


برای دیدن نتیجه، لازم نیست Query مجددا نوشته بشه، بلکه از View میتونیم SELECT انجام بدیم:
SELECT * FROM BestCustomers
به سر ستونها دقت کنین، طبق چیزی که در View تعریف کردیم ظاهر میشن. حالا اگر بخواهیم شرکتهایی که تا حالا بیشتر از 10 سفارش داشتن رو بدست بیاریم:
SELECT * FROM BestCustomers WHERE 
	OrderCount>=10
زمانیکه در SELECT شرط تعیین کردیم، این Query با Query موجود در خود View ادغام میشه (به طور هوشمندانه) که به این کار Materialize گفته میشه.
و اما اسم دوم (Virtal Table) به این دلیله که شما میتونین روی View، حتی Index بسازین. وقتی Index بسازین، نتیجه View در یک ساختار B-Tree ذخیره میشه (درست مثل ایندکسهای عادی) و باعث میشه در زمان SELECT کردن از View، اطلاعات مورد نیاز تقریبا از قبل آماده شده باشن. ولی در حالت قبل که View هنوز ایندکس نداشته، در هر بار SELECT از View، میبایستی SQL Server اول نتیجه View رو بدست بیاره تا به SELECT شما پاسخ بده. با داشتن ایندکس، مرحله اول که بدست آوردن نتیجه خود View هستش، قبلا انجام شده و فقط نتیجه SELECT شما باید آماده بشه. ساختن Index روی View شرایط خاصی داره.
ضمنا انجام Query از یک View که ایندکس خورده بسیار سریعه. اما در نظر داشته باشین که به ازاء هر ویراش روی جداول اصلی، View هم اطلاعات ایندکسش باید Update بشه. اگر چه این کار رو خود SQL Server انجام میده اما اگر تعداد Viewهای ما که ایندکس دارن زیاد باشه، میتونه روی Performance دستورات Insert و Update و Delete تاثیر منفی داشته باشه. لذا فقط روی Viewهایی ایندکس میسازیم که ارزش اون رو داشته باشن، یعنی خیلی مورد استفاده واقع بشن.
البته کاربردهای View به همینجا ختم نمیشه، اونها در Linked Serverها و Distributed Queryها هم مورد استفاده قرار میگیرند که برای خودش مبحث دیگه ای داره...
موفق باشین

----------


## mahdieh_khatibi

با سلام
اگر ممکن است راجع به RELATIONSHIPیک توضیح کامل بدهید.
با تشکر

----------


## AminSobati

دوست عزیزم،
Relationship در علوم مربوط به دیتابیس دارای مفهوم گسترده ای هستش، ولی حدس میزنم که Foreign Key Constraint مد نظر شماست. 
وقتی رابطه بین دو جدول رو بررسی میکنیم، به جدول رده بالاتر Parent و به جدول پایین تر Child گفته  میشه. هر رکوردی که در Child وارد میشه، باید توسط فیلد واسطه به جدول Parent مرتبط بشه. به عنوان مثال در دیتابیس Northwind، جدول Customers در حقیقت Parent و جدول Orders همون Child تلقی میشن. این دو جدول از طریق فیلد واسطه ای بنام CustomerID با هم مرتبط میشن. یعنی این فیلد در هر دو جدول وجود داره و زمانی که یک رکورد به جدول Orders اضافه میشه، منطقا مقدار CustomerID باید در جدول Customers هم موجود باشه. این ارتباط یک ارتباط منطقی هستش و به نوع بانک اطلاعاتی وابستگی نداره (مهم نیست که شما با Access کار میکنید یا با SQL Server یا Oracle) 
اگر یک رکورد وارد جدول Orders بشه که مقدار CustomerID برای اون رکورد، در جدول Customers وجود نداشته باشه، اصطلاحا این رکورد Orphan(یتیم) هستش چرا که ارتباطی با جدول Parent یا همون Customers نداره. چنین رکوردی هیچ وقت در Inner Join ظاهر نمیشه و میتونه در بعضی آمارگیریها و گزارشگیریها دقت رو پایین بیاره.
یتیم شدن رکوردها در جدول Child از روشهای دیگر هم ممکنه اتفاق بیافته. مثلا اگر از جدول Customers یک رکورد حذف بشه، تمام رکوردهای مرتبط با اون رکورد در جدول Orders یتیم میشن. لذا یا باید جلوی حذف رکورد از Customers گرفته بشه یا اینکه در صورت حذف، تمام رکوردهای متناظر از Orders هم حذف بشن.
و باز حالت دیگه، اگر در Customers مقدار CustomerID یک رکورد تغییر کنه(Update)، یا باید جلوی این تغییر رو گرفت یا اینکه رکوردهای متناظرش در Orders رو هم Update کرد.
و اما Foregin Key Constraint تنها کاری که انجام میده اینه که تضمین میکنه همیشه  ارتباط بین جدول Parent و Child برقرار باشه. به این ترتیب که اگر رکوردی بخواد در Orders وارد بشه، مقدار CustomerID رو چک میکنه که در جدول Customers وجود داشته باشه. در غیر اینصورت جلوی ورود رکورد رو میگیره. یا اگر یک رکورد از Customers حذف بشه، رکوردهای متناظرش رو از Orders حذف میکنه یا اصلا جلوی عمل Delete رو میگیره (بسته به اینکه چطوری Foregin Key Constraint رو تعریف کرده باشیم).
اگر سوالتون رو بیشتر تشریح بفرمایید، امکان پاسخ دقیق تری رو فراهم کردین.

امین ثباتی MCSD

----------


## ncs2008

حالا چه طوری میشه از view در دات نت استفاده کرد.نمونه کد vb.net بزارین عالی میشه

----------


## mariaviolla

این ایندکس که گفتید چه جوری ساخته میشه ؟

چه شرایطی داره؟ گفتید که شرایط خاصی داره 

منظورتون از b-tree چیه ؟

ممنون که پاسخ میدید

----------

