MySQL Basics
Sorting Data
MySQL এর Query তে Sorting Data কি?
একটি MySQL ক্যোয়ারীতে ডেটা Sorting করা মানে এক বা একাধিক কলামের উপর ভিত্তি করে একটি নির্দিষ্ট অর্ডারে বা ক্রমে ফলাফল সেট সাজানো। ডিফল্টরূপে, যখন আপনি একটি SELECT statement ব্যবহার করে একটি MySQL টেবিল থেকে ডেটা আনেন, রিটার্নকৃত রো গুলির Order বা ক্রম সামঞ্জস্যপূর্ণ নাও হতে পারে। আর এই রো গুলির Order ঠিক রাখতে, আপনাকে ক্যোয়ারীতে ORDER BY ক্লজ ব্যবহার করতে হবে , আপনি এমন একটি বা একাধিক নির্দিষ্ঠ কলাম(গুলি) নির্দিষ্ট করতে পারেন যা ডেটা Sorting বা সাজানোর জন্য ব্যবহার করা উচিত, হয় ascending (ASC) বা descending (DESC) অর্ডারে ।
এই পর্বে, আমরা জানব কিভাবে একটি টেবিল থেকে ডেটা কোয়েরি পাশাপাশি ডেটা কে Sorting করতে হয় এবং MySQL SELECT statement এর পাশাপাশি ORDER BY statement ব্যবহার করতে হয়। তবে তার আগে এই পোস্টের সবগুলো উদাহরণ প্র্যাক্টিস করার জন্য আপনাকে এই Sample Database Schema টি ডাউনলোড করতে হবে এবং আপনার MySQL ডাটাবেজে ইম্পোর্ট করতে হবে।
ORDER BY ক্লজ সহ একটি MySQL কোয়েরির মৌলিক সিনট্যাক্স নিম্নরূপ:
SELECT select_list FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
MySQL কোয়েরির প্রতিটি অংশের বিস্তারিত এখানে দেওয়া হলো :
- SELECT: টেবিল থেকে আপনি যে কলামগুলি পুনরুদ্ধার করতে চান তা নির্দিষ্ট করে।
- FROM: টেবিলের নাম নির্দেশ করে যেখান থেকে ডেটা আনা উচিত।
- ORDER BY: এই ক্লজটি কলামগুলি নির্দিষ্ট করতে ব্যবহৃত হয় যার ভিত্তিতে আপনি ফলাফল সেটটি sorting অর্থাৎ সাজাতে চান।
- column1, column2, …: এই কলামগুলি আপনি সাজানোর জন্য ব্যবহার করতে চান। আপনি কমা দ্বারা পৃথক করা এক বা একাধিক কলাম ব্যবহার করতে পারেন।
- ASC|DESC: ঐচ্ছিক কীওয়ার্ড ASC হল ascending order (সবচেয়ে ছোট থেকে বৃহত্তম), যখন DESC হল descending order (সবচেয়ে বড় থেকে ছোট)। আপনি যদি এই কীওয়ার্ডটি বাদ দেন, ASC কে ডিফল্ট অর্ডার হিসেবে ধরে নেওয়া হবে।
MySQL ORDER BY examples
আমরা demonstration এর জন্য sample database থেকে customers টেবিল ব্যবহার করব।
A) MySQL ORDER BY clause ব্যবহার করে একটি Column কে ভিত্তি করে Sorting
নিম্নোক্ত query টি ORDER BY ক্লজ ব্যবহার করে customers দের তাদের শেষ নাম অনুসারে ascending অর্ডারে সাজাতে:
SELECT contactLastname, contactFirstname FROM customers ORDER BY contactLastname;
Output:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Accorti | Paolo | | Altagar,G M | Raanan | | Andersen | Mel | | Anton | Carmen | | Ashworth | Rachel | | Barajas | Miguel | ...
আবার আপনি যদি customers দের last name অনুসারে sort করতে চান তাহলে নিচের ক্যোয়ারীতে দেখানো হিসাবে ORDER BY ক্লজে contactLastname কলামের পরে DESC ব্যবহার করুন:
SELECT contactLastname, contactFirstname FROM customers ORDER BY contactLastname DESC;
Ouptut:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Young | Jeff | | Young | Julie | | Young | Mary | | Young | Dorothy | | Yoshido | Juri | | Walker | Brydey | | Victorino | Wendy | | Urs | Braun | | Tseng | Jerry | ....
B) MySQL ORDER BY clause ব্যবহার করে একাধিক Column কে ভিত্তি করে Sorting
আপনি যদি customers দের last name অনুসারে descending order এবং তারপর ascending order এ first name অনুসারে বাছাই করতে চান, আপনি নিম্নোক্তভাবে এই নিজ নিজ কলামে DESC এবং ASC উভয়ই নির্দিষ্ট করতে পারেন :
SELECT contactLastname, contactFirstname FROM customers ORDER BY contactLastname DESC , contactFirstname ASC;
Output:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Young | Dorothy | | Young | Jeff | | Young | Julie | | Young | Mary | | Yoshido | Juri | | Walker | Brydey | | Victorino | Wendy | | Urs | Braun | | Tseng | Jerry | | Tonini | Daniel |
এই উদাহরণে, ORDER BY ক্লজ last name দ্বারা সেট করা ফলাফলকে প্রথমে descending order এ সাজায় এবং তারপর চূড়ান্ত ফলাফল সেট করতে ascending order এ first name দ্বারা সেট করা ফাইনাল ফলাফলকে সাজায়।
C) একটি expression উদাহরণ দ্বারা সেট করা ফলাফল Sorting করার জন্য MySQL ORDER BY clause ব্যবহার
আমাদের দেওয়া sample database থেকে নিম্নলিখিত orderdetails টেবিল দেখুন.
নিম্নলিখিত ক্যোয়ারী orderdetails টেবিল থেকে অর্ডার লাইন আইটেম নির্বাচন করে। এটি প্রতিটি লাইন আইটেমের জন্য সাবটোটাল গণনা করে এবং সাবটোটালের উপর ভিত্তি করে ফলাফল সেট সাজায়।
SELECT orderNumber, orderlinenumber, quantityOrdered * priceEach FROM orderdetails ORDER BY quantityOrdered * priceEach DESC;
+-------------+-----------------+-----------------------------+ | orderNumber | orderlinenumber | quantityOrdered * priceEach | +-------------+-----------------+-----------------------------+ | 10403 | 9 | 11503.14 | | 10405 | 5 | 11170.52 | | 10407 | 2 | 10723.60 | | 10404 | 3 | 10460.16 | | 10312 | 3 | 10286.40 | ...
ক্যোয়ারীটিকে আরও readable করতে, আপনি SELECT ক্লজে একটি column alias expression বরাদ্দ এসাইন করতে পারেন এবং নিম্নলিখিত ক্যোয়ারীতে দেখানো হিসাবে ORDER BY ক্লজে সেই column alias ব্যবহার করতে পারেন:
SELECT orderNumber, orderLineNumber, quantityOrdered * priceEach AS subtotal FROM orderdetails ORDER BY subtotal DESC;
+-------------+-----------------+----------+ | orderNumber | orderLineNumber | subtotal | +-------------+-----------------+----------+ | 10403 | 9 | 11503.14 | | 10405 | 5 | 11170.52 | | 10407 | 2 | 10723.60 | | 10404 | 3 | 10460.16 | | 10312 | 3 | 10286.40 | | 10424 | 6 | 10072.00 | | 10348 | 8 | 9974.40 | | 10405 | 3 | 9712.04 | | 10196 | 5 | 9571.08 | | 10206 | 6 | 9568.73 | ...
এই উদাহরণে, আমরা quantityOrdered * priceEach এক্সপ্রেশনের জন্য column alias হিসাবে subtotal ব্যবহার করি এবং subtotal alias দ্বারা সেট করা ফলাফলকে সাজাই।
যেহেতু MySQL ORDER BY ক্লজের আগে SELECT ক্লজের মূল্যায়ন করে, তাই আপনি ORDER BY ক্লজের SELECT ক্লজে উল্লেখ করা column alias ব্যবহার করতে পারেন।
Custom list ব্যবহার করে ডেটা sort করার জন্য MySQL ORDER BY ক্লজ এর ব্যবহার
Custom list ব্যবহার করে ডেটা sort করার জন্য MySQL ORDER BY ক্লজ এর ব্যবহার করার জন্য আপনাকে FIELD() ফাঙ্কশন ব্যবহার করতে হবে। FIELD() ফাংশনের সিনট্যাক্স নিম্নরুপঃ
FIELD(str, str1, str2, ...)
FIELD() ফাংশন str1, str2, … লিস্টের str এর অবস্থান প্রদান করে। যদি str লিস্টে না থাকে, FIELD() ফাংশনটি 0 প্রদান করে। উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারীটি 1 প্রদান করে কারণ স্ট্রিং ‘A’ এর অবস্থান তালিকার প্রথম অবস্থান ‘A’, ‘B’ এবং ‘সি’:
SELECT FIELD('A', 'A', 'B','C');
Output:
+--------------------------+ | FIELD('A', 'A', 'B','C') | +--------------------------+ | 1 | +--------------------------+ 1 row in set (0.00 sec)
এবার নিম্নলিখিত উদাহরণে আপনাকে রেজাল্ট 2 প্রদান করবে :
SELECT FIELD('B', 'A','B','C');
Output:
+-------------------------+ | FIELD('B', 'A','B','C') | +-------------------------+ | 2 | +-------------------------+ 1 row in set (0.00 sec)
আরো একটি বাস্তব উদাহরণ নেওয়া যাক।
sample database থেকে নিম্নলিখিত অর্ডার টেবিল দেখুন.
ধরুন আপনি নিম্নলিখিত অর্ডারে তাদের অবস্থার উপর ভিত্তি করে বিক্রয় আদেশগুলি sort বা সাজাতে চান:
- In Process
- On Hold
- Canceled
- Resolved
- Disputed
- Shipped
এটি করার জন্য, আপনি FIELD() ফাংশনটি ব্যবহার করে প্রতিটি অর্ডার স্ট্যাটাস একটি সংখ্যায় ম্যাপ করতে পারেন এবং FIELD() ফাংশনের ফলাফল অনুসারে ফলাফল সাজাতে পারেন:
SELECT orderNumber, status FROM orders ORDER BY FIELD(status, 'In Process', 'On Hold', 'Cancelled', 'Resolved', 'Disputed', 'Shipped');
+-------------+------------+ | orderNumber | status | +-------------+------------+ | 10425 | In Process | | 10421 | In Process | | 10422 | In Process | | 10420 | In Process | | 10424 | In Process | | 10423 | In Process | | 10414 | On Hold | | 10401 | On Hold | | 10334 | On Hold | | 10407 | On Hold | ...
MySQL ORDER BY এবং NULL এর ব্যবহার
MySQL-এ NULL value গুলো non-NULL value গুলোর আগে আসে। অতএব, আপনি যখন ASC option এর সাথে ORDER BY ক্লজ করেন, তখন ফলাফল সেটে NULLগুলি প্রথমে উপস্থিত হয়।
উদাহরণ স্বরূপ, reportsTo কলামে মান অনুসারে employees দের sort করার জন্য নিম্নলিখিত ক্যোয়ারীটি ORDER BY ধারা ব্যবহার করতে পারেন :
SELECT firstName, lastName, reportsTo FROM employees ORDER BY reportsTo;
Output:
+-----------+-----------+-----------+ | firstName | lastName | reportsTo | +-----------+-----------+-----------+ | Diane | Murphy | NULL | | Mary | Patterson | 1002 | | Jeff | Firrelli | 1002 | | William | Patterson | 1056 | | Gerard | Bondur | 1056 | ...
তবে, আপনি যদি DESC option এর সাথে ORDER BY ব্যবহার করেন, তাহলে ফলাফল সেটে NULL value গুলো শেষ দেখাবে। উদাহরণ স্বরূপ:
SELECT firstName, lastName, reportsTo FROM employees ORDER BY reportsTo DESC;
Output: +-----------+-----------+-----------+ | firstName | lastName | reportsTo | +-----------+-----------+-----------+ | Yoshimi | Kato | 1621 | | Leslie | Jennings | 1143 | | Leslie | Thompson | 1143 | | Julie | Firrelli | 1143 | | .... | Mami | Nishi | 1056 | | Mary | Patterson | 1002 | | Jeff | Firrelli | 1002 | | Diane | Murphy | NULL | +-----------+-----------+-----------+ 23 rows in set (0.00 sec)