با سلامی گرم خدمت شما همراهان همیشگی روکسو، امروز می خواهیم در مورد دستورات و توابعی صحبت کنیم که شاید استفاده ی روزانه نداشته باشند و تنها در مواقع خاصی از آن ها استفاده کنیم. به طور مثال دستوراتی مانند INSERT INTO SELECT و یا توابعی مانند ()IFNULL
.
این دستور داده ها را از یک جدول کپی کرده و داخل جدول دیگری قرار می دهد. تفاوت آن با SELECT INTO این است که:
ساختار کلی این دستور به شکل زیر است.
اگر می خواهید تمام ستون ها را از یک جدول وارد جدول دیگر کنید:
INSERT INTO table2 SELECT * FROM table1 WHERE condition;
اگر می خواهید برخی ستون ها را از یک جدول وارد جدول دیگر کنید:
INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition;
ما می خواهیم مثال هایمان را روی قسمت هایی از دو جدول Customers و Suppliers پیاده کنیم بنابراین بیایید به آن ها نگاهی بیندازیم.
جدول Customers:
Country | PostalCode | City | Address | ContactName | CustomerName | CustomerID |
Germany | 12209 | Berlin | Obere Str. 57 | Maria Anders | Alfreds Futterkiste | 1 |
Mexico | 05021 | México D.F. | Avda. de la Constitución 2222 | Ana Trujillo | Ana Trujillo Emparedados y helados | 2 |
Mexico | 05023 | México D.F. | Mataderos 2312 | Antonio Moreno | Antonio Moreno Taquería | 3 |
جدول Suppliers:
Country | PostalCode | City | Address | ContactName | SupplierName | SupplierID |
UK | EC1 4SD | London | 49 Gilbert St. | Charlotte Cooper | Exotic Liquid | 1 |
USA | 70117 | New Orleans | P.O. Box 78934 | Shelley Burke | New Orleans Cajun Delights | 2 |
USA | 48104 | Ann Arbor | 707 Oxford Rd. | Regina Murphy | Grandma Kelly's Homestead | 3 |
مثال اول - دستور SQL زیر جدول Suppliers را در Customers ادغام می کند. ردیف هایی که خالی از داده باشند مقدار NULL میگیرند:
INSERT INTO Customers (CustomerName, City, Country) SELECT SupplierName, City, Country FROM Suppliers;
اجرای این دستور در پایگاه داده ی Northwind
مثال دوم- دستور SQL زیر جدول Suppliers را در Customers ادغام می کند. تفاوت این دستور با دستور قبلی آنجاست که در این مثال تمام ستون ها پر می شوند:
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;
اجرای این دستور در پایگاه داده ی Northwind
مثال سوم - دستور SQL زیر تنها تامین کننده (suppliers) هایی را به Customers می فرستد که آلمانی باشند:
INSERT INTO Customers (CustomerName, City, Country) SELECT SupplierName, City, Country FROM Suppliers WHERE Country='Germany';
اجرای این دستور در پایگاه داده ی Northwind
نحوه ی کار دستور CASE بسیار ساده است. دستور CASE شرط های مختلف را بررسی می کند و زمانی که اولین شرط صحیح را پیدا کند، مقداری را بر می گرداند. زمانی که شرط صحیح را پیدا کند، دیگر کد را ادامه نمی دهد و برایش مهم نیست که ممکن است شروط صحیح دیگری نیز در ادامه وجود داشته باشند. اگر هیچ شرطی صحیح نباشد (صحیح بودن به معنای برقرار بودن شرط یا همان true بودن است) مقدار ELSE را بر می گرداند و اگر ELSE را تعریف نکرده باشیم نیز مقدار NULL را بر می گرداند.
ساختار کلی این دستور به شکل زیر است:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN conditionN THEN resultN ELSE result END;
بیایید نگاهی به قسمتی از جدول 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 زیر چندین شرط مختلف تعریف کرده ایم و آن ها را به دستور CASE داده ایم. دستور CASE نیز شروع به بررسی آن ها می کند و مقدار اولین شرطی را که صحیح باشد برمیگرداند:
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails;
اجرای این دستور در پایگاه داده ی Northwind
مثال دوم - دستور SQL زیر مشتریان (customer) را بر اساس شهر هایشان مرتب می کند و اگر مقدار شهر برای هر کدام از آن ها NULL بود، آن ها را بر اساس کشور مرتب می کند:
SELECT CustomerName, City, Country FROM Customers ORDER BY (CASE WHEN City IS NULL THEN Country ELSE City END);
اجرای این دستور در پایگاه داده ی Northwind
نکته: حتما از قسمت های قبلی به یاد دارید که این مرتب کردن بر اساس حروف الفبای انگلیسی است و در غیر اینصورت بی معنی خواهد بود.
در این قسمت با توابع ()IFNULL و ()ISNULL و ()COALESCE و ()NVL آشنا می شویم.
به جدول زیر به نام Products نگاهی بیندازید:
UnitsOnOrder | UnitsInStock | UnitPrice | ProductName | P_Id |
15 | 16 | 10.45 | Jarlsberg | 1 |
23 | 32.56 | Mascarpone | 2 | |
20 | 9 | 15.67 | Gorgonzola | 3 |
فرض ما این است که ستون UnitsOnOrder الزامی نیست و می تواند خالی بماند (مقدار NULL بگیرد). حالا به دستور زیر نگاه کنید:
SELECT ProductName, UnitPrice * (UnitsInStock + UnitsOnOrder) FROM Products;
در این دستور اگر هر کدام از خانه های UnitsOnOrder خالی باشند (مقدار NULL)، نتیجه ی کوئری نیز مقدار NULL خواهد بود. راه حل چیست؟
در MYSQL باید از ()IFNULL
استفاده کنید. این دستور به شما اجازه می دهد که در صورت مواجهه با مقادیر NULL، مقدار جایگزینی را برگردانید:
SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0)) FROM Products
راه حل دیگر برای MYSQL استفاده از ()COALESCE
است:
SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0)) FROM Products
تابع ()IFNULL
در صورت برخورد با مقدار NULL، مقدار جایگزینی را برمیگرداند. تابع ()COALESCE
در صورت برخورد با مقدار NULL از لیستی که به آن داده شده است اولین مقدار غیر NULL را بر میگرداند اما در این مثال عملا هر دو روش یک کار را انجام می دهند.
استفاده از تابع ()ISNULL که دقیقا مشابه ()IFNULL
عمل می کند:
SELECT ProductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0)) FROM Products
از تابع ()IsNull استفاده کنید؛ اگر شرط ما NULL باشد مقدار TRUE (همان 1-) و اگر غیر آن باشد FALSE (یا 0) را برمیگرداند:
SELECT ProductName, UnitPrice * (UnitsInStock + IIF(IsNull(UnitsOnOrder), 0, UnitsOnOrder)) FROM Products
از تابع ()NVL استفاده کنید تا دقیقا همان نتایج قبلی را به دست بیاورید:
SELECT ProductName, UnitPrice * (UnitsInStock + NVL(UnitsOnOrder, 0)) FROM Products
امیدوارم از این قسمت لذت برده باشید. قسمت بعد در رابطه با stored procedure ها خواهد بود و بعد از آن به سراغ مباحث دستورات SQL برای ساخت یک پایگاه داده می رویم.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.