موضوع مقاله: Select (SQL) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # Select (SQL) | مقدمه: یک دستور SELECT برای بازیابی صفر یا چند ردیف از یک یا چند جدول پایگاه داده یا نمای پایگاه داده استفاده می‌شود. | ## بخش 1: Select (SQL) | از آنجا که SQL یک زبان برنامه نویسی اعلانی است، دستورات SELECT تنها مجموعه نتایج مورد نظر را مشخص می کنند، اما نحوه محاسبه آن را تعیین نمی نمایند. پایگاه داده این پرس‌وجو را به یک " طرح پرس‌وجو " تبدیل می‌کند که ممکن است در اجراهای مختلف، نسخه‌های متفاوت پایگاه داده یا نرم‌افزار پایگاه داده تفاوت داشته باشد. این قابلیت تحت عنوان " بهینه ساز پرس‌وجو " نام دارد و هدف آن یافتن بهینه‌ترین طرح اجرایی ممکن برای اجرای پرس‌وجو، در چارچوب محدودیت های موجود است. GROUP BY ردیف‌هایی را گروه‌بندی می‌کند که یک ویژگی را به اشتراک می‌گذارند تا بتوان یک تابع تجمیع را برای هر گروه اعمال کرد. پرس‌وجو‌ها به کاربر اجازه می‌دهند تا داده‌های مورد نظر خود را توصیف کند، در حالی که سیستم مدیریت پایگاه داده (DBMS) وظیفه برنامه‌ریزی ، بهینه‌سازی و اجرای عملیات فیزیکی لازم برای تولید نتیجه را بر عهده دارد. هر پرس‌وجو شامل فهرستی از ستون‌هاست که باید در نتیجه نهایی نمایش داده شوند، که معمولاً بلافاصله پس از کلیدواژه SELECT قرار می گیرد. مثال زیر از یک پرس‌وجوی SELECT را نشان می‌دهد که فهرستی از کتاب‌های گران‌قیمت را برمی‌گرداند. این پرس‌وجو تمامی ردیف‌های جدول Book را بازیابی می‌کند که مقدار ستون price آن‌ها حاوی مقداری بزرگتر از 100.00 باشد. این زبان امکان استفاده از عبارت‌ها را در فهرست SELECT فراهم می‌کند تا داده‌ها به‌صورت محاسبه‌شده نمایش یابند؛ مانند مثال زیر که فهرستی از کتاب‌های با قیمت بیش از ۱۰۰٫۰۰ را به همراه ستونی اضافی به نام sales_tax بازمی‌گرداند. اگرچه در بسیاری از موارد استفاده از اتصال‌ها (Join) و سایر عملیات جدول از نظر محاسباتی عملکرد بهتری (سریع‌تر) دارند، اما زیرپرس‌وجوها ساختار سلسله‌مراتبی در اجرا ایجاد می‌کنند که در برخی موقعیت‌ها مفید یا ضروری است. از سال ۱۹۹۹، استاندارد SQL استفاده از بندهای WITH را مجاز می‌داند، یعنی زیرپرس‌وجوهای نامگذاری‌شده که اغلب عبارات جدولی رایج نامیده می‌شوند (که پس از پیاده‌سازی IBM DB2 نسخه ۲ نامگذاری و طراحی شده‌اند؛ اوراکل این زیرپرس‌وجوها را فاکتورگیری می‌نامد). | ## بخش 2: Select (SQL) | CTEها همچنین می‌توانند با ارجاع به خودشان باشند؛ مکانیسم حاصل، پیمایش درخت یا گراف (هنگامی که به صورت رابطه نمایش داده می‌شوند) و به طور کلی‌تر محاسبات امکان‌پذیر می‌سازد. این قابلیت امکان پیمایش ساختارهای درختی یا گرافی (در صورتی که به‌صورت رابطه‌ای نمایش داده شوند) و به‌طور کلی انجام محاسبات نقطه ثابت را فراهم می‌کند. در اصل، جدول مشتق‌شده یک زیرپرس‌وجو است که می‌توان از آن انتخاب انجام داد یا آن را به جدول‌های دیگر متصل کرد. جدول مشتق‌شده همچنین با عناوینی مانند «نمای درون‌خطی» یا «انتخاب در فهرست FROM» نیز شناخته می‌شود. در نتیجه، جدول مشتق‌شده مجموعه نتایج را با ستون‌های اضافی مانند تعداد نسخه‌های فروخته‌شده و نام شرکتی که کتاب‌ها را فروخته است، تکمیل می‌کند. این عمل مشابه «پروژکشن» در جبر رابطه‌ای است، با این تفاوت که در حالت کلی، ممکن است نتایج شامل ردیف‌های تکراری باشند. در برخی اصطلاحات پایگاه داده، به این نوع پرس‌وجو «پارتیشن‌بندی عمودی» نیز گفته می‌شود، چرا که خروجی پرس‌وجو را به نمایش فیلدها یا ستون‌های مشخص محدود می‌کند.. در جبر رابطه‌ای، این عملیات به عنوان «انتخاب» شناخته می‌شود، زیرا شرطی از طریق بند WHERE اعمال شده است. این نوع فیلتر کردن ردیف‌ها در برخی مفاهیم پایگاه داده «پارتیشن‌بندی افقی» نامیده می‌شود، چرا که خروجی پرس‌وجو را بر اساس شرایط مشخص به مجموعه‌ای محدود از ردیف‌ها محدود می‌سازد. در صورت استفاده از بیش از یک جدول، مجموعه نتایج شامل تمام ترکیب‌های ممکن از ردیف‌های جدول‌ها خواهد بود. به‌عنوان نمونه، اگر T1 شامل ۳ ردیف و T2 شامل ۵ ردیف باشد، نتیجه نهایی شامل ۱۵ ردیف خواهد بود. | ## بخش 3: Select (SQL) | اگرچه این قابلیت در استاندارد SQL تعریف نشده است، اما اکثر سامانه‌های مدیریت پایگاه داده (DBMS) اجازه می‌دهند که از دستور SELECT بدون ارجاع به جدول خاصی استفاده شود؛ به‌طوری که گویی یک جدول فرضی با تنها یک ردیف وجود دارد. این ویژگی عمدتاً برای انجام محاسباتی به‌کار می‌رود که نیاز به جدول واقعی ندارند. بند SELECT فهرستی از ویژگی‌ها (ستون‌ها) را با نام مشخص می‌کند، یا از نویسه‌ی عام (*) برای اشاره به «تمام ویژگی‌ها» استفاده می‌نماید. محدود کردن ردیف‌های نتایج اغلب مناسب است که حداکثر تعداد ردیف‌های بازگردانده‌شده در یک پرس‌وجو مشخص شود. بر اساس مستندات نسخه ۹ PostgreSQL، یک تابع پنجره‌ای در SQL «محاسبه‌ای را روی مجموعه‌ای از ردیف‌های جدول که به‌نوعی با ردیف جاری مرتبط هستند انجام می‌دهد»، و عملکردی مشابه توابع تجمیعی دارد. به‌جای نمایش صدها یا هزاران ردیف به‌صورت هم‌زمان، تنها یک صفحه (مجموعه‌ای محدود از ردیف‌ها، برای مثال فقط ۱۰ ردیف) از سرور درخواست می‌شود و کاربر با درخواست صفحه بعدی، و سپس صفحه بعد از آن، به مرور داده‌ها می‌پردازد. این روش به‌ویژه در سامانه‌های وب بسیار مفید است، جایی که اتصال اختصاصی بین کاربر و سرور وجود ندارد، بنابراین کاربر مجبور نیست منتظر بماند تا تمام ردیف‌های سرور بارگذاری و نمایش داده شوند. تابع پنجره‌ای در استاندارد SQL:2003، یک تابع تجمیعی است که بر روی یک پارتیشن از مجموعه نتایج اعمال می‌شود. بیشتر پایگاه‌های داده از نوعی از توابع پنجره‌ای پشتیبانی می‌کنند، اما با بررسی دقیق‌تر مشخص می‌شود که اغلب آن‌ها تنها بخشی از استاندارد را پیاده‌سازی کرده‌اند. در سال‌های اخیر، ارائه‌دهندگان افزونه‌های جدیدی نیز به استاندارد SQL افزوده‌اند، مانند توابع تجمیع آرایه‌ای. به‌جای توزیع یکنواخت داده‌ها میان تمام گره‌ها، موتورهای SQL که بر روی سامانه‌های فایل توزیع‌شده اجرا می‌شوند، می‌توانند با تودرتو کردن داده‌ها از انجام Joinهای پرهزینه و جابجایی سنگین داده‌ها در شبکه جلوگیری کرده و به تضمین هم‌محلی دست یابند. | ## جمع‌بندی | همچنین، توابع تجمیع تعریف‌شده توسط کاربر که می‌توان آن‌ها را در توابع پنجره‌ای به‌کار برد، از دیگر ویژگی‌های بسیار قدرتمند محسوب می‌شوند.