اپراتورهای ANY ،ALL و دستور SELECT INTO

25 اسفند 1397
درسنامه درس 18 از سری آموزش زبان SQL
SQL-any-all-select-into

با سلامی گرم خدمت همراهان همیشگی روکسو، در این قسمت از سری آموزش جامع زبان SQL می خواهیم در مورد دو اپراتور ALL و ANY و همچنین دستور SELECT INTO صحبت کنیم. با ما همراه باشید.

اپراتور های ALL و ANY

این دو اپراتور معمولا به همراه دستور 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 نیستند) را توضیح می دهم:

  • name به معنی نام است.
  • column به معنی ستون است بنابراین باید به جای column_name نام ستون مورد نظر خودتان را قرار دهید.
  • table به معنی جدول است بنابراین باید به جای table_name نام جدول مورد نظرتان را قرار دهید.
  • condition به معنی شرط است بنابراین باید به جای آن شرط مورد نظر خودتان را قرار دهید.
  • row به معنای ردیف است بنابراین اگر در جایی آن را دیدید باید به جایش ردیف مورد نظرتان را قرار دهید.

قبل از بررسی مثال ها باید نگاهی به جدول 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

مثال های کاربردی ANY و ALL

مثال اول - دستور 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 را در لغت ترجمه کنم می شود «داخل ... انتخاب کن» اما اینطور خیلی معنی نمی دهد، درست است؟ منظور این دستور این است که فلان چیز را انتخاب کن و داخل فلان جدول بگذار، بنابراین از معنی دستور می توان فهمید که این دستور برای کپی کردن داده ها از یک جدول به جدول دیگر استفاده می شود.

ساختار کلی این دستور به شکل زیر است:

اگر می خواهید تمام ستون ها را در یک جدول جدید کپی کنید از این ساختار استفاده کنید:

SELECT *
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

اگر می خواهید برخی از ستون ها را در یک جدول جدید کپی کنید از این ساختار استفاده کنید:

SELECT column1, column2, column3, ...
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

جدول جدیدی که به این شکل ساخته می شود شامل ستون های انتخابی شما خواهد بود. نام ستون ها و نوع داده ها و تمام موارد دیگر نیز دقیقا یکی بوده و تغییر نخواهند کرد.

مثال های کاربردی SELECT INTO

مثال اول - دستور 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 به این شکل باعث می شود کوئری هیچ داده ای را بر نگرداند.

امیدوارم از این قسمت لذت برده باشید و به شما کمک کرده باشد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

زاغی
06 آذر 1399
توضیح تکمیلی پیام قبل :منظور از مثال سه، مثال سه از بخش any وall است.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

زاغی
06 آذر 1399
با عرض سلام به شما و تشکر از آموزش بسیار خوب و مفیدتون. به نظرم پاسخ مثال سه نیاز به تجدید نظر دارد. فکر می‌کنم با اجرای دو کوئری زیر متوجه علت اشتباه بشوید. select productname from products inner join orderdetails on products.productid= orderdetails.productid where quantity =all(select quantity from orderdetails where products.productid= orderdetails.productid); SELECT productid, min(quantity) ,max(quantity) FROM OrderDetails group by productid having min(quantity)=max(quantity); البته ممکن است من صورت سوال را اشتباه متوجه شده باشم. در این صورت ممنون می‌شوم راهنمایی‌ام بفرمایید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.