SQL (Structured Query Language) হল রিলেশনাল ডেটাবেস ম্যানেজমেন্ট সিস্টেমে ডেটা পরিচালনার ভাষা। টেরাডেটা, যেমন অন্যান্য রিলেশনাল ডেটাবেস, SQL ব্যবহার করে ডেটাবেস থেকে তথ্য সংগ্রহ, আপডেট এবং বিশ্লেষণ করতে সক্ষম। তবে, টেরাডেটা বেশ কিছু Advanced SQL Queries এর মাধ্যমে বড় আকারের ডেটাবেসে কার্যকরী বিশ্লেষণ ও অপ্টিমাইজেশনের সুবিধা দেয়।
এই গাইডে, আমরা টেরাডেটাতে ব্যবহৃত কিছু Advanced SQL Queries নিয়ে আলোচনা করব যা জটিল ডেটা বিশ্লেষণ এবং অপ্টিমাইজেশন প্রক্রিয়ায় সহায়ক।
1. Window Functions (Analytic Functions)
Window Functions বা Analytic Functions টেবিলের রেকর্ডগুলির ওপর একটি স্লাইডিং উইন্ডো প্রয়োগ করে, যেখানে কুয়েরির প্রতিটি রেকর্ড অন্য রেকর্ডগুলির সাথে তুলনা করা যায়। এগুলি সাধারণত রোলিং অ্যাগ্রিগেট বা সামগ্রিক পারফরম্যান্স বিশ্লেষণ করতে ব্যবহৃত হয়।
Example: Ranking Sales by Amount
SELECT sale_id,
sale_date,
amount,
RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;
এখানে, RANK() ফাংশন বিক্রয়ের পরিমাণের ওপর ভিত্তি করে প্রতিটি বিক্রয়ের র্যাঙ্ক নির্ধারণ করবে।
Example: Moving Average
SELECT sale_id,
sale_date,
amount,
AVG(amount) OVER (ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM sales;
এটি Moving Average তৈরি করে, যা সাম্প্রতিক তিনটি বিক্রয়ের পরিমাণের গড় নির্ধারণ করবে।
2. Common Table Expressions (CTEs)
CTEs বা WITH Clauses কুয়েরিতে একটি অস্থায়ী ফলাফলের সেট তৈরি করতে ব্যবহৃত হয়। এটি দীর্ঘ এবং জটিল কুয়েরি সহজ ও পাঠযোগ্য করতে সাহায্য করে।
Example: Using CTE to Find Total Sales by Region
WITH RegionalSales AS (
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region
)
SELECT region, total_sales
FROM RegionalSales
WHERE total_sales > 10000;
এখানে, RegionalSales একটি CTE যা প্রতিটি অঞ্চলের জন্য মোট বিক্রয়ের পরিমাণ নির্ধারণ করে এবং পরে আমরা কেবল সেই অঞ্চলগুলো নির্বাচন করছি যেগুলির বিক্রয় ১০,০০০ এর বেশি।
3. Subqueries
Subqueries বা Nested Queries হল এমন কুয়েরি যা আরেকটি কুয়েরির ভিতরে লেখা হয়। এগুলি প্রধানত কোন নির্দিষ্ট শর্ত অনুযায়ী ডেটা ফিল্টার বা গণনা করার জন্য ব্যবহৃত হয়।
Example: Subquery in WHERE Clause
SELECT sale_id, amount
FROM sales
WHERE region = (
SELECT region
FROM regions
WHERE region_name = 'North America'
);
এখানে, Subquery প্রথমে regions টেবিল থেকে North America অঞ্চলের নাম সংগ্রহ করবে, তারপর মূল কুয়েরি এই অঞ্চলের সব বিক্রয় রেকর্ড বের করবে।
Example: Correlated Subquery
SELECT sale_id, amount
FROM sales s
WHERE amount > (
SELECT AVG(amount)
FROM sales
WHERE region = s.region
);
এটি একটি Correlated Subquery, যেখানে বাইরের কুয়েরি sales টেবিলের প্রতিটি রেকর্ডের জন্য একটি নির্দিষ্ট অঞ্চলের গড় বিক্রয় পরিমাণের সাথে তুলনা করছে।
4. Joins (Advanced Joins)
Joins হল SQL এর মূল ধারণা যা একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করে। টেরাডেটাতে আপনি বিভিন্ন ধরনের Join ব্যবহার করে জটিল কুয়েরি তৈরি করতে পারেন।
Example: INNER JOIN
SELECT s.sale_id, s.amount, p.product_name
FROM sales s
INNER JOIN products p
ON s.product_id = p.product_id;
এটি INNER JOIN, যেখানে sales এবং products টেবিলের মধ্যে product_id কলামের উপর সম্পর্ক তৈরি করা হচ্ছে এবং কেবল তাদের মিল থাকা রেকর্ডগুলো নির্বাচন করা হচ্ছে।
Example: LEFT JOIN
SELECT c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o
ON c.customer_id = o.customer_id;
এটি LEFT JOIN, যেখানে customers টেবিলের সব রেকর্ড নির্বাচন হবে, যদিও orders টেবিলের সাথে সম্পর্ক না থাকলে NULL মান আসবে।
Example: FULL OUTER JOIN
SELECT e.employee_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON e.department_id = d.department_id;
এটি FULL OUTER JOIN, যা উভয় টেবিলের সমস্ত রেকর্ড দেখাবে, যেখানে মিল না থাকলেও NULL দেখাবে।
5. Set Operations (UNION, INTERSECT, EXCEPT)
SQL তে Set Operations ডেটাবেসের একাধিক কুয়েরি থেকে ফলাফল একত্রিত করার জন্য ব্যবহৃত হয়। টেরাডেটাতে বিভিন্ন সেট অপারেশন প্রয়োগ করে ডেটা একত্রিত করা যেতে পারে।
Example: UNION
SELECT sale_id, amount FROM sales_2022
UNION
SELECT sale_id, amount FROM sales_2023;
এটি UNION অপারেশন, যেখানে দুটি টেবিলের ফলাফল একত্রিত করা হয়, তবে পুনরাবৃত্তি সরানো হয়।
Example: INTERSECT
SELECT sale_id FROM sales_2022
INTERSECT
SELECT sale_id FROM sales_2023;
এটি INTERSECT অপারেশন, যেখানে দুটি কুয়েরির মিল থাকা রেকর্ডগুলো নির্বাচন করা হয়।
Example: EXCEPT
SELECT sale_id FROM sales_2022
EXCEPT
SELECT sale_id FROM sales_2023;
এটি EXCEPT অপারেশন, যেখানে প্রথম কুয়েরির এমন রেকর্ডগুলো নির্বাচন করা হয় যা দ্বিতীয় কুয়েরিতে নেই।
6. Aggregate Functions with GROUP BY
Aggregate Functions যেমন SUM(), AVG(), COUNT(), MAX(), এবং MIN() টেরাডেটাতে গ্রুপ ভিত্তিক গণনা করতে ব্যবহৃত হয়।
Example: GROUP BY with HAVING Clause
SELECT region, COUNT(sale_id) AS sale_count
FROM sales
GROUP BY region
HAVING COUNT(sale_id) > 100;
এটি GROUP BY ব্যবহার করে অঞ্চল অনুযায়ী বিক্রয়ের সংখ্যা গণনা করছে এবং HAVING ক্লজের মাধ্যমে সেই অঞ্চলগুলো নির্বাচন করছে যেখানে ১০০টির বেশি বিক্রয় রেকর্ড রয়েছে।
সারাংশ
টেরাডেটাতে Advanced SQL Queries ব্যবহার করে বিভিন্ন ডেটা বিশ্লেষণ এবং অপ্টিমাইজেশন করা সম্ভব। Window Functions, CTEs, Subqueries, Joins, Set Operations, এবং Aggregate Functions টেরাডেটা সিস্টেমে জটিল কুয়েরি তৈরি করার ক্ষমতা বাড়ায় এবং ডেটাবেসের কর্মক্ষমতা উন্নত করে। এই উন্নত কুয়েরি কৌশলগুলি ব্যবহার করে আপনি দ্রুত ডেটা বিশ্লেষণ, অপটিমাইজেশন এবং রিপোর্ট তৈরি করতে পারবেন।
Complex Joins হল SQL কোয়েরির মধ্যে একাধিক টেবিলের ডেটাকে একত্রিত (combine) করার জন্য ব্যবহৃত একটি পদ্ধতি। যেখানে সাধারণ INNER JOIN, LEFT JOIN, RIGHT JOIN, এবং FULL JOIN এর মতো একক জয়েনগুলো ব্যবহৃত হয়, সেগুলোর তুলনায় Complex Joins তে একাধিক টেবিল বা শর্তের সাথে জয়েন করা হয়।
টেরাডেটাতে Complex Joins একাধিক টেবিলের ডেটা একত্র করতে সহায়ক হয় এবং এটি বড়, জটিল ডেটাবেস প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। এতে যেমন একাধিক টেবিল জয়েন করা হয়, তেমনই একাধিক শর্ত এবং ফিল্টার যুক্ত হতে পারে।
Complex Joins এর উদাহরণ
১. Multiple Joins
একাধিক টেবিলের মধ্যে জয়েন করতে INNER JOIN, LEFT JOIN, RIGHT JOIN বা FULL JOIN ব্যবহার করা হয়। উদাহরণস্বরূপ:
SELECT A.employee_id, A.name, B.department_name, C.salary
FROM employees A
INNER JOIN departments B ON A.department_id = B.department_id
LEFT JOIN salaries C ON A.employee_id = C.employee_id;
এখানে, employees টেবিলের সাথে departments এবং salaries টেবিলের মধ্যে একাধিক জয়েন করা হয়েছে। এখানে একটি INNER JOIN এবং একটি LEFT JOIN ব্যবহার করা হয়েছে।
২. Self Join
কখনো কখনো একটি টেবিলের মধ্যে নিজের সাথে জয়েন করতে হয়, যাকে Self Join বলা হয়। এটি সাধারণত প্যারেন্ট-চাইল্ড সম্পর্ক বিশ্লেষণে ব্যবহৃত হয়।
SELECT A.employee_id, A.name, B.name AS manager_name
FROM employees A
INNER JOIN employees B ON A.manager_id = B.employee_id;
এখানে, employees টেবিলকে নিজের সাথে manager_id এর ভিত্তিতে জয়েন করা হয়েছে, যাতে কর্মচারী এবং তাদের ম্যানেজারের নাম একসাথে পাওয়া যায়।
৩. Cross Join
Cross Join দুটি টেবিলের মধ্যে প্রতিটি রেকর্ডের সাথে প্রতিটি রেকর্ডের সংমিশ্রণ তৈরি করে। এটি বেশিরভাগ ক্ষেত্রে পরিসংখ্যান বিশ্লেষণ বা কম্বিনেশন তৈরির জন্য ব্যবহৃত হয়।
SELECT A.product_id, B.salesperson_id
FROM products A
CROSS JOIN salespeople B;
এটি products এবং salespeople টেবিলের মধ্যে সমস্ত সম্ভাব্য কম্বিনেশন তৈরি করবে।
Subqueries কী?
Subqueries হল SQL কোয়েরি যেখানে একটি কোয়েরি অন্য একটি কোয়েরি ভিতরে থাকে। সাধারণত সাবকোয়েরি SELECT, INSERT, UPDATE বা DELETE স্টেটমেন্টের অংশ হিসেবে ব্যবহৃত হয়।
Subqueries দুটি প্রধান প্রকারে বিভক্ত:
- Scalar Subquery: একটি একক মান রিটার্ন করে।
- Correlated Subquery: বাহ্যিক কোয়েরি (outer query) এর উপর নির্ভরশীল থাকে এবং বাহ্যিক কোয়েরির সাথে সম্পর্কিত মান রিটার্ন করে।
Subqueries এর উদাহরণ
১. Scalar Subquery
Scalar Subquery একটি একক মান রিটার্ন করে। এটি সাধারণত WHERE বা SELECT ক্লজে ব্যবহৃত হয়।
SELECT employee_id, name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
এখানে, একটি Scalar Subquery AVG(salary) রিটার্ন করছে, যা পুরো employees টেবিলের গড় বেতন বের করে এবং তারপর প্রধান কোয়েরি সেই মানের চেয়ে বড় বেতনযুক্ত কর্মচারীদের নির্বাচন করছে।
২. Correlated Subquery
Correlated Subquery বাহ্যিক কোয়েরি (outer query) এর উপর ভিত্তি করে ডেটা নির্বাচন করে। প্রতিটি রেকর্ডের জন্য সাবকোয়েরি একটি নতুন মান হিসাব করে।
SELECT A.employee_id, A.name, A.salary
FROM employees A
WHERE A.salary > (SELECT AVG(B.salary) FROM employees B WHERE A.department_id = B.department_id);
এখানে, প্রতিটি employee এর জন্য তার নিজস্ব বিভাগের গড় বেতনের সাথে তুলনা করা হচ্ছে। বাহ্যিক কোয়েরি এবং সাবকোয়েরি একে অপরের সাথে সম্পর্কিত, কারণ বাহ্যিক কোয়েরির department_id সাবকোয়েরিতে ব্যবহৃত হচ্ছে।
৩. Subquery in SELECT Clause
একটি সাবকোয়েরি SELECT ক্লজের মধ্যে ব্যবহার করা হতে পারে, যেখানে আমরা একটি নতুন কলাম হিসাবে সাবকোয়েরির ফলাফল দেখতে পাই।
SELECT employee_id, name,
(SELECT department_name FROM departments WHERE department_id = employees.department_id) AS department_name
FROM employees;
এখানে, employees টেবিলের জন্য প্রতিটি কর্মচারীর বিভাগ নাম সাবকোয়েরির মাধ্যমে নির্বাচিত হচ্ছে এবং সেটি একটি নতুন কলাম হিসাবে প্রদর্শিত হচ্ছে।
Complex Joins এবং Subqueries এর মধ্যে পার্থক্য
| বিষয় | Complex Joins | Subqueries |
|---|---|---|
| অর্থ | একাধিক টেবিলকে একসাথে যুক্ত করা | একটি কোয়েরির মধ্যে অন্য কোয়েরি রাখা |
| ব্যবহার | একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন | একটি একক কোয়েরি দ্বারা ডেটা রিটার্ন করা |
| কার্যকারিতা | একসাথে একাধিক টেবিলের ডেটা প্রক্রিয়া | একক মান বা ফলাফল সাবকোয়েরির মাধ্যমে বের করা |
| উদাহরণ | INNER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN | SELECT, UPDATE, DELETE স্টেটমেন্টের মধ্যে ব্যবহার |
সারাংশ
Complex Joins এবং Subqueries টেরাডেটাতে অত্যন্ত গুরুত্বপূর্ণ SQL কৌশল যা ডেটা একত্রিত করার জন্য ব্যবহৃত হয়। Complex Joins একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করে এবং একযোগে ডেটা প্রক্রিয়া করার সুযোগ দেয়। অন্যদিকে, Subqueries একটি কোয়েরির মধ্যে অন্য একটি কোয়েরি অন্তর্ভুক্ত করে এবং প্রাথমিক কোয়েরির ফলাফল নির্ধারণ করতে সহায়তা করে। এসব কৌশল ব্যবহার করে জটিল ডেটাবেস বিশ্লেষণ এবং রিপোর্ট তৈরি করা সম্ভব হয়।
Recursive Queries হল SQL কোয়েরি যা নিজেই নিজেকে পুনরাবৃত্তি করে, বা অন্যভাবে বলা যায়, এটি এমন একটি কোয়েরি যা নিজেদের ফলাফলকে পুনরায় ব্যবহার করে। সাধারণত এটি ব্যবহার করা হয় যখন ডেটা একটি হায়ারার্কিক্যাল (hierarchical) বা পেরেন্ট-চাইল্ড (parent-child) সম্পর্কের মধ্যে থাকে। উদাহরণস্বরূপ, একটি অর্গানাইজেশনাল চার্ট যেখানে একজন ম্যানেজার একটি বা একাধিক সাবঅর্ডিনেটের অধীনে কাজ করে, বা একটি পাইকারি টেবিল যেখানে প্রতিটি পণ্য একটি ক্যাটেগরির অংশ হিসেবে যুক্ত থাকে।
Recursive Query এর কাজের প্রক্রিয়া
Recursive Query মূলত দুটি অংশে বিভক্ত:
- Base Query: এটি প্রথমে চালানো হয় এবং এটি সাধারণত সেই রেকর্ডগুলো নির্বাচন করে যা হায়ারার্কির রুট (root) অথবা প্রথম স্তরের (first level) সদস্য।
- Recursive Query: Base Query এর পরবর্তী ধাপ হিসেবে পুনরাবৃত্তি করা হয় এবং এতে পূর্ববর্তী রেকর্ডের উপর ভিত্তি করে নতুন রেকর্ড নির্বাচিত হয়।
এই ধাপটি বারবার পুনরাবৃত্তি হয় যতক্ষণ না আর কোনো নতুন রেকর্ড পাওয়া না যায়।
WITH Clause এবং Recursive Query
WITH Clause হল SQL এর একটি শক্তিশালী অংশ যা Common Table Expressions (CTEs) তৈরি করতে ব্যবহৃত হয়। CTEs সাময়িক টেবিল বা ভিউ হিসেবে কাজ করে, এবং এই টেবিলগুলো কোয়েরি ব্লকের মধ্যে একাধিকবার ব্যবহার করা যেতে পারে। WITH Clause এর মাধ্যমে আপনি Recursive Queries তৈরি করতে পারেন।
WITH Clause এর ব্যবহার
- CTE (Common Table Expressions) তৈরি করতে ব্যবহৃত হয়।
- একাধিক কোয়েরির মধ্যে ডেটা শেয়ার করতে সহায়তা করে।
- কোয়েরি লিখনকে আরও পরিষ্কার এবং সহজ করে তোলে।
Recursive Query এর জন্য WITH Clause
Recursive Query তৈরি করতে WITH RECURSIVE শব্দ ব্যবহার করতে হয়। এতে Base Query এবং Recursive Query উভয়টি অন্তর্ভুক্ত থাকে। উদাহরণস্বরূপ:
WITH RECURSIVE employee_hierarchy AS (
-- Base query: Select the root employee
SELECT employee_id, manager_id, employee_name
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- Recursive query: Select employees reporting to the manager
SELECT e.employee_id, e.manager_id, e.employee_name
FROM employees e
INNER JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy;
এখানে:
- Base Query: প্রথমে রুট এমপ্লয়ীকে নির্বাচন করা হয়েছে, যাদের manager_id
NULL। - Recursive Query: তারপর সেই এমপ্লয়ীদের নির্বাচন করা হয় যারা
manager_idএর মাধ্যমে পূর্ববর্তী এমপ্লয়ীদের সাথে সম্পর্কিত।
Recursive Query এর কাজের প্রক্রিয়া
- Base Query থেকে প্রথম ফলাফল (রুট বা প্রথম স্তরের ডেটা) নির্বাচন করা হয়।
- তারপর Recursive Query চলতে থাকে, যেখানে প্রতিটি পর্যায়ে Base Query থেকে পাওয়া রেকর্ডের উপর ভিত্তি করে নতুন রেকর্ড নির্বাচিত হয়।
- এটি চলতে থাকে যতক্ষণ না আর কোনো নতুন রেকর্ড পাওয়া না যায় (এটি Termination Condition হিসেবে কাজ করে)।
Recursive Query এর সুবিধা
- হায়ারার্কিক্যাল ডেটা: Recursive Queries মূলত হায়ারার্কিক্যাল ডেটা যেমন অর্গানাইজেশনাল চার্ট বা পারেন্ট-চাইল্ড সম্পর্কের ক্ষেত্রে খুবই কার্যকর।
- পুনরাবৃত্তি করা সহজ: বিভিন্ন লেভেলে সম্পর্কিত ডেটা নির্বাচনের জন্য সহজ পদ্ধতি প্রদান করে।
- এফিশিয়েন্ট কোয়েরি: Recursive Queries সাধারণত অন্য পদ্ধতিতে না পাওয়া ডেটা দ্রুত খুঁজে পেতে সাহায্য করে।
Recursive Query এর ব্যবহার
- অর্গানাইজেশনাল স্ট্রাকচার: একজন ম্যানেজার এবং তার অধীনস্থদের সম্পর্ক বের করার জন্য।
- ফাইল সিস্টেম: একটি ডিরেক্টরি স্ট্রাকচার থেকে সমস্ত সাবডিরেক্টরি বের করার জন্য।
- গ্রাফ ট্রাভার্সাল: গ্রাফের নোডগুলির মধ্যে সম্পর্ক বের করতে বা সাইকেল শনাক্ত করতে।
সারাংশ
Recursive Queries এবং WITH Clause SQL এর দুটি শক্তিশালী বৈশিষ্ট্য, যা হায়ারার্কিক্যাল ডেটার উপর কাজ করার জন্য ব্যবহৃত হয়। Recursive Query নিজেই নিজেকে পুনরাবৃত্তি করে ডেটা নির্বাচন করতে সক্ষম, এবং WITH RECURSIVE এর মাধ্যমে আপনি Base Query এবং Recursive Query সমন্বয় করে সহজে এমন ডেটা নির্বাচন করতে পারেন যা একাধিক স্তরে বিভক্ত। এটি ডেটাবেসের বিশাল ডেটা প্রক্রিয়াকরণে কার্যকরী, বিশেষ করে যখন হায়ারার্কি বা পেরেন্ট-চাইল্ড সম্পর্কের সাথে কাজ করা হয়।
Set Operators হল SQL কমান্ডগুলোর একটি গ্রুপ যা একাধিক কুয়েরির ফলাফল একত্রিত করতে ব্যবহৃত হয়। এই অপারেটরগুলির মাধ্যমে, আপনি দুটি বা তার বেশি সিলেক্ট কুয়েরির রেজাল্ট সেটকে একত্রিত, পর্যালোচনা বা তুলনা করতে পারেন। টেরাডেটাতে, UNION, INTERSECT, এবং EXCEPT হল তিনটি প্রধান Set Operators, যা ডেটার একাধিক সিলেক্ট স্টেটমেন্টের মধ্যে সমন্বয় করতে সহায়তা করে।
এগুলি সাধারণত ডেটা সেটের মধ্যে সাধারণ বা অমিল ডেটা বের করতে ব্যবহৃত হয় এবং সিস্টেমের পারফরম্যান্সের সাথে সামঞ্জস্য রেখে কাজ করে।
1. UNION
UNION অপারেটর দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের রেজাল্ট সেটকে একত্রিত করতে ব্যবহৃত হয় এবং সাধারণত ডুপ্লিকেট রেকর্ড সরিয়ে ফেলে। এটি দুটি সিলেক্ট কুয়েরির মধ্যে একই কলামের ডেটা একত্রিত করে, তবে ডুপ্লিকেট রেকর্ড বাদ দেওয়া হয়।
সিনট্যাক্স:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
বৈশিষ্ট্য:
- ডুপ্লিকেট রেকর্ড বাদ দেওয়া: UNION কেবল একাধিক সিলেক্ট স্টেটমেন্টের মধ্যে পৃথক রেকর্ড রিটার্ন করে।
- কলামের সংখ্যা এবং ধরন: দুটি সিলেক্ট কুয়েরির মধ্যে কলামের সংখ্যা এবং ডেটা টাইপ একে অপরের সাথে মেলাতে হবে।
- পারফরম্যান্স: UNION তুলনামূলকভাবে ধীর হতে পারে কারণ এটি ডুপ্লিকেট রেকর্ডগুলো অপসারণ করে।
উদাহরণ:
SELECT product_id, product_name FROM electronics
UNION
SELECT product_id, product_name FROM home_appliances;
এই কুয়েরিটি electronics এবং home_appliances টেবিলের মধ্যে ইউনিক প্রোডাক্ট আইডি এবং প্রোডাক্ট নামের তালিকা দেয়।
2. INTERSECT
INTERSECT অপারেটর দুটি বা তার বেশি সিলেক্ট স্টেটমেন্টের মধ্যে কমন রেকর্ড রিটার্ন করে, অর্থাৎ দুটি কুয়েরির মধ্যে যেসব রেকর্ড শুধুমাত্র সঠিক তা ফেরত আসে। এটি দুটি ডেটাসেটের মধ্যে সাধারণ রেকর্ডগুলোর সেট সরবরাহ করে।
সিনট্যাক্স:
SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;
বৈশিষ্ট্য:
- কমন রেকর্ড রিটার্ন: এটি দুটি কুয়েরির মধ্যে যা সাধারণ রেকর্ড থাকে তা রিটার্ন করবে।
- ডুপ্লিকেট রেকর্ড: INTERSECT কেবলমাত্র কমন রেকর্ড রিটার্ন করে, এবং ডুপ্লিকেট রেকর্ডগুলো বাদ দেওয়া হয়।
উদাহরণ:
SELECT product_id FROM electronics
INTERSECT
SELECT product_id FROM home_appliances;
এই কুয়েরি electronics এবং home_appliances টেবিলের মধ্যে কমন প্রোডাক্ট আইডি গুলোর তালিকা দিবে।
3. EXCEPT
EXCEPT অপারেটর দুটি সিলেক্ট স্টেটমেন্টের মধ্যে একটি ডেটা সেট থেকে অন্য ডেটা সেটের অমিল রেকর্ড রিটার্ন করে। এটি প্রথম কুয়েরির রেজাল্ট থেকে দ্বিতীয় কুয়েরির রেজাল্ট বাদ দেয়। অর্থাৎ, এটি প্রথম কুয়েরির মধ্যে এমন সমস্ত রেকর্ড ফিরিয়ে দেবে যা দ্বিতীয় কুয়েরিতে নেই।
সিনট্যাক্স:
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
বৈশিষ্ট্য:
- অমিল রেকর্ড রিটার্ন: EXCEPT কেবল প্রথম কুয়েরির রেজাল্টে থাকা রেকর্ড রিটার্ন করে যা দ্বিতীয় কুয়েরির রেজাল্টে নেই।
- ডুপ্লিকেট রেকর্ড বাদ দেওয়া: EXCEPT ডুপ্লিকেট রেকর্ডগুলো বাদ দিয়ে একমাত্র ইউনিক রেকর্ড রিটার্ন করবে।
উদাহরণ:
SELECT product_id FROM electronics
EXCEPT
SELECT product_id FROM home_appliances;
এই কুয়েরিটি electronics টেবিলের সমস্ত প্রোডাক্ট আইডি রিটার্ন করবে, যেগুলো home_appliances টেবিলে নেই।
পারফরম্যান্স বিষয়ক কিছু টিপস
ডুপ্লিকেট ডেটা: যদি আপনি নিশ্চিত থাকেন যে আপনার ডেটা ডুপ্লিকেট নেই, তবে UNION ALL ব্যবহার করতে পারেন, যা ডুপ্লিকেট রেকর্ড ছাড়া ডেটা দ্রুত ফেরত দেয়।
সিনট্যাক্স:
SELECT column1, column2 FROM table1 UNION ALL SELECT column1, column2 FROM table2;এটি UNION এর চেয়ে দ্রুত কারণ এটি ডুপ্লিকেট সরিয়ে দেয় না।
- বড় ডেটাসেটের ক্ষেত্রে: যদি বড় ডেটাসেটের উপর কাজ করছেন, তবে INTERSECT এবং EXCEPT ব্যবহারের আগে ডেটার যথাযথ ইনডেক্সিং করা প্রয়োজন, যাতে পারফরম্যান্সের উন্নতি হয়।
সারাংশ
Set Operators (UNION, INTERSECT, EXCEPT) SQL-এ ব্যবহৃত হয় ডেটার একাধিক রেজাল্ট সেটের মধ্যে সম্পর্ক স্থাপন করতে।
- UNION দুইটি বা তার বেশি কুয়েরির ফলাফল একত্রিত করে, তবে ডুপ্লিকেট রেকর্ড বাদ দেয়।
- INTERSECT দুটি কুয়েরির মধ্যে সাধারণ রেকর্ড রিটার্ন করে।
- EXCEPT একটি কুয়েরির রেজাল্ট থেকে অন্য কুয়েরির রেজাল্ট বাদ দেয় এবং অমিল রেকর্ড রিটার্ন করে।
এই অপারেটরগুলো ডেটা বিশ্লেষণ এবং পর্যালোচনায় গুরুত্বপূর্ণ ভূমিকা রাখে এবং একে অপরের মধ্যে সম্পর্ক স্থাপন করতে সহায়তা করে।
Window Functions হল SQL ফাংশন যা ডেটার একটি উইন্ডো বা অংশের মধ্যে গণনা বা বিশ্লেষণ করতে ব্যবহৃত হয়, যেখানে আপনি একটি গ্রুপ বা সম্পূর্ণ টেবিলের উপর ভিত্তি করে নির্দিষ্ট পরিসরে ক্যালকুলেশন করতে পারেন। এগুলি সাধারণত তুলনামূলক বিশ্লেষণ, অ্যারেঞ্জমেন্ট বা র্যাঙ্কিং এর জন্য ব্যবহৃত হয়।
Window Function ব্যবহার করার মাধ্যমে, আপনি কোনো নির্দিষ্ট রেকর্ড বা গ্রুপের সাথে সম্পর্কিত ডেটার উপর গণনা, অর্থাৎ মোট, গড়, মিনিমাম, ম্যাক্সিমাম, র্যাঙ্ক, রোলিং এভারেজ ইত্যাদি ক্যালকুলেট করতে পারেন, কিন্তু এতে গ্রুপ বাই (GROUP BY) ব্যবহারের প্রয়োজন নেই। এই ফাংশনগুলি টেবিলের প্রতিটি রেকর্ডের জন্য একটি পিরিওডিক ক্যালকুলেশন সম্পাদন করে, তবে এটি অন্যান্য রেকর্ডগুলির উপর প্রভাব ফেলে না।
Window Function এর মূল বৈশিষ্ট্য
- Row-level Calculation: উইন্ডো ফাংশন প্রতিটি রেকর্ডের উপর গণনা করে, যেখানে "window" নির্ধারণ করে যে ক্যালকুলেশনটি কোন ডেটার অংশের উপর করতে হবে।
- Partitioning: উইন্ডো ফাংশনগুলিতে PARTITION BY ব্যবহার করা যেতে পারে, যার মাধ্যমে আপনি ডেটাকে গ্রুপে ভাগ করতে পারেন এবং তারপর প্রতিটি গ্রুপের জন্য আলাদা ক্যালকুলেশন করতে পারেন।
- Ordering: উইন্ডো ফাংশন ব্যবহার করে ORDER BY প্রয়োগ করতে পারেন, যার মাধ্যমে রেকর্ডগুলিকে সাজানো যায় এবং নির্দিষ্ট অর্ডারে ক্যালকুলেশন করা হয়।
- Frame Specification: উইন্ডো ফাংশন ব্যবহার করে ROWS BETWEEN বা RANGE BETWEEN ডিফাইন করা যায়, যা ক্যালকুলেশনের পরিসর নির্ধারণ করতে সাহায্য করে।
Window Functions এর কিছু উদাহরণ
১. ROW_NUMBER():
এই ফাংশনটি প্রতিটি রেকর্ডের জন্য একটি ইউনিক সিকোয়েন্স নাম্বার (row number) অ্যাসাইন করে, যা নির্দিষ্ট অর্ডারে সাজানো রেকর্ডগুলির জন্য ব্যবহার করা হয়।
Example:
SELECT employee_id, employee_name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;
এই কুয়েরি দিয়ে আপনি সব কর্মচারীকে তাদের বেতন অনুসারে সাজিয়ে একটি সিকোয়েন্স নাম্বার পাবেন।
২. RANK():
এই ফাংশনটি প্রতিটি রেকর্ডকে একটি র্যাঙ্ক প্রদান করে, কিন্তু যখন দুটি রেকর্ডের মান সমান থাকে, তখন উভয়কে একই র্যাঙ্ক দেওয়া হয় এবং পরবর্তী রেকর্ডের র্যাঙ্কে প্রভাব ফেলে।
Example:
SELECT employee_id, employee_name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;
এখানে, কর্মচারীদের বেতন অনুযায়ী র্যাঙ্ক প্রদান করা হবে, যেখানে সমান বেতনযুক্ত কর্মচারীরা একই র্যাঙ্ক পাবেন।
৩. DENSE_RANK():
এই ফাংশনটি RANK() এর মতো, তবে এখানে সমান রেকর্ডগুলির র্যাঙ্কে কোনো ফাঁকা সংখ্যা দেয়া হয় না। অর্থাৎ, পরবর্তী রেকর্ডটি আগের র্যাঙ্কের পরবর্তী র্যাঙ্ক পাবে।
Example:
SELECT employee_id, employee_name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
এই কুয়েরি ব্যবহারে, সমান বেতন থাকা কর্মচারীদের র্যাঙ্কে কোনো ফাঁকা রাখা হবে না।
৪. SUM() WITH WINDOW:
এটি একটি সাধারণ উইন্ডো ফাংশন যা একটি নির্দিষ্ট উইন্ডোর মধ্যে মোট মান ক্যালকুলেট করতে ব্যবহৃত হয়। সাধারণত এটি ব্যবহার করা হয় চলমান বা রোলিং অ্যাগ্রিগেট হিসেবে।
Example:
SELECT employee_id, salary,
SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total
FROM employees;
এখানে, প্রতি কর্মচারীর জন্য একটি running total তৈরি হচ্ছে, যা তাদের বেতন অনুসারে সাজানো হচ্ছে এবং প্রতিটি কর্মচারীর আগের সব কর্মচারীর মোট বেতন যোগ করা হচ্ছে।
৫. AVG() WITH WINDOW:
এই ফাংশনটি একটি নির্দিষ্ট উইন্ডোর মধ্যে গড় ক্যালকুলেট করতে ব্যবহৃত হয়।
Example:
SELECT employee_id, department, salary,
AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees;
এই কুয়েরি দিয়ে আপনি প্রতিটি বিভাগের গড় বেতন দেখতে পাবেন, যেখানে PARTITION BY বিভাগ অনুযায়ী ডেটা ভাগ করছে।
Analytics Queries in Teradata
Analytics Queries হল SQL কুয়েরি যা বিশ্লেষণাত্মক কাজগুলো, যেমন ডেটা র্যাঙ্কিং, ট্রেন্ড বিশ্লেষণ, চলমান গড়, এবং তুলনামূলক বিশ্লেষণ করার জন্য ব্যবহৃত হয়। উইন্ডো ফাংশনগুলির মাধ্যমে এই ধরনের কুয়েরি তৈরি করা হয়, যা বিভিন্ন ডেটা গ্রুপের জন্য ডেটার সম্পর্ক বিশ্লেষণ করতে সাহায্য করে।
উদাহরণ ১: Rolling Average Calculation:
ধরা যাক, আপনি একটি স্টোরের প্রতিদিনের বিক্রয় ডেটা বিশ্লেষণ করছেন এবং প্রতি তিনদিনের জন্য গড় বিক্রয় নির্ধারণ করতে চান।
Example:
SELECT sale_date, amount,
AVG(amount) OVER (ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_avg
FROM sales;
এখানে, প্রতিটি দিনে আগের দুই দিনের সাথে গড় বের করা হচ্ছে।
উদাহরণ ২: Year-over-Year Comparison:
এখানে, আপনি বছরের তুলনায় বছরের বিক্রয় পরিমাণ কম্পেয়ার করতে চান।
Example:
SELECT sale_date, amount,
SUM(amount) OVER (PARTITION BY EXTRACT(YEAR FROM sale_date)) AS yearly_total,
amount / SUM(amount) OVER (PARTITION BY EXTRACT(YEAR FROM sale_date)) AS percentage_of_year
FROM sales;
এই কুয়েরির মাধ্যমে, আপনি দেখতে পাবেন যে প্রতিটি বিক্রয় বছরে মোট বিক্রয়ের কত শতাংশ অবদান রাখছে।
সারাংশ
Window Functions টেরাডেটা ডেটাবেসের অত্যন্ত শক্তিশালী ফিচার যা ডেটার অংশবিশেষ বা উইন্ডো ব্যবহার করে ক্যালকুলেশন করতে সহায়তা করে। এটি র্যাঙ্কিং, অ্যাগ্রিগেট ফাংশন, এবং চলমান বিশ্লেষণ পরিচালনা করতে ব্যবহৃত হয়। Analytics Queries উইন্ডো ফাংশনের সাহায্যে বড় ডেটাসেটের মধ্যে ট্রেন্ড বিশ্লেষণ এবং তুলনামূলক বিশ্লেষণ সম্পন্ন করতে সক্ষম। টেরাডেটায় উইন্ডো ফাংশনগুলি ব্যবহার করে জটিল এবং সময়সাপেক্ষ বিশ্লেষণ দ্রুত এবং কার্যকরভাবে করা যায়।
Read more