یک مجموعه از جداول مرتبط به هم یک پایگاه داده رابطه ای را شکل می دهد. هر جدول نیز از یکسری ستون تشکیل شده است. هر ستون از جدول، داده های مرتبط به یک خصیصه را در خود نگهداری می کند.
موجودیتی به نام دانشجو را تصور کنید، هر دانشجو دارای خصیصه هایی است که آن را از دیگری متمایز می کند.
مثلا شماره دانشجویی، مشخصات فردی، رشته تحصیلی و … . این موجودیت در یک پایگاه داده ی رابطه ای تبدیل به یک جدول شده و خصیصه های آن نیز بصورت ستون در خواهند آمد.
برخی ستون ها مخصوص یکسری عملیات خاص هست، مثلا داده های مربوط به ستون وضعیت تاهل دانشجو زمانی مورد نیاز می شود که دانشجو تقاضای وام ازدواج کند. اما این ستون نسبت به سایر ستون ها کمتر در گزارش هایمان ممکن است ظاهر شود.
فرض کنید جدول مورد بحث ما شامل 13 ستون است، می خواهیم Query ای بنویسیم که 10 ستون معین از این جدول انتخاب شود. در این حالت ناچاریم که نام 10 ستون مورد نظر را جلوی SELECT لیست کنیم.
اما اگر می شد به جای لیست کردن آن 10 ستون، تنها نام آن 3 ستون دیگر را لیست می کردیم کار ساده تر نمی شد؟
این موضوع را از چند بُعد می توان بررسی کرد.
ابتدا باید یک ابهام اساسی در مورد این Syntax برطرف شده و به یک قرار داد کلی برسیم.
Syntax زیر را در نظر بگیرید:
[sql]
SELECT ALL Except column11, column12, column13
FROM table
[/sql]
Query فوق در واقع اشاره به Query زیر دارد، با این شرط که در زمان اجرای Query ها دقیقا این 13 ستون موجود اند.
[sql]
SELECT column1, column2, column3, column4, column5,
column6, column7, column8, column9, column10
FROM table
[/sql]
اما با این فرض که چنین Syntax ای قانونی باشد، آیا این دو کد کاملا از لحاظ منطقی با هم یکسان اند؟ جواب واضح است خیر. دو حالتِ اضافه کردن و حذف ستون و تاثیر آن در خروجی Query های فوق را بررسی می کنیم.
حذف ستونی از ستون های Query دوم از جدول:
در این حالت کد اول اجرا می شود، اما کد دوم اجرا نمی شود، چون نام ستونی را ذکر کردیم که وجود خارجی دیگر ندارد. اما وضعیت از این هم می تواند بد تر شود، اگر ما عینا آن 10 ستون را از جدول حذف کنیم، در این حالت Query اول هم نباید اجرا شود، چرا که مجموعه ای وجود ندارد که بخواهیم اعضایی را از آن منها کنیم.
حذف ستونی از ستون های Query اول از جدول:
حذف ستون Column13 را در نظر بگیرید. در این حالت آیا باید کوئری اول اجرا شود؟ چون به نام ستونی اشاره کردیم که دیگر وجود خارجی ندارد، آیا منها کردن یک ستون که وجود خارجی ندارد از تمام ستون ها منطقی به نظر می رسد؟
اضافه کردن یک ستون به جدول:
فرض کنید ستونی با نام Column14 به جدول اضافه شده است. در این حالت Query اول نتیجه ای غیر یکسان با Query دوم خواهد داشت. چراکه این ستون در نتیجه ی اجرای Query اول ظاهر خواهد شد اما در Query دوم خیر.
این مورد می تواند خیلی خطرناک باشد، با این فرض که کوئری اول داخل یک View یا پروسیجر آورده شده و مجوز اجرای پروسیجر یا Select از ویو به تمام کاربران داده شده است، اگر داده های ستون جدید نباید به تمام کاربران نمایش داده شود، در این حالت تمام کاربران قادر به مشاهده این داده ها خواهند بود. چون این ستون در لیست Except آورده نشده است.
کد اول دارای یکسری ابهام است، اول از همه آیا با حذف یکی از آن سه ستون (11،12و13( کد باید اجرا شود یا خیر؟ چرا که به ستونی اشاره می کنیم که دیگر وجود ندارد. دومین مورد، آیا ما مجاز هستیم تمام ستون ها را در قسمت Except لیست کنیم؟ چرا که در این حالت قسمت Projection تهی خواهد بود. آیا ما مجاز هستیم نام یک ستون را دو مرتبه ذکر کنیم؟ آیا ما مجاز هستیم یک Expression مثل یک مقدار ثابت را در آنجا لیست کنیم؟
نتیجه گیری را می خواهم به عهده خود شما بگذارم، بنظر شما وجود چنین قابلیتی می تواند کاربردی باشد؟
3 دیدگاه
داوود طاهرخانی
بستگی به نوع استفاده داره ممکنه استفاده بشه
مجتبی مزورعی
در مواردی که نیازی به تغییر ستون های جدول نداریم خیلی خوبه
اما بیشتر یک روش جالب است تا یک روش کاربری
میلاد فیروزی
جالب بود به نظرم