با سلامی گرم خدمت همراهان همیشگی روکسو، در این قسمت از سری آموزش جامع زبان SQL می خواهیم در مورد دو اپراتور ALL و ANY و همچنین دستور SELECT INTO صحبت کنیم. با ما همراه باشید.
این دو اپراتور معمولا به همراه دستور WHERE و یا دستور HAVING استفاده می شوند. اپراتور ANY (به معنی «هر کدام») در صورت برقراری هر کدام از شروط مورد نظر مقدار true را بر میگرداند. اپراتور ALL (به معنی «همه») نیز در صورت برقرار بودن تمام شرط ها مقدار true را برمیگرداند.
ساختار کلی اپراتور ANY:
SELECT column_name(s) FROM table_name WHERE column_name operator ANY (SELECT column_name FROM table_name WHERE condition);
ساختار کلی اپراتور ALL :
SELECT column_name(s) FROM table_name WHERE column_name operator ALL (SELECT column_name FROM table_name WHERE condition);
در قسمت های قبلی تمام کلمات استفاده شده در ساختار ها را توضیح داده ایم اما در دو ساختار بالا کلمه ی جدیدی به نام operator داریم. این کلمه جایگزین یکی از اپراتور های مقایسه ای (=, <>, =!, >, =>, <, =<) است. به هر حال بار دیگر این کلمات (کلماتی که جزء دستورات SQL نیستند) را توضیح می دهم:
قبل از بررسی مثال ها باید نگاهی به جدول Products بیندازیم:
Price | Unit | CategoryID | SupplierID | ProductName | ProductID |
18 | 10 boxes x 20 bags | 1 | 1 | Chais | 1 |
19 | 24 - 12 oz bottles | 1 | 1 | Chang | 2 |
10 | 12 - 550 ml bottles | 2 | 1 | Aniseed Syrup | 3 |
22 | 48 - 6 oz jars | 2 | 2 | Chef Anton's Cajun Seasoning | 4 |
21.35 | 36 boxes | 2 | 2 | Chef Anton's Gumbo Mix | 5 |
و همچنین جدول OrderDetails:
Quantity | ProductID | OrderID | OrderDetailID |
12 | 11 | 10248 | 1 |
10 | 42 | 10248 | 2 |
5 | 72 | 10248 | 3 |
9 | 14 | 10249 | 4 |
40 | 51 | 10249 | 5 |
مثال اول - دستور SQL زیر مقدار TRUE را بر میگرداند و اگر ردیفی در جدول OrderDetails پیدا کند (هر تعداد باشد) که تعدادش مساوی با 10 باشد، نام محصولات را (productnames) لیست می کند:
SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
اجرای این دستور در پایگاه داده ی Northwind
نکته: اگر دقت کنید در این مثال که یک کوئری است، یک کوئری دیگر نیز داریم که مقابل ANY قرار دارد:
ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
به این نوع کوئری ها که معمولا داخل کوئری های دیگر و به عنوان شرط حاضر می شوند، sub-query یا زیرکوئری می گویند.
مثال دوم - دستور SQL زیر مقدار TRUE را بر میگرداند و اگر ردیفی در جدول OrderDetails پیدا کند که تعدادش بیشتر از 99 باشد، نام محصولات را (productnames) لیست می کند:
SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 99);
اجرای این دستور در پایگاه داده ی Northwind
مثال سوم - دستور SQL زیر مقدار TRUE را بر میگرداند و اگر تعداد تمام ردیف ها در جدول OrderDetails مساوی با 10 باشد، نام محصولات را (productnames) لیست می کند:
SELECT ProductName FROM Products WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
اجرای این دستور در پایگاه داده ی Northwind
اگر بخواهم دستور SELECT INTO را در لغت ترجمه کنم می شود «داخل ... انتخاب کن» اما اینطور خیلی معنی نمی دهد، درست است؟ منظور این دستور این است که فلان چیز را انتخاب کن و داخل فلان جدول بگذار، بنابراین از معنی دستور می توان فهمید که این دستور برای کپی کردن داده ها از یک جدول به جدول دیگر استفاده می شود.
ساختار کلی این دستور به شکل زیر است:
اگر می خواهید تمام ستون ها را در یک جدول جدید کپی کنید از این ساختار استفاده کنید:
SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition;
اگر می خواهید برخی از ستون ها را در یک جدول جدید کپی کنید از این ساختار استفاده کنید:
SELECT column1, column2, column3, ... INTO newtable [IN externaldb] FROM oldtable WHERE condition;
جدول جدیدی که به این شکل ساخته می شود شامل ستون های انتخابی شما خواهد بود. نام ستون ها و نوع داده ها و تمام موارد دیگر نیز دقیقا یکی بوده و تغییر نخواهند کرد.
مثال اول - دستور SQL زیر مقدار یک نسخه ی بکاپ از جدول Customers ایجاد می کند:
SELECT * INTO CustomersBackup2019 FROM Customers;
مثال دوم - دستور SQL زیر با استفاده از دستور IN جدول ما را در یک پایگاه داده ی (database) دیگر کپی می کند:
SELECT * INTO CustomersBackup2019 IN 'Backup.mdb' FROM Customers;
مثال سوم - دستور SQL زیر تنها تعدادی از ستون ها را در یک جدول جدید کپی می کند:
SELECT CustomerName, ContactName INTO CustomersBackup2019 FROM Customers;
مثال چهارم - دستور SQL زیر مشتریان آلمانی را در یک جدول جداگانه کپی می کند:
SELECT * INTO CustomersGermany FROM Customers WHERE Country = 'Germany';
مثال پنجم - دستور SQL زیر داده های مختلفی را از چند جدول گرفته و داخل یک جدول کپی می کند:
SELECT Customers.CustomerName, Orders.OrderID INTO CustomersOrderBackup2019 FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
نکته: می توانید از دستور SELECT INTO برای ایجاد یک جدول جدید و خالی استفاده کنید که بر اساس schema (طرح) جدول دیگری باشد. برای این کار تنها کافیست به شکل زیر از دستور WHERE استفاده کنید:
SELECT * INTO newtable FROM oldtable WHERE 1 = 0;
استفاده از دستور WHERE به این شکل باعث می شود کوئری هیچ داده ای را بر نگرداند.
امیدوارم از این قسمت لذت برده باشید و به شما کمک کرده باشد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.