Database Tutorials Advanced SQL Query Techniques গাইড ও নোট

307

SQL কিউরি লেখার সময় কিছু উন্নত কৌশল ব্যবহার করা যেতে পারে যা পারফরম্যান্স উন্নত করতে এবং জটিল ডেটা বিশ্লেষণে সহায়ক হতে পারে। এখানে Advanced SQL Query Techniques এর মধ্যে কিছু গুরুত্বপূর্ণ কৌশল আলোচনা করা হল।


১. Window Functions (ওন্ডো ফাংশন)

Window Functions SQL এর একটি শক্তিশালী ফিচার যা এগ্রিগেট ফাংশন (যেমন SUM(), AVG(), COUNT()) কে পাইপলাইনে বা উইন্ডোর ভিতরে চালানোর অনুমতি দেয়, যেখানে আপনি একটি নির্দিষ্ট রেঞ্জের রেকর্ডগুলোকে একসাথে প্রক্রিয়া করতে পারেন। এটি সাধারণত রেকর্ডের পারফরম্যান্স পরিমাপ বা র‌্যাংকিং করতে ব্যবহৃত হয়।

উদাহরণ (ROW_NUMBER, RANK, DENSE_RANK):

SELECT name, department, salary,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

এটি employees টেবিল থেকে প্রতিটি department এর জন্য একটি র‌্যাংক প্রদান করবে, যেখানে বেতন অনুযায়ী র‌্যাংকিং করা হয়েছে।

  • ROW_NUMBER(): র‌্যাংকিং প্রদান করে, যেখানে ডুপ্লিকেট র‌্যাংক থাকে না।
  • RANK(): র‌্যাংকিং প্রদান করে, যেখানে সমান মানের জন্য একে অপরের সাথে সমান র‌্যাংক থাকবে।
  • DENSE_RANK(): র‌্যাংকিং প্রদান করে, তবে র‌্যাংকিংয়ে কোনো গ্যাপ থাকে না।

২. Common Table Expressions (CTE)

CTE হল একটি টেম্পোরারি ফলাফল যা একটি SQL কুয়েরি ব্লকের জন্য তৈরি করা হয়। এটি জটিল কুয়েরি গুলোকে আরও পাঠযোগ্য এবং রিইউসেবল বানাতে সহায়ক। CTE-কে সাধারণত Recursive Queries এ ব্যবহৃত হয়, কিন্তু এটি Non-recursive Queries এর জন্যও ব্যবহার করা যেতে পারে।

উদাহরণ:

WITH EmployeeCTE AS (
    SELECT name, department, salary
    FROM employees
    WHERE department = 'Sales'
)
SELECT * FROM EmployeeCTE WHERE salary > 50000;

এটি প্রথমে একটি CTE তৈরি করবে যা Sales বিভাগের সমস্ত কর্মচারীর তথ্য সংগ্রহ করবে এবং পরে CTE-কে ব্যবহার করে বেতন ৫০,০০০ এর বেশি এমন কর্মচারীদের তথ্য ফিরিয়ে দেবে।

  • Recursive CTE: এটি একটি বিশেষ ধরনের CTE যা নিজেই নিজের উপর কুয়েরি করতে পারে, সাধারণত হায়ারার্কিকাল ডেটা (যেমন, অ্যাডমিনিস্ট্রেটিভ স্ট্রাকচার) পরিচালনা করতে ব্যবহৃত হয়।

Recursive CTE উদাহরণ:

WITH RECURSIVE EmployeeHierarchy AS (
    SELECT employee_id, manager_id, name
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.employee_id, e.manager_id, e.name
    FROM employees e
    INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM EmployeeHierarchy;

এটি employees টেবিল থেকে একটি recursive হায়ারার্কি তৈরি করবে, যেখানে প্রতিটি কর্মচারী এবং তাদের ম্যানেজারের সম্পর্ক দেখতে পারবেন।


৩. Subqueries in SELECT Clause

Subqueries বা Nested Queries একটি কুয়েরি যা অন্য কুয়েরির ভিতরে থাকে। Subqueries সাধারণত WHERE, FROM, বা SELECT ক্লজে ব্যবহার করা হয়। এটি খুবই উপকারী যখন আপনাকে একটি নির্দিষ্ট মান বা গ্রুপ অনুযায়ী রেকর্ড ফেরত পেতে হয়।

উদাহরণ:

SELECT name, (SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;

এটি employees টেবিলের প্রতিটি কর্মচারীর জন্য তার নাম এবং সমস্ত কর্মচারীর গড় বেতন (উপস্থিত সর্বোচ্চ একাধিক কর্মচারী) দেখাবে।


৪. Complex Joins (Multiple Joins)

একাধিক টেবিলের মধ্যে JOIN করা হয় যখন আপনি একাধিক সম্পর্কিত টেবিল থেকে ডেটা একত্র করতে চান। এটি INNER JOIN, LEFT JOIN, RIGHT JOIN, এবং FULL JOIN সহ অন্যান্য প্রকারের JOIN এর মাধ্যমে করা যায়।

উদাহরণ (Multiple Joins):

SELECT employees.name, departments.department_name, salaries.salary
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id
INNER JOIN salaries ON employees.employee_id = salaries.employee_id;

এখানে তিনটি টেবিল (employees, departments, salaries) এর মধ্যে INNER JOIN করা হয়েছে, যাতে আপনি একটি কর্মচারীর নাম, তাদের বিভাগের নাম এবং বেতন দেখতে পারেন।


৫. Pivot and Unpivot Queries

Pivot এবং Unpivot হল ডেটাবেসে ডেটার আউটপুট স্টাইল পরিবর্তন করার কৌশল। Pivot সাধারণত কলামের ডেটাকে সারিতে রূপান্তরিত করে এবং Unpivot সারির ডেটাকে কলামে রূপান্তরিত করে।

Pivot Example:

SELECT department, 
       SUM(CASE WHEN month = 'January' THEN sales ELSE 0 END) AS January,
       SUM(CASE WHEN month = 'February' THEN sales ELSE 0 END) AS February
FROM sales_data
GROUP BY department;

এটি sales_data টেবিল থেকে প্রতিটি বিভাগের জন্য জানুয়ারি এবং ফেব্রুয়ারি মাসে বিক্রির তথ্য পিভট করবে।

Unpivot Example:

SELECT department, month, sales
FROM (SELECT department, January, February FROM sales_data) p
UNPIVOT (sales FOR month IN (January, February)) AS unpvt;

এটি পূর্বের পিভট ডেটা আনপিভট করবে, যেখানে প্রতিটি মাসের জন্য আলাদা রেকর্ড দেখাবে।


৬. Grouping Sets, Rollup, and Cube

এই ফিচারগুলি ব্যবহার করে আপনি GROUP BY ক্লজের সঙ্গে বিভিন্ন ধরনের অ্যাগ্রিগেশন তৈরি করতে পারেন। এগুলি বিশেষভাবে অ্যাগ্রিগেট ফাংশন ব্যবহার করে গ্রুপ ডেটাকে আরও কার্যকরীভাবে বিশ্লেষণ করতে সহায়ক।

Grouping Sets:

SELECT department, year, SUM(salary)
FROM employees
GROUP BY GROUPING SETS ((department), (year), (department, year));

এটি department, year, এবং department, year অনুসারে গ্রুপ করবে এবং তাদের যোগফল দেখাবে।

ROLLUP:

SELECT department, year, SUM(salary)
FROM employees
GROUP BY ROLLUP(department, year);

এটি প্রতিটি department এবং year এর জন্য অ্যাগ্রিগেট ফাংশন চালাবে এবং মোট যোগফলও দেখাবে।

CUBE:

SELECT department, year, SUM(salary)
FROM employees
GROUP BY CUBE(department, year);

এটি একটি 3D গ্রিড তৈরি করবে এবং সব সম্ভাব্য সংমিশ্রণের জন্য ডেটা দেখাবে।


৭. Query Optimization Techniques

  • Indexing: টেবিলের উপর উপযুক্ত index তৈরি করা কার্যক্ষমতা দ্রুততর করতে সাহায্য করে। এটি বিশেষ করে যখন আপনি WHERE, JOIN, এবং ORDER BY ক্লজ ব্যবহার করেন তখন গুরুত্বপূর্ণ।
  • **Avoiding SELECT ***: SELECT * এর পরিবর্তে শুধু প্রয়োজনীয় কলামগুলো সিলেক্ট করা উচিত, যা কুয়েরির পারফরম্যান্স বৃদ্ধি করে।
  • Avoiding Nested Loops: অনেক সময়ে জটিল কুয়েরিতে nested loops ব্যবহার করা হয় যা পারফরম্যান্সে প্রভাব ফেলতে পারে, তাই এগুলো এড়িয়ে চলা উচিত।

উপসংহার:

SQL-এ Advanced Query Techniques ব্যবহারের মাধ্যমে আপনি ডেটা বিশ্লেষণ আরও গভীর এবং কার্যকরভাবে করতে পারেন। Window Functions, CTE, Pivot/Unpivot, GROUPING SETS, এবং Query Optimization প্রক্রিয়াগুলি আপনার SQL কুয়েরি লেখার ক্ষমতা অনেক উন্নত করবে, এবং ডেটাবেস পারফরম্যান্সের উন্নতি ঘটাতে সাহায্য করবে।

Content added By

Window Functions (ROW_NUMBER, RANK, DENSE_RANK)

268

SQL Window Functions হল বিশেষ ধরনের ফাংশন যা ডেটাকে একটি "window" (অথবা "frame") এর মধ্যে প্রক্রিয়া করে এবং সেই ফ্রেমে পৃষ্ঠার রেকর্ডে গণনা বা বিশ্লেষণ করার সুযোগ দেয়। এই ফাংশনগুলি, সাধারণত, ORDER BY ক্লজ এবং PARTITION BY ক্লজের সাথে ব্যবহৃত হয়, যা ডেটাকে বিভাগ বা অংশে বিভক্ত করে এবং সেই অংশে পরিসংখ্যান বা গণনা করে।

ROW_NUMBER, RANK, এবং DENSE_RANK হল জনপ্রিয় Window Functions, যা একটি টেবিলের মধ্যে রেকর্ডগুলির জন্য একে অপরের সাথে তুলনা করতে সহায়তা করে এবং তাদের র‌্যাঙ্ক বা অবস্থান নির্ধারণ করে।


১. ROW_NUMBER()

ROW_NUMBER() একটি Window Function যা প্রতিটি রেকর্ডের জন্য একটি সুনির্দিষ্ট সংখ্যা বা র‌্যাঙ্ক নির্ধারণ করে, যা সাধারণত টেবিলের অর্ডার অনুসারে (যেমন, অ্যাজেন্ডিং বা ডেসেন্ডিং)। এটি একটি ইউনিক র‌্যাঙ্ক দেয় এবং কখনোই ডুপ্লিকেট র‌্যাঙ্ক তৈরি করে না।

ROW_NUMBER() এর ব্যবহার:

SELECT column1, column2, ROW_NUMBER() OVER (ORDER BY column1) AS row_num
FROM table_name;
  • ROW_NUMBER(): প্রতিটি রেকর্ডের জন্য একটি ইউনিক র‌্যাঙ্ক প্রদান করে।
  • OVER (ORDER BY column1): ডেটাকে নির্দিষ্ট একটি কলাম অনুসারে অর্ডার করে।

উদাহরণ:

SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;

এখানে, salary অনুসারে প্রত্যেক কর্মচারীর একটি র‌্যাঙ্ক দেয়া হবে, এবং সবচেয়ে বেশি বেতনপ্রাপ্ত কর্মচারীকে 1 নম্বর র‌্যাঙ্ক দেয়া হবে।


২. RANK()

RANK() একটি Window Function যা প্রতিটি রেকর্ডের জন্য একটি র‌্যাঙ্ক প্রদান করে। তবে, যদি দুটি বা তার বেশি রেকর্ডের একই মান থাকে, তাহলে RANK() তাদের একই র‌্যাঙ্ক দেয় এবং পরবর্তী র‌্যাঙ্কটি লাফিয়ে চলে।

  • ডুপ্লিকেট র‌্যাঙ্ক: যদি দুটি রেকর্ডের মান একই হয়, তাহলে তারা একই র‌্যাঙ্ক পাবে, কিন্তু পরবর্তী র‌্যাঙ্কে একটি "লাফ" হবে (যেমন, দুটি রেকর্ড যদি 1 নম্বর র‌্যাঙ্ক পায়, তাহলে পরবর্তী রেকর্ডটি 3 নম্বর র‌্যাঙ্ক পাবে)।

RANK() এর ব্যবহার:

SELECT column1, column2, RANK() OVER (ORDER BY column1 DESC) AS rank
FROM table_name;

উদাহরণ:

SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

এখানে, salary অনুসারে কর্মচারীদের র‌্যাঙ্ক দেয়া হবে। যদি দুটি কর্মচারীর বেতন সমান হয়, তারা একই র‌্যাঙ্ক পাবে এবং পরবর্তী র‌্যাঙ্কে "লাফ" হবে।

আউটপুট উদাহরণ:

namesalaryrank
John50001
Alice40002
Bob40002
Steve30004

এখানে, Alice এবং Bob এর বেতন সমান হওয়ায় তাদের র‌্যাঙ্ক 2 এবং পরবর্তী কর্মচারী, Steve, র‌্যাঙ্ক 4 পেয়েছে।


৩. DENSE_RANK()

DENSE_RANK() হল একটি Window Function যা RANK() এর মতো কাজ করে, তবে এখানে কোনো "লাফ" বা শূন্য র‌্যাঙ্ক থাকে না। অর্থাৎ, যখন দুটি রেকর্ডের মান একই হয়, তারা একই র‌্যাঙ্ক পায়, তবে পরবর্তী র‌্যাঙ্ক আগের র‌্যাঙ্কের পরবর্তী মান হবে।

  • ডুপ্লিকেট র‌্যাঙ্ক: যদি দুটি রেকর্ডের মান একই হয়, তারা একই র‌্যাঙ্ক পাবে এবং পরবর্তী র‌্যাঙ্কটি আগের র‌্যাঙ্কের পরবর্তী সংখ্যা হবে (যেমন, দুটি রেকর্ড যদি 1 নম্বর র‌্যাঙ্ক পায়, পরবর্তী রেকর্ডটি 2 নম্বর র‌্যাঙ্ক পাবে)।

DENSE_RANK() এর ব্যবহার:

SELECT column1, column2, DENSE_RANK() OVER (ORDER BY column1 DESC) AS dense_rank
FROM table_name;

উদাহরণ:

SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

এখানে, salary অনুসারে কর্মচারীদের র‌্যাঙ্ক দেয়া হবে, এবং কোনো লাফ থাকবে না—যেমন, দুটি কর্মচারী যদি একই বেতন পান, তাদের পরবর্তী র‌্যাঙ্ক পরবর্তী সংখ্যা হবে।

আউটপুট উদাহরণ:

namesalarydense_rank
John50001
Alice40002
Bob40002
Steve30003

এখানে, Alice এবং Bob এর বেতন সমান, তাদের র‌্যাঙ্ক 2 হবে, এবং পরবর্তী কর্মচারী Steve র‌্যাঙ্ক 3 পাবে (এটি RANK() এর থেকে আলাদা, যেখানে Steve র‌্যাঙ্ক 4 পেতো)।


ROW_NUMBER(), RANK(), এবং DENSE_RANK() এর মধ্যে পার্থক্য:

ফাংশনব্যবহারপার্থক্য
ROW_NUMBER()প্রতিটি রেকর্ডের জন্য একটি ইউনিক র‌্যাঙ্ক প্রদান করেকখনোই ডুপ্লিকেট র‌্যাঙ্ক হয় না, সবসময় ইউনিক র‌্যাঙ্ক
RANK()সমান মানের জন্য একযোগে একই র‌্যাঙ্ক দেয়, তবে পরবর্তী র‌্যাঙ্কে "লাফ" হয়সমান মানের জন্য এক র‌্যাঙ্ক এবং পরবর্তী র‌্যাঙ্কে লাফ
DENSE_RANK()সমান মানের জন্য একই র‌্যাঙ্ক দেয় এবং পরবর্তী র‌্যাঙ্কে কোনো "লাফ" নেইসমান মানের জন্য একই র‌্যাঙ্ক, পরবর্তী র‌্যাঙ্ক আগের র‌্যাঙ্কের পরবর্তী সংখ্যা

উপসংহার:

  • ROW_NUMBER(): ইউনিক র‌্যাঙ্ক, কখনোই ডুপ্লিকেট র‌্যাঙ্ক হয় না।
  • RANK(): সমান মানের জন্য এক র‌্যাঙ্ক, পরবর্তী র‌্যাঙ্কে "লাফ"।
  • DENSE_RANK(): সমান মানের জন্য এক র‌্যাঙ্ক, পরবর্তী র‌্যাঙ্কের কোনো লাফ নেই।

এই ফাংশনগুলি সাধারণত PARTITION BY এবং ORDER BY এর সাথে ব্যবহার করা হয়, যাতে ডেটার একটি নির্দিষ্ট অংশে কাজ করা যায় এবং সঠিকভাবে র‌্যাঙ্ক নির্ধারণ করা যায়।

Content added By

Recursive Queries এবং CTE (Common Table Expressions)

344

Recursive Queries এবং CTE (Common Table Expressions) SQL-এ জটিল ডেটাবেস কুয়েরি লেখার জন্য ব্যবহৃত শক্তিশালী কৌশল। এগুলি বিশেষভাবে প্রয়োজন হয় যখন ডেটাবেসে হায়ারারকিক্যাল (Hierarchical) অথবা গ্রাফ-ভিত্তিক (Graph-based) ডেটা থাকে এবং সেই ডেটার মধ্যে সম্পর্ক অনুসন্ধান করতে হয়। এখানে Recursive Queries হল এমন কুয়েরি, যা নিজের মধ্যে পুনরাবৃত্তি হতে পারে, এবং CTE হল একটি নামকৃত কুয়েরি, যা পরে মূল কুয়েরিতে পুনরায় ব্যবহার করা যায়।


1. Common Table Expressions (CTE)

CTE হল একটি নামকৃত কুয়েরি ব্লক যা SQL স্টেটমেন্টের মধ্যে ব্যবহার করা হয়। CTE ব্যবহার করার মাধ্যমে একটি সাব-কুয়েরি বা মাঝারি স্টেপ তৈরি করা হয়, যা পরে পুরো কুয়েরি চলাকালে পুনরায় ব্যবহার করা যায়। CTE সাধারণত WITH কিওয়ার্ড দিয়ে শুরু হয় এবং পরে মূল কুয়েরি বা অন্যান্য কুয়েরিতে এটি রেফারেন্স করা যায়।

CTE এর সুবিধা:

  • পুনঃব্যবহারযোগ্য: একাধিকবার কুয়েরির মধ্যে CTE ব্যবহার করা যেতে পারে।
  • পাঠযোগ্যতা: বড় বা জটিল কুয়েরিগুলিকে ছোট ছোট অংশে বিভক্ত করে কোডের পাঠযোগ্যতা বাড়ানো যায়।
  • ডিবাগিং সহজ করা: CTE এর মধ্যে ইন্টারমিডিয়েট ফলাফল দেখা যায়, তাই ত্রুটি চিহ্নিত করা সহজ হয়।

CTE সিনট্যাক্স:

WITH cte_name AS (
    SELECT column1, column2
    FROM table_name
    WHERE condition
)
SELECT column1, column2
FROM cte_name;

উদাহরণ:

WITH department_sales AS (
    SELECT department_id, SUM(sales) AS total_sales
    FROM employees
    GROUP BY department_id
)
SELECT department_id, total_sales
FROM department_sales
WHERE total_sales > 100000;

এখানে, WITH কিওয়ার্ড ব্যবহার করে একটি CTE তৈরি করা হয়েছে, যা employees টেবিল থেকে department_id এবং total_sales বের করে, এবং পরে সেই CTE ব্যবহার করে যে বিভাগগুলির মোট বিক্রি ১০০,০০০ এর বেশি, তা দেখানো হয়েছে।


2. Recursive Queries

Recursive Queries হল এমন ধরনের কুয়েরি, যা নিজেই নিজে পুনরাবৃত্তি হতে পারে। একটি recursive CTE এমন কুয়েরি তৈরি করে, যা প্রথমে একটি বেস কেস (base case) রান করে এবং পরে পুনরায় নিজের ওপর কাজ করে, একটি নির্দিষ্ট শর্ত পর্যন্ত। এটি সাধারণত হায়ারারকিক্যাল ডেটা বা গ্রাফ ডেটা এর ক্ষেত্রে ব্যবহৃত হয়, যেমন একে অন্যের সাথে সম্পর্কযুক্ত টেবিল।

Recursive CTE এর স্ট্রাকচার:

  1. Anchor Member (Base Case): এটি সাধারণত মূল ডেটার প্রথম অংশ, যেটি রিকার্সিভ কুয়েরির প্রথম অংশ।
  2. Recursive Member: এটি সেই অংশ যেটি পুনরাবৃত্তি করে এবং anchor member এর সাথে একত্রিত হয়।
  3. Termination Condition: এটি সেই শর্ত যা নিশ্চিত করে যে রিকার্সিভ কুয়েরি কতবার পুনরাবৃত্তি হবে।

Recursive CTE সিনট্যাক্স:

WITH RECURSIVE cte_name AS (
    -- Anchor member (Base case)
    SELECT column1, column2
    FROM table_name
    WHERE condition

    UNION ALL

    -- Recursive member
    SELECT t.column1, t.column2
    FROM table_name t
    JOIN cte_name c ON t.column1 = c.column2
    WHERE condition
)
SELECT * FROM cte_name;

উদাহরণ:

ধরা যাক, আমাদের একটি employees টেবিল রয়েছে, যেখানে employee_id, manager_id এবং name রয়েছে, এবং আমরা একটি কর্মচারীর অধীনকারীদের (subordinates) লিস্ট বের করতে চাই।

employees টেবিলের উদাহরণ:

employee_idmanager_idname
1NULLJohn
21Alice
31Bob
42Charlie
52David
WITH RECURSIVE employee_hierarchy AS (
    -- Base case: Select the top manager (John)
    SELECT employee_id, name, manager_id
    FROM employees
    WHERE manager_id IS NULL

    UNION ALL

    -- Recursive case: Select employees reporting to a manager
    SELECT e.employee_id, e.name, e.manager_id
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy;

ফলাফল:

employee_idnamemanager_id
1JohnNULL
2Alice1
3Bob1
4Charlie2
5David2

এখানে employee_hierarchy নামক একটি recursive CTE ব্যবহার করা হয়েছে, যা প্রথমে John কে বেস কেস হিসেবে নেয় এবং তারপর UNION ALL ব্যবহার করে তার অধীনে থাকা কর্মচারীদের (subordinates) বের করে।


Recursive Queries এবং CTE এর সুবিধা:

  1. হায়ারারকিক্যাল ডেটা ম্যানেজমেন্ট: যেমন পারিবারিক গাছ (family tree), কর্মচারীদের হায়ারারকি, পণ্য ক্যাটালগ, যেখানে সম্পর্কের স্তর থাকে, সেখানে CTE এবং recursive queries অত্যন্ত কার্যকর।
  2. পাঠযোগ্যতা ও কোড সিমপ্লিসিটি: CTE ব্যবহার করে বড় কুয়েরি গুলি ছোট অংশে ভাগ করা যায়, যা কোড পড়তে এবং বুঝতে সহজ করে তোলে।
  3. পারফরম্যান্স: অনেক সময় recursive queries ব্যবহার করা হলে কোডের পারফরম্যান্স উন্নত হয়, কারণ বার বার JOIN এর পরিবর্তে একবারে সমগ্র ডেটার সম্পর্ক বের করা হয়।
  4. ডেটাবেস অপটিমাইজেশন: CTE ও recursive queries ডেটাবেসের অপটিমাইজেশনের জন্য ব্যবহার করা হয়, কারণ এগুলি জটিল কুয়েরি লিখতে সহায়তা করে।

সারাংশ

  • CTE (Common Table Expression) হল একটি নামকৃত কুয়েরি যা মূল কুয়েরিতে পুনরায় ব্যবহার করা যায়, এবং এটি কোডের পাঠযোগ্যতা এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
  • Recursive Queries হল এমন কুয়েরি যা নিজে নিজে পুনরাবৃত্তি হতে পারে, এবং এটি সাধারণত হায়ারারকিক্যাল বা গ্রাফ-ভিত্তিক ডেটা ম্যানিপুলেশন করার জন্য ব্যবহৃত হয়।

এগুলি SQL এর শক্তিশালী কৌশল যা ডেটা অনুসন্ধানে এবং বিশ্লেষণে সহায়তা করে।

Content added By

Pivot এবং Unpivot Queries

379

Pivot এবং Unpivot হল SQL-এ ডেটার ফরম্যাট পরিবর্তন করার দুটি গুরুত্বপূর্ণ কৌশল। এগুলি সাধারণত ডেটা বিশ্লেষণে ব্যবহৃত হয় যেখানে আপনি ডেটাকে রো থেকে কলামে এবং কলাম থেকে রো-তে রূপান্তর করতে চান। এগুলি SQL Server-এ সাধারণত ব্যবহৃত হয়, তবে অন্য ডেটাবেস সিস্টেমেও কিছু বিকল্প কৌশল থাকতে পারে।


1. Pivot Query

Pivot হল একটি SQL কৌশল যা রো ডেটাকে কলামে রূপান্তর করে। এটি সাধারণত যখন আপনি গ্রুপিং করতে চান এবং ফলস্বরূপ ডেটা কলাম হিসাবে দেখতে চান, তখন ব্যবহৃত হয়। Pivot ডেটাকে এমনভাবে সংগঠিত করে যাতে বিভিন্ন মান গুলি কলামে রূপান্তরিত হয় এবং তাদের উপর গণনা করা হয়।

Pivot Query এর উদ্দেশ্য:

  • গ্রুপড ডেটা দেখানো: একটি নির্দিষ্ট কলামের ভিত্তিতে ডেটাকে গ্রুপ করা।
  • আগ্রেগেট ফাংশন: ডেটার উপর কোনো অ্যাগ্রিগেট ফাংশন (যেমন, SUM(), AVG(), COUNT()) প্রয়োগ করা।

Pivot Query এর সিনট্যাক্স:

SELECT <columns>
FROM (
    SELECT <columns>, <value_column>
    FROM <table_name>
) AS source_table
PIVOT (
    <aggregate_function>(<value_column>)
    FOR <column_to_be_pivoted> IN (<list_of_new_columns>)
) AS pivot_table;

Pivot Query উদাহরণ:

ধরা যাক, আপনার কাছে একটি Sales টেবিল আছে যেখানে প্রতি মাসে পণ্য বিক্রির পরিমাণ এবং মূল্য সংরক্ষিত হয়:

ProductMonthSales
AJan100
AFeb150
BJan200
BFeb250

এখন আপনি এই তথ্যের উপর ভিত্তি করে পণ্যগুলোর বিক্রির পরিমাণ মাস অনুযায়ী কলামে দেখতে চান। Pivot Query ব্যবহার করলে ফলাফল হবে:

SELECT Product, [Jan], [Feb]
FROM (
    SELECT Product, Month, Sales
    FROM Sales
) AS source_table
PIVOT (
    SUM(Sales)
    FOR Month IN ([Jan], [Feb])
) AS pivot_table;

ফলাফল:

ProductJanFeb
A100150
B200250

এখানে, Month কলামটি Jan এবং Feb কলামে রূপান্তরিত হয়ে গেছে, এবং তাদের উপর SUM(Sales) অ্যাগ্রিগেট ফাংশন প্রয়োগ করা হয়েছে।


2. Unpivot Query

Unpivot হল একটি SQL কৌশল যা কলামগুলোকে রো-তে রূপান্তর করে। এটি তখন ব্যবহৃত হয় যখন আপনি একটি টেবিলের কলাম ভিত্তিক ডেটাকে রো ভিত্তিক ডেটায় রূপান্তর করতে চান।

Unpivot Query এর উদ্দেশ্য:

  • ডেটার ফরম্যাট পরিবর্তন করা: কলাম-ভিত্তিক ডেটাকে রো-ভিত্তিক ডেটায় রূপান্তর করা।
  • ডেটার বিশ্লেষণ সহজ করা: যখন কলামগুলির মধ্যে বেশ কিছু ভ্যালু থাকে এবং সেগুলোকে একটি সিঙ্গেল কলামে রূপান্তর করতে চান।

Unpivot Query এর সিনট্যাক্স:

SELECT <columns>
FROM <table_name>
UNPIVOT (
    <value_column>
    FOR <column_name> IN (<list_of_columns_to_unpivot>)
) AS unpivoted_table;

Unpivot Query উদাহরণ:

ধরা যাক, আপনার কাছে একটি Sales টেবিল রয়েছে যেখানে মাসের বিক্রির পরিমাণ পণ্য ভিত্তিক কলামে সংরক্ষিত রয়েছে:

ProductJanFeb
A100150
B200250

এখন আপনি যদি এই টেবিলটি Unpivot করতে চান, যাতে মাসের তথ্যকে একক কলামে একত্রিত করা যায়, তাহলে Unpivot ব্যবহার করা হবে:

SELECT Product, Month, Sales
FROM (
    SELECT Product, [Jan], [Feb]
    FROM Sales
) AS source_table
UNPIVOT (
    Sales FOR Month IN ([Jan], [Feb])
) AS unpivoted_table;

ফলাফল:

ProductMonthSales
AJan100
AFeb150
BJan200
BFeb250

এখানে, Jan এবং Feb কলামগুলি Month নামে একটি একক কলামে রূপান্তরিত হয়েছে, এবং তাদের বিক্রির পরিমাণ Sales কলামে আনা হয়েছে।


Pivot এবং Unpivot এর পার্থক্য:

বিষয়PivotUnpivot
ফাংশনরো থেকে কলামে ডেটা রূপান্তর করা।কলাম থেকে রো-তে ডেটা রূপান্তর করা।
ব্যবহারডেটাকে ভিন্ন ভিন্ন কলামে নিয়ে আসার জন্য, যেমন মাসের বিক্রির পরিমাণ।কলামের মধ্যে বিভিন্ন ভ্যালু একত্রিত করে একটি কলামে আনা।
উদাহরণবিক্রির পরিমাণ মাস ভিত্তিক ডেটায় দেখানো।মাস ভিত্তিক বিক্রির পরিমাণ একক কলামে রূপান্তরিত করা।
এগজাম্পল[Jan], [Feb] কলামগুলোকে Month কলামে রূপান্তরিত করা।Month এবং Sales কলাম তৈরি করে মাসের তথ্য একত্রিত করা।

সারাংশ

  • Pivot হল রো ডেটাকে কলামে রূপান্তর করার জন্য ব্যবহৃত একটি শক্তিশালী কৌশল, যা ডেটা বিশ্লেষণে সাহায্য করে যখন আপনি বিভিন্ন ভ্যালুদের উপর ভিত্তি করে অ্যাগ্রিগেট করতে চান।
  • Unpivot হল কলামগুলোকে রো-তে রূপান্তর করার প্রক্রিয়া, যা আপনাকে ডেটার বিভিন্ন ভ্যালুগুলোকে একত্রিত করে একক কলামে পরিণত করতে সহায়তা করে।

এগুলি SQL-এ ডেটার বিশ্লেষণ এবং প্রদর্শন সহজ করতে ব্যবহৃত হয়, বিশেষ করে যখন ডেটা খুব জটিল বা বড় পরিসরের হয়।

Content added By

Complex Data Aggregation Techniques

318

Complex Data Aggregation techniques ডেটাবেসের মধ্যে থাকা ডেটা থেকে উন্নত বিশ্লেষণ এবং সংগঠন বের করতে ব্যবহৃত হয়। এই কৌশলগুলি সাধারণত ডেটা সঞ্চয়, বিশ্লেষণ, এবং রিপোর্টিংয়ের জন্য ব্যবহার করা হয়, যেখানে একাধিক শর্ত এবং অর্গানাইজেশনাল কৌশল প্রয়োজন হয়। সাধারণ Aggregate Functions (যেমন, COUNT(), SUM(), AVG(), MAX(), MIN()) এর পাশাপাশি জটিল বিশ্লেষণ এবং ডেটা গ্রুপিং, ফিল্টারিং, এবং ট্রান্সফরমেশন কাজের জন্য অতিরিক্ত কৌশল ব্যবহৃত হয়।

এই কৌশলগুলি সাধারণত বৃহৎ ডেটাসেট বা জটিল কুয়েরির ক্ষেত্রে ব্যবহৃত হয়। SQL এ এগুলি কার্যকরভাবে ব্যবহার করে ডেটার অর্থপূর্ণ এবং কার্যকরী আউটপুট পাওয়া যায়।


১. GROUP BY এবং HAVING ক্লজ ব্যবহার

GROUP BY SQL এর একটি শক্তিশালী বৈশিষ্ট্য, যা একাধিক রেকর্ডকে একটি নির্দিষ্ট কলামের ভিত্তিতে গ্রুপ করে এবং গ্রুপের ওপর অ্যাগ্রিগেট ফাংশন প্রয়োগ করে। যখন আপনি HAVING ক্লজ ব্যবহার করেন, তখন আপনি গ্রুপের ওপর শর্ত আরোপ করতে পারেন।

উদাহরণ:

SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;

এখানে, employees টেবিলের সব কর্মচারীদের গড় বেতন বের করা হয়েছে, তবে কেবল সেই বিভাগগুলোতে যেখানে গড় বেতন ৫০,০০০ এর বেশি।

Complex Aggregation: GROUP BY এর সাথে HAVING ক্লজ ব্যবহার করা জটিল গ্রুপিং তৈরি করতে সহায়ক, যেখানে নির্দিষ্ট শর্ত পূরণ না করা গ্রুপগুলো বাদ দেওয়া হয়।


২. Window Functions (Analytic Functions)

Window Functions (বা Analytic Functions) ব্যবহার করে আপনি ডেটার ওপর জটিল বিশ্লেষণ করতে পারেন। এগুলি সাধারণত গ্রুপিংয়ের বাইরে ডেটাকে বিশ্লেষণ করে, যেখানে আপনাকে পুরো ডেটাসেটের সাথে কাজ করতে হয় কিন্তু কিছু কলামের ওপর অ্যাগ্রিগেট বা ক্যালকুলেশন প্রয়োগ করতে হয়।

উদাহরণ:

SELECT name, salary,
       AVG(salary) OVER (PARTITION BY department_id) AS avg_salary_per_dept
FROM employees;

এটি প্রতি কর্মচারীর জন্য তাদের বিভাগের গড় বেতন দেখাবে, তবে গ্রুপিংয়ের পরিবর্তে Window Function প্রয়োগ করা হয়েছে, যাতে প্রতিটি কর্মচারীর জন্য সম্পর্কিত বিভাগ অনুযায়ী গড় বেতন গণনা করা হয়।

Window Functions এর কিছু সাধারণ উদাহরণ:

  • ROW_NUMBER()
  • RANK()
  • DENSE_RANK()
  • NTILE()
  • LEAD() / LAG() (আগের বা পরবর্তী রেকর্ডের সাথে তুলনা করা)

৩. Subqueries এবং Nested Aggregation

Subqueries (সাবকুয়েরি) বা Nested Queries ব্যবহার করে একটি কুয়েরির ভিতরে অন্য একটি কুয়েরি চালানো হয়। এভাবে আপনি জটিল অ্যাগ্রিগেট ক্যালকুলেশন তৈরি করতে পারেন, যেখানে প্রথম কুয়েরি একটি পূর্ণাঙ্গ ডেটা সেট তৈরি করে এবং দ্বিতীয় কুয়েরি সেই ডেটার ওপর অ্যাগ্রিগেট ফাংশন প্রয়োগ করে।

উদাহরণ:

SELECT department_id, MAX(salary)
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
GROUP BY department_id;

এটি সেই বিভাগের সর্বোচ্চ বেতন বের করবে যেখানে কর্মচারীদের বেতন গড় বেতনের চেয়ে বেশি।


৪. JOINs এর মাধ্যমে Complex Aggregation

JOIN ব্যবহারের মাধ্যমে একাধিক টেবিলের ডেটাকে একত্রিত করে একটি জটিল অ্যাগ্রিগেশন তৈরি করা যেতে পারে। JOIN এর সাথে GROUP BY, HAVING এবং Aggregate Functions ব্যবহারের মাধ্যমে আপনাকে টেবিলগুলির বিভিন্ন সম্পর্ক এবং জটিল বিশ্লেষণ সম্ভব হয়।

উদাহরণ:

SELECT d.department_name, COUNT(e.employee_id) AS employee_count, AVG(e.salary) AS avg_salary
FROM departments d
JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name;

এই কুয়েরি departments এবং employees টেবিলের মধ্যে JOIN করে, এবং প্রতিটি বিভাগের কর্মচারীদের সংখ্যা এবং গড় বেতন বের করবে।


৫. Self Join এবং Complex Data Relationships

Self Join হল একটি বিশেষ ধরনের JOIN, যেখানে একটি টেবিলের রেকর্ডকে নিজেই যুক্ত করা হয়। এটি প্রায়ই ব্যবহৃত হয় তখন, যখন আপনাকে একই টেবিলের মধ্যে সম্পর্ক খুঁজে বের করতে হয়, যেমন: বাবা-মা-সন্তানের সম্পর্ক, কিংবা একজন কর্মচারী ও তার ম্যানেজার।

উদাহরণ:

SELECT e1.name AS employee_name, e2.name AS manager_name
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.employee_id;

এটি employees টেবিলের মধ্যে Self JOIN ব্যবহার করে কর্মচারী এবং তাদের ম্যানেজারের সম্পর্ক বের করবে।


৬. Pivot এবং Unpivot Queries

Pivot এবং Unpivot কুয়েরি ব্যবহার করে ডেটাকে রূপান্তর বা নতুনভাবে উপস্থাপন করা যায়। Pivot ডেটার কলামগুলোকে রো-তে রূপান্তরিত করে এবং Unpivot ব্যবহার করে রো-গুলিকে কলামে রূপান্তরিত করা হয়।

Pivot উদাহরণ:

SELECT department_id, 
       SUM(CASE WHEN month = 'January' THEN salary END) AS January,
       SUM(CASE WHEN month = 'February' THEN salary END) AS February
FROM employees
GROUP BY department_id;

এই কুয়েরিটি salary তথ্যকে Pivot করে, যাতে বিভিন্ন মাসের বেতন একক সারিতে প্রদর্শিত হয়।

Unpivot উদাহরণ:

SELECT department_id, month, salary
FROM employees
UNPIVOT (salary FOR month IN (January, February)) AS unpivoted_data;

এটি salary ডেটাকে Unpivot করে, যাতে মাসের মধ্যে বেতন পরিবর্তনকে রো আকারে দেখতে পাওয়া যায়।


সারাংশ

Complex Data Aggregation Techniques ডেটাবেসের মধ্যে বিভিন্ন ধরনের বিশ্লেষণ এবং জটিল ক্যালকুলেশন করতে ব্যবহৃত হয়। GROUP BY, HAVING, Window Functions, Subqueries, JOINs, Pivot/Unpivot, এবং Self Join এর মাধ্যমে ডেটাকে গ্রুপিং, ফিল্টারিং এবং আরও সুনির্দিষ্টভাবে বিশ্লেষণ করা সম্ভব। এই কৌশলগুলির মাধ্যমে আপনি বড় ডেটাসেটের মধ্যে আরও কার্যকরী তথ্য বের করতে পারেন, যা ব্যবসায়িক সিদ্ধান্ত গ্রহণ এবং ডেটাবেস অপ্টিমাইজেশনে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...