اپراتورهای UNION و GROUP BY در زبان SQL

17 اسفند 1397
درسنامه درس 16 از سری آموزش زبان SQL
SQL-Language-union-groupby-operators

با سلام خدمت همراهان همیشگی روکسو، امروز در رابطه با دو اپراتور دیگر در زبان SQL به نام UNION و GROUP BY صحبت خواهیم کرد. با ما همراه باشید.

اپراتور UNION

UNION در لغت به معنی اتحاد یا پیوند است. همانطور که از نام این اپراتور مشخص شد، کارش ایجاد پیوند و اتحاد است اما چگونه؟

در واقع UNION بین دو یا چند عدد از نتایج دستورات SELECT پیوند ایجاد می کند و آن ها را ادغام می کند.

البته قوانین و شرایط زیر را دارند:

  • هر کدام از دستورات SELECT که در UNION قرار می گیرند باید تعداد ستون های یکسانی داشته باشند.
  • ستون ها باید نوع داده ی یکسانی داشته باشند.
  • ستون های هر یک از دستورات SELECT باید ترتیب یکسانی نیز داشته باشند.

ساختار کلی اپراتور UNION به شکل زیر است:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

ساختار کلی اپراتور UNION ALL به شکل زیر است:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

تفاوت UNION ALL و UNION در این است که UNION تنها مقادیر غیر تکراری را انتخاب می کند اما UNION ALL تمام مقادیر را انتخاب می کند.

نکته: نام ستون ها در نتایج بازگشتی از UNION معمولا همان نام ستون های اولین دستور SELECT است.

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

قصد داریم کار خود را روی این دو جدول انجام دهیم بنابراین به محتوای آن ها دقت کنید.

مثال کار با UNION

مثال اول - دستور SQL زیر تمام شهر های غیر تکراری را از هر دو جدول Customers و Suppliers می گیرد و برمی گرداند:

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

مثال دوم - دستور SQL زیر تمام شهر ها (چه تکراری و چه غیر تکراری) را از هر دو جدول Customers و Suppliers می گیرد و برمی گرداند:

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

مثال سوم - دستور SQL زیر تمام شهر های آلمانی را از هر دو جدول Customers و Suppliers برمی گرداند (البته شهر های غیر تکراری را):

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

اگر بخواهیم شهر های تکراری نیز برایمان به نمایش در بیاید مانند مثال قبل عمل کرده و کد را به این شکل می نویسیم:

SELECT City, Country FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;

مثال چهارم - دستور SQL زیر تمام تامین کننده ها (suppliers) و مشتریان (customers) را بر میگردند:

SELECT 'Customer' As Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

اپراتور GROUP BY

اپراتور GROUP BY معمولا به همراه توابع تجمیع (COUNT, MAX, MIN, SUM, AVG) استفاده می شود تا نتایج یک دستور را بر اساس یک یا چند ستون مرتب کند.

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

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

می خواهیم کد هایمان را روی جدول 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
UK WA1 1DP London 120 Hanover Sq. Thomas Hardy Around the Horn 4
Sweden S-958 22 Luleå Berguvsvägen 8 Christina Berglund Berglunds snabbköp 5

مثال کار با GROUP BY

مثال اول - دستور SQL زیر تعداد مشتریانِ هر کشور را به صورت لیست به ما ارائه می دهد:

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

مثال دوم - دستور SQL زیر تعداد مشتریانِ هر کشور را به صورت لیست به ما ارائه می دهد اما تفاوتش با مثال قبل این است که آن ها را از کشور هایی با بیشترین مشتری به کشور هایی با کمترین مشتری مرتب می کند:

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

حالا به سراغ قسمتی از جدول های Orders و Shippers می رویم و دستوراتمان را روی آن اجرا می کنیم. جدول Orders:

ShipperID OrderDate EmployeeID CustomerID OrderID
3 1996-07-04 5 90 10248
1 1996-07-05 6 81 10249
2 1996-07-08 4 34 10250

جدول Shippers:

ShipperName ShipperID
Speedy Express 1
United Package 2
Federal Shipping 3

مثال سوم - دستور SQL زیر تعداد سفارشاتی را که هر shipper (ارسال کننده ی سفارشات) ارسال کرده است را برمیگرداند:

SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;

برای اجرای این دستور در پایگاه داده ی Northwind به این لینک مراجعه کنید.

خلاصه ی مقاله

در این قسمت با دو اپراتور بسیار مهم در SQL آشنا شدیم؛ اپراتور UNION و GROUP BY. حتما استفاده های عملی از این دو اپراتور را به کرات دیده اید. به طور مثال اگر بخواهید تعداد سفارشات فلان مشتری را دریافت کنید، یا تعداد لایک های فلان پست را بگیرید و آن ها را مقایسه کنید و ... در تمام این موارد از این دو اپراتور استفاده می شود. امیدوارم این قسمت مورد قبول شما قرار گرفته باشد.

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

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

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

سمیرا نظری
23 اردیبهشت 1400
این درس و درس قبلی رو خیلی بد توضیح دادین

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