Select (SQL) کیست؟ توضیح بده.
دستور SQL SELECT مجموعه‌ای از سطرها را که از یک یا چند جدول استخراج می‌شوند، به عنوان نتیجه بازمیگرداند. یک دستور SELECT برای بازیابی صفر یا چند ردیف از یک یا چند جدول پایگاه داده یا نمای پایگاه داده استفاده می‌شود. در اکثر برنامه ها، codice_1 رایج ترین فرمان زبان دستکاری داده ها (DML) است. از آنجا که SQL یک زبان برنامه نویسی اعلانی است، دستورات codice_1 تنها مجموعه نتایج مورد نظر را مشخص می کنند، اما نحوه محاسبه آن را تعیین نمی نمایند. پایگاه داده این پرس‌وجو را به یک " طرح پرس‌وجو " تبدیل می‌کند که ممکن است در اجراهای مختلف، نسخه‌های متفاوت پایگاه داده یا نرم‌افزار پایگاه داده تفاوت داشته باشد. این قابلیت تحت عنوان " بهینه ساز پرس‌وجو " نام دارد و هدف آن یافتن بهینه‌ترین طرح اجرایی ممکن برای اجرای پرس‌وجو، در چارچوب محدودیت های موجود است.دستور SELECT دارای بندهای اختیاری زیادی است:نمای کلی.دستور codice_1 رایج ترین عملیات در SQL محسوب می‌شود که «پرس‌وجو» نامیده می شود. این دستور داده‌ها را از یک یا چند جدول یا عبارت بازیابی می‌کند. اجرای یک دستور codice_1 استاندارد، معمولاً تأثیری ماندگار بر پایگاه‌داده نمی‌گذارد؛ با این حال، برخی پیاده‌سازی های غیر استاندارد مانند codice_14 ممکن است تغییرات دائمی ایجاد کنند.پرس‌وجو‌ها به کاربر اجازه می‌دهند تا داده‌های مورد نظر خود را توصیف کند، در حالی که سیستم مدیریت پایگاه داده (DBMS) وظیفه برنامه‌ریزی ، بهینه‌سازی و اجرای عملیات فیزیکی لازم برای تولید نتیجه را بر عهده دارد. هر پرس‌وجو شامل فهرستی از ستون‌هاست که باید در نتیجه نهایی نمایش داده شوند، که معمولاً بلافاصله پس از کلیدواژه codice_1 قرار می گیرد. برای نمایش همه ستون های جدول، میتوان از علامت ستاره (" codice_16 ") استفاده کرد. codice_1 پیچیده ترین دستور در SQL به شمار می‌رود و می‌تواند شامل کلیدواژه‌ها و بند‌های اختیاری گوناگونی باشد از جمله codice_18.مثال زیر از یک پرس‌وجوی codice_1 را نشان می‌دهد که فهرستی از کتاب‌های گران‌قیمت را برمی‌گرداند. این پرس‌وجو تمامی ردیف‌های جدول "Book" را بازیابی می‌کند که مقدار ستون "price" آن‌ها حاوی مقداری بزرگتر از 100.00 باشد. نتایج بر اساس "title" به صورت صعودی مرتب می‌شوند. علامت ستاره (*) در "فهرست انتخاب" نشان می‌دهد که تمام ستون‌های جدول "Book" باید در مجموعه نتایج گنجانده شوند.SELECT * FROM Book WHERE price &gt; 100.00 ORDER BY title;SELECT * FROM Book WHERE price &gt; 100.100 ORDER BY title;مثال زیر یک پرس‌وجو با چند جدول، گروه‌بندی و تجمیع را نشان می‌دهد؛ به این صورت که فهرستی از کتاب‌ها و تعداد نویسندگان مرتبط با هر کتاب را بازمی‌گرداند. SELECT Book.title AS Title, count(*) AS Authors FROM Book JOIN Book_author ON Book.isbn = Book_author.isbn GROUP BY Book.title;خروجی مثال ممکن است شبیه به زیر باشد: عنوان نویسندگان مثال‌ها و راهنمای اس‌کیو‌ال 4 لذت اس‌کیو‌ال 1 مقدمه‌ای بر اس‌کیو‌ال 2 مشکلات اس‌کیوال 1 با فرض اینکه ستون "isbn" تنها نام مشترک بین دو جدول است و ستون "title" فقط در جدول "Book" وجود دارد، می‌توان پرس‌وجوی بالا را به شکل زیر بازنویسی کرد:SELECT title, count(*) AS Authors FROM Book NATURAL JOIN Book_author GROUP BY title;با این حال، بسیاری از ارائه‌دهندگان پایگاه داده یا از این روش پشتیبانی نمی‌کنند، یا برای عملکرد صحیح codice_20 نیاز به رعایت نام‌گذاری خاصی برای ستون‌ها دارند.SQL شامل عملگرها و توابعی برای انجام محاسبات بر روی داده‌های ذخیره‌شده است. این زبان امکان استفاده از عبارت‌ها را در فهرست codice_1 فراهم می‌کند تا داده‌ها به‌صورت محاسبه‌شده نمایش یابند؛ مانند مثال زیر که فهرستی از کتاب‌های با قیمت بیش از ۱۰۰٫۰۰ را به همراه ستونی اضافی به نام "sales_tax" بازمی‌گرداند. مقدار این ستون بر اساس ۶٪ از قیمت هر کتاب محاسبه شده است.SELECT isbn, title, price, price * 0.06 AS sales_tax FROM Book WHERE price &gt; 100.00 ORDER BY title;زیرپرس‌وجوها.پرس‌وجوها می‌توانند تو در تو نوشته شوند، به‌طوری که نتایج یک پرس‌وجو در پرس‌وجوی دیگر از طریق یک عملگر رابطه‌ای یا تابع تجمیعی مورد استفاده قرار گیرد. به چنین پرس‌وجوهایی «زیرپرس‌وجو» (Subquery) نیز گفته می‌شود. اگرچه در بسیاری از موارد استفاده از اتصال‌ها (Join) و سایر عملیات جدول از نظر محاسباتی عملکرد بهتری (سریع‌تر) دارند، اما زیرپرس‌وجوها ساختار سلسله‌مراتبی در اجرا ایجاد می‌کنند که در برخی موقعیت‌ها مفید یا ضروری است. در مثال زیر، تابع تجمیعی codice_22 نتیجه یک زیرپرس‌وجو را به‌عنوان ورودی دریافت می‌کند:SELECT isbn, title, price FROM Book WHERE price &lt; (SELECT AVG(price) FROM Book) ORDER BY title;زیرپرس‌وجو می‌تواند از مقادیر موجود در پرس‌وجوی بیرونی استفاده کند که در این صورت به آن «زیرپرس‌وجوی هم‌بسته» گفته می‌شود.از سال ۱۹۹۹، استاندارد SQL استفاده از بندهای WITH را مجاز می‌داند، یعنی زیرپرس‌وجوهای نامگذاری‌شده که اغلب عبارات جدولی رایج نامیده می‌شوند (که پس از پیاده‌سازی IBM DB2 نسخه ۲ نامگذاری و طراحی شده‌اند؛ اوراکل این زیرپرس‌وجوها را فاکتورگیری می‌نامد). CTEها همچنین می‌توانند با ارجاع به خودشان باشند؛ مکانیسم حاصل، پیمایش درخت یا گراف (هنگامی که به صورت رابطه نمایش داده می‌شوند) و به طور کلی‌تر محاسبات امکان‌پذیر می‌سازد.از سال ۱۹۹۹، استاندارد SQL اجازه استفاده از بند WITH را می‌دهد؛ این بند شامل زیرپرس‌وجوهای نام‌گذاری‌شده‌ای است که معمولاً «عبارات جدول مشترک» (Common Table Expressions یا CTE) نامیده می‌شوند. این مفهوم بر اساس پیاده‌سازی نسخه ۲ پایگاه داده IBM DB2 طراحی شده است؛ در پایگاه داده Oracle به آن subquery factoring گفته می‌شود. CTEها می‌توانند به‌صورت بازگشتی نیز تعریف شوند، یعنی به خودشان ارجاع دهند. این قابلیت امکان پیمایش ساختارهای درختی یا گرافی (در صورتی که به‌صورت رابطه‌ای نمایش داده شوند) و به‌طور کلی انجام محاسبات نقطه ثابت را فراهم می‌کند.جدول مشتق شده.جدول مشتق‌شده زیرپرس‌وجویی است که در بند codice_6 قرار می‌گیرد. در اصل، جدول مشتق‌شده یک زیرپرس‌وجو است که می‌توان از آن انتخاب انجام داد یا آن را به جدول‌های دیگر متصل کرد. این قابلیت به کاربر اجازه می‌دهد تا به زیرپرس‌وجو همانند یک جدول ارجاع دهد. جدول مشتق‌شده همچنین با عناوینی مانند «نمای درون‌خطی» یا «انتخاب در فهرست FROM» نیز شناخته می‌شود.در مثال زیر، دستور SQL شامل یک اتصال بین جدول اولیه‌ی Books و جدول مشتق‌شده‌ای به نام "Sales" است. این جدول مشتق‌شده اطلاعات مربوط به فروش کتاب‌ها را با استفاده از ستون ISBN به جدول Books متصل می‌کند. در نتیجه، جدول مشتق‌شده مجموعه نتایج را با ستون‌های اضافی مانند تعداد نسخه‌های فروخته‌شده و نام شرکتی که کتاب‌ها را فروخته است، تکمیل می‌کند.SELECT b.isbn, b.title, b.price, sales.items_sold, sales.company_nmFROM Book b JOIN (SELECT SUM(Items_Sold) Items_Sold, Company_Nm, ISBN FROM Book_Sales GROUP BY Company_Nm, ISBN) sales ON sales.isbn = b.isbnSelect * from {table} مثال‌ها.با فرض وجود جدولی به نام T، اجرای پرس‌وجوی codice_24 باعث می‌شود تمام عناصر مربوط به تمام ردیف‌های جدول نمایش داده شوند.با استفاده از همان جدول، اجرای پرس‌وجوی codice_25 موجب می‌شود که عناصر ستون C1 از تمامی ردیف‌های جدول نمایش داده شوند. این عمل مشابه «پروژکشن» در جبر رابطه‌ای است، با این تفاوت که در حالت کلی، ممکن است نتایج شامل ردیف‌های تکراری باشند. در برخی اصطلاحات پایگاه داده، به این نوع پرس‌وجو «پارتیشن‌بندی عمودی» نیز گفته می‌شود، چرا که خروجی پرس‌وجو را به نمایش فیلدها یا ستون‌های مشخص محدود می‌کند..با استفاده از همان جدول، اجرای پرس‌وجوی codice_26 باعث می‌شود تمام عناصر مربوط به ردیف‌هایی که مقدار ستون C1 آن‌ها برابر با '1' است نمایش داده شوند. در جبر رابطه‌ای، این عملیات به عنوان «انتخاب» شناخته می‌شود، زیرا شرطی از طریق بند codice_7 اعمال شده است. این نوع فیلتر کردن ردیف‌ها در برخی مفاهیم پایگاه داده «پارتیشن‌بندی افقی» نامیده می‌شود، چرا که خروجی پرس‌وجو را بر اساس شرایط مشخص به مجموعه‌ای محدود از ردیف‌ها محدود می‌سازد.در صورت استفاده از بیش از یک جدول، مجموعه نتایج شامل تمام ترکیب‌های ممکن از ردیف‌های جدول‌ها خواهد بود. برای مثال، اگر دو جدول T1 و T2 داشته باشیم، اجرای پرس‌وجوی codice_28 موجب می‌شود هر ردیف از T1 با هر ردیف از T2 ترکیب شود. به‌عنوان نمونه، اگر T1 شامل ۳ ردیف و T2 شامل ۵ ردیف باشد، نتیجه نهایی شامل ۱۵ ردیف خواهد بود.اگرچه این قابلیت در استاندارد SQL تعریف نشده است، اما اکثر سامانه‌های مدیریت پایگاه داده (DBMS) اجازه می‌دهند که از دستور codice_1 بدون ارجاع به جدول خاصی استفاده شود؛ به‌طوری که گویی یک جدول فرضی با تنها یک ردیف وجود دارد. این ویژگی عمدتاً برای انجام محاسباتی به‌کار می‌رود که نیاز به جدول واقعی ندارند.بند codice_1 فهرستی از ویژگی‌ها (ستون‌ها) را با نام مشخص می‌کند، یا از نویسه‌ی عام (codice_16) برای اشاره به «تمام ویژگی‌ها» استفاده می‌نماید.محدود کردن ردیف‌های نتایج.اغلب مناسب است که حداکثر تعداد ردیف‌های بازگردانده‌شده در یک پرس‌وجو مشخص شود. این کار می‌تواند برای اهداف آزمایشی یا برای جلوگیری از مصرف بیش از حد منابع در مواقعی که پرس‌وجو داده‌هایی بیش از حد انتظار تولید می‌کند، مورد استفاده قرار گیرد. روش انجام این کار معمولاً در میان ارائه‌دهندگان مختلف پایگاه داده متفاوت است.در ISO SQL:2003 ، مجموعه نتایج ممکن است با استفاده از موارد زیر محدود شوند:ISO بند codice_32 را معرفی کرد.بر اساس مستندات نسخه ۹ PostgreSQL، یک تابع پنجره‌ای در SQL «محاسبه‌ای را روی مجموعه‌ای از ردیف‌های جدول که به‌نوعی با ردیف جاری مرتبط هستند انجام می‌دهد»، و عملکردی مشابه توابع تجمیعی دارد. نام این توابع از توابع پنجره‌ای در پردازش سیگنال الهام گرفته شده است. فراخوانی یک تابع پنجره‌ای همواره شامل بند codice_33 می‌باشد.تابع پنجره ()ROW_NUMBER.codice_34 می‌تواند برای یک "جدول ساده" با تعداد ردیف‌های برگردانده شده استفاده شود، مثلاً برای برگرداندن حداکثر ده ردیف:SELECT * FROM( SELECT ROW_NUMBER() OVER (ORDER BY sort_key ASC) AS row_number, columns FROM tablename) AS fooWHERE row_number &lt;= 10تابع codice_35 می‌تواند غیرقطعی باشد؛ به این معنا که اگر مقدار codice_36 یکتا نباشد، ممکن است در هر بار اجرای پرس‌وجو، شماره ردیف‌های متفاوتی به ردیف‌هایی که مقدار codice_36 یکسان دارند اختصاص داده شود. در صورتی که codice_36 یکتا باشد، هر ردیف همواره یک شماره ردیف یکتا دریافت خواهد کرد.تابع پنجره‌ای RANK().تابع پنجره‌ای codice_39 مانند ROW_NUMBER عمل می‌کند، اما در صورت وجود شرایط مساوی، ممکن است تعداد ردیف‌های بیشتر یا کمتری از "n" را برگرداند، مثلاً برای بازگرداندن 10 نفر جوان‌تر:SELECT * FROM ( SELECT RANK() OVER (ORDER BY age ASC) AS ranking, person_id, person_name, age FROM person) AS fooWHERE ranking &lt;= 10Select * from {table} order by {unique_key}کد بالا ممکن است بیش از ده ردیف بازگرداند؛ برای مثال، اگر دو نفر هم‌سن باشند، ممکن است یازده ردیف در نتیجه بازگردانده شود.بند FETCH FIRST.از آنجا که محدودیت‌های نتایج ISO را می‌توان مانند مثال زیر با استفاده از عبارت codice_32 مشخص کرد.SELECT * FROM T FETCH FIRST 10 ROWS ONLYاین بند در حال حاضر توسط CA DATACOM/DB نسخه ۱۱، IBM DB2، SAP SQL Anywhere، PostgreSQL، EffiProz، H2، HSQLDB نسخه ۲.۰، Oracle 12c و Mimer SQL پشتیبانی می‌شود.مایکروسافت SQL Server 2008 و بالاتر از codice_32 پشتیبانی می‌کند ، اما بخشی از بند codice_10 محسوب می‌شود. بندهای codice_10 ، codice_44 و codice_32 همگی برای این کاربرد ضروری هستند.SELECT * FROM T ORDER BY acolumn DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLYSelect * from {table} نگارش غیر استاندارد.برخی از سامانه‌های مدیریت پایگاه داده (DBMS) نگارش‌های غیراستانداردی را به‌جای نگارش استاندارد SQL یا علاوه بر آن ارائه می‌دهند. در ادامه، گونه‌های مختلف یک پرس‌وجوی ساده با محدودیت تعداد نتایج برای سامانه‌های مختلف فهرست شده‌اند:صفحه بندی ردیف ها.صفحه‌بندی ردیف‌ها رویکردی است که برای محدود کردن و نمایش تنها بخشی از کل داده‌های یک پرس‌وجو در پایگاه داده استفاده می‌شود. به‌جای نمایش صدها یا هزاران ردیف به‌صورت هم‌زمان، تنها یک صفحه (مجموعه‌ای محدود از ردیف‌ها، برای مثال فقط ۱۰ ردیف) از سرور درخواست می‌شود و کاربر با درخواست صفحه بعدی، و سپس صفحه بعد از آن، به مرور داده‌ها می‌پردازد. این روش به‌ویژه در سامانه‌های وب بسیار مفید است، جایی که اتصال اختصاصی بین کاربر و سرور وجود ندارد، بنابراین کاربر مجبور نیست منتظر بماند تا تمام ردیف‌های سرور بارگذاری و نمایش داده شوند.ساده‌ترین روش (اما بسیار ناکارآمد).from {table} پرس و جوی سلسله مراتبی.برخی پایگاه‌های داده نگارش‌های ویژه‌ای برای داده‌های سلسله‌مراتبی ارائه می‌دهند.تابع پنجره‌ای در استاندارد SQL:2003، یک تابع تجمیعی است که بر روی یک پارتیشن از مجموعه نتایج اعمال می‌شود.برای مثال،Select * from {table} مجموع جمعیت تمام ردیف‌هایی را محاسبه می‌کند که مقدار ستون city آن‌ها با ردیف جاری یکسان است.پارتیشن‌ها با استفاده از بند codice_33 مشخص می‌شوند که تابع تجمیعی را تغییر می‌دهد. نگارش (Syntax):بند codice_33 می‌تواند مجموعه نتایج را بخش‌بندی و مرتب‌سازی کند. مرتب‌سازی برای توابع وابسته به ترتیب مانند codice_35 مورد استفاده قرار می‌گیرد.ارزیابی پرس و جو ANSI.پردازش یک دستور codice_1 بر اساس استاندارد ANSI SQL به‌صورت زیر انجام می‌شود:پشتیبانی از تابع پنجره توسط فروشندگان RDBMS.پیاده‌سازی قابلیت‌های تابع پنجره‌ای توسط ارائه‌دهندگان پایگاه‌های داده رابطه‌ای و موتورهای SQL تفاوت‌های چشم‌گیری دارد. بیشتر پایگاه‌های داده از نوعی از توابع پنجره‌ای پشتیبانی می‌کنند، اما با بررسی دقیق‌تر مشخص می‌شود که اغلب آن‌ها تنها بخشی از استاندارد را پیاده‌سازی کرده‌اند. برای نمونه، بند قدرتمند codice_70 را در نظر بگیرید؛ تنها پایگاه‌های Oracle، DB2، Spark/Hive و Google BigQuery این ویژگی را به‌طور کامل پیاده‌سازی کرده‌اند. در سال‌های اخیر، ارائه‌دهندگان افزونه‌های جدیدی نیز به استاندارد SQL افزوده‌اند، مانند توابع تجمیع آرایه‌ای. این توابع به‌ویژه در زمینه اجرای SQL بر روی سامانه‌های فایل توزیع‌شده (مانند Hadoop، Spark و Google BigQuery) مفید هستند، جایی که تضمین هم‌محلی بودن داده‌ها ضعیف‌تر از پایگاه‌های داده رابطه‌ای توزیع‌شده (MPP) است. به‌جای توزیع یکنواخت داده‌ها میان تمام گره‌ها، موتورهای SQL که بر روی سامانه‌های فایل توزیع‌شده اجرا می‌شوند، می‌توانند با تودرتو کردن داده‌ها از انجام Joinهای پرهزینه و جابجایی سنگین داده‌ها در شبکه جلوگیری کرده و به تضمین هم‌محلی دست یابند. همچنین، توابع تجمیع تعریف‌شده توسط کاربر که می‌توان آن‌ها را در توابع پنجره‌ای به‌کار برد، از دیگر ویژگی‌های بسیار قدرتمند محسوب می‌شوند.تولید داده در T-SQL.روشی برای تولید داده‌ها بر اساس اتحاد همهselect 1 a, 1 b union allselect 1, 2 union allselect 1, 3 union allselect 2, 1 union allselect 5, 1SQL Server 2008 از ویژگی "row constructor" که در استاندارد مشخص شده است، پشتیبانی می‌کند.select *from (values (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) as x(a, b)