SQL (Structured Query Language) হল সেই সাধারণ ভাষা যা গ্রহের প্রায় প্রতিটি গুরুত্বপূর্ণ রিলেশনাল ডাটাবেস ব্যবহার করে— PostgreSQL, MySQL, এবং SQLite থেকে SQL Server এবং Oracle এর মতো বাণিজ্যিক সিস্টেম পর্যন্ত। এটি আপনাকে ডেটা স্ট্রাকচার সংজ্ঞায়িত করতে, ডেটা সংরক্ষণ করতে, এটি দক্ষতার সাথে কোয়েরি করতে এবং সেই ডেটা কীভাবে আচরণ করে সে সম্পর্কে নিয়ম প্রয়োগ করতে দেয়।
নীচে SQL এর একটি গভীর, প্রায় ২,৫০০ শব্দের ট্যুর রয়েছে: এটি কী, এটি কীভাবে কাজ করে, এবং বাস্তব সিস্টেমে এটি কীভাবে ভালভাবে ব্যবহার করা যায়।
SQL একটি ঘোষণামূলক ভাষা: আপনি কী ডেটা চান তা বর্ণনা করেন, এবং ডাটাবেস কীভাবে এটি পেতে হবে তা সিদ্ধান্ত নেয়। W3Schools-এ SQL গাইড এবং W3Schools.in SQL সিরিজ অনেক ডাটাবেস ইঞ্জিন জুড়ে ডেটা সংরক্ষণ, পরিচালনা এবং পুনরুদ্ধারের জন্য স্ট্যান্ডার্ড ভাষা হিসাবে SQL পরিচয় করিয়ে দেয়।
SQL স্ট্যান্ডার্ড এবং ব্যাপকভাবে সমর্থিত হওয়ায়, আপনি একই মানসিক মডেল ব্যবহার করতে পারেন:
বেশিরভাগ দৈনন্দিন ব্যবসায়িক ডেটা—অর্ডার, ব্যবহারকারী, পেমেন্ট, লগ, বিশ্লেষণ—শেষ পর্যন্ত টেবিলে সংরক্ষিত হয় যা আপনি SQL দিয়ে কোয়েরি করতে পারেন।
SQL ISO/IEC 9075 স্ট্যান্ডার্ড পরিবার দ্বারা স্ট্যান্ডার্ডাইজ করা হয়েছে, যা মূল ভাষা এবং অনেক ঐচ্ছিক এক্সটেনশন সংজ্ঞায়িত করে। স্ট্যান্ডার্ডটি SQL-86, SQL-92, SQL:1999, SQL:2003, এবং SQL:2023 পর্যন্ত সংস্করণের মাধ্যমে বিকশিত হয়েছে। SQL স্ট্যান্ডার্ড ISO/IEC 9075:2023 সম্পর্কে ANSI এর ওভারভিউ এর মতো নিবন্ধগুলি ব্যাখ্যা করে যে ANSI এবং ISO স্ট্যান্ডার্ড সময়ের সাথে কীভাবে সারিবদ্ধ হয়।
স্ট্যান্ডার্ড নিজেই একাধিক অংশে বিভক্ত, যেমন:
আপনি SQL-এর জন্য ISO ক্যাটালগ পেজ এবং Modern SQL-এর স্ট্যান্ডার্ড অংশগুলির ব্রেকডাউন এর মতো রিসোর্সে সম্পূর্ণ তালিকা দেখতে পারেন।
অনুশীলনে, প্রতিটি ডাটাবেস তার নিজস্ব ডায়ালেক্ট প্রয়োগ করে:
মূল ধারণাগুলি—টেবিল, সারি, কলাম, জয়েন, অ্যাগ্রিগেট—পোর্টেবল, তবে যে কোনো নন-ট্রিভিয়াল সিস্টেম একটি নির্দিষ্ট ডায ়ালেক্টের কুইর্কস এবং বৈশিষ্ট্যগুলি শেখার সাথে জড়িত হবে।
এর মূলতে, SQL রিলেশনাল মডেল এর চারপাশে ডিজাইন করা হয়েছে: ডেটা টেবিল (রিলেশন) এ থাকে, যেখানে প্রতিটি সারি একটি তথ্য উপস্থাপন করে এবং প্রতিটি কলাম একটি বৈশিষ্ট্য বর্ণনা করে।
সাধারণ উপাদানগুলির মধ্যে রয়েছে:
customers, ordersid, name, order_date, total_amountid)orders.customer_id → customers.id)নরমালাইজেশন গাইড—যেমন DigitalOcean-এর নরমালাইজেশন টিউটোরিয়াল বা freeCodeCamp-এর 1NF, 2NF, 3NF ব্যাখ্যা—ভাল রিলেশনাল ডিজাইনকে রিডান্ডেন্সি কমানো এবং ডেটাকে ভাল-স্ট্রাকচারযুক্ত টেবিলে বিভক্ত করে এবং কী দিয়ে তাদের একসাথে বেঁধে আপডেট অ্যানোমালি প্রতিরোধ হিসাবে ফ্রেম করে।
যখন আপনি SQL দিয়ে কোয়েরি করেন, আপনি মূলত ডাটাবেসকে জিজ্ঞাসা করছেন: "এই টেবিলগুলি থেকে, এই শর্তগুলির অধীনে, আমার কোন সারি এবং কলাম দেখতে হবে?"
SELECT স্টেটমেন্ট হল SQL-এর কাজের ঘোড়া এবং যুক্তিযুক্তভাবে এর সবচেয়ে জটিল কমান্ড। SQLite SELECT রেফারেন্স এটিকে "SQL ভাষার সবচেয়ে জটিল কমান্ড" বলে, এবং MySQL-এর SELECT ডকুমেন্টেশন এবং SQLite Tutorial-এর SELECT গাইড এর মতো টিউটোরিয়ালগুলি এর অনেক বিকল্পের মধ্য দিয়ে যায়।
SELECT id, name
FROM customers;মূল অংশ:
SELECT কলামগ ুলি তালিকাভুক্ত করে (বা সমস্ত কলামের জন্য *, যদিও স্পষ্ট হওয়া সাধারণত ভাল)।FROM এক বা একাধিক টেবিল বেছে নেয়।WHERE সারি ফিল্টার করে।ORDER BY ফলাফল সাজায়।LIMIT আপনি কতগুলি সারি দেখতে পারেন তা সীমাবদ্ধ করে।SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50;ইন্ট্রো টিউটোরিয়াল যেমন W3Schools SQL টিউটোরিয়াল এবং W3Schools MySQL সাধারণ কমান্ডের ওভারভিউ SELECT ব্যবহার করে দেখায় যে আপনি কীভাবে একটি একক, পাঠযোগ্য এক্সপ্রেশনে টেবিল থেকে ডেটা বের করেন।
SQL তখনই উজ্জ্বল হয় যখন আপনি কোয়েরিতে সরাসরি ফিল্টারিং এবং এক্সপ্রেশন একত্রিত করেন:
SELECT
id,
total_amount,
total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
AND total_amount >= 100
ORDER BY total_amount DESC;WHERE ক্লজ তুলনা অপারেটর (=, <>, >, <), লজিক্যাল অপারেটর (AND, OR, NOT), প্যাটার্ন ম্যাচিং (LIKE, ILIKE), এবং আরও ব্যবহার করতে পারে। MySQL এর মতো ডাটাবেস বিল্ট-ইন ফাংশন এবং অপারেটর এর একটি সমৃদ্ধ সেট নথিভুক্ত করে সংখ্যাসূচক, স্ট্রিং, তারিখ/সময়, JSON, এবং অন্যান্য অপারেশনের জন্য।
আপনি এছাড়াও করতে পারেন:
IN ব্যবহার করুন: WHERE status IN ('paid', 'refunded')BETWEEN ব্যবহার করুন: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'IS NULL / IS NOT NULL ব্যবহার করুনভাল টিউটোরিয়াল এবং ম্যানুয়ালগুলি জোর দেয় যে এক্সপ্রেশন অনেক ক্লজে উপস্থিত হয়—WHERE, ORDER BY, HAVING, এবং এমনকি SELECT নিজেই। MySQL ডক্স ফাংশন এবং অপারেটর অধ্যায়ের মধ্যে এক্সপ্রেশন মূল্যা য়নের তাদের বিভাগে এটি হাইলাইট করে।
বাস্তব ডাটাবেস খুব কমই একটি টেবিলে সবকিছু রাখে। পরিবর্তে, আপনি ডেটাকে একাধিক টেবিলে নরমালাইজ করেন এবং যখন আপনি কোয়েরি করেন তখন তাদের জয়েন করেন। জয়েনগুলি SQL জয়েনে W3Schools পেজ, GeeksforGeeks-এর জয়েন টিউটোরিয়াল, TutorialsPoint-এর জয়েন ওভারভিউ, এবং SQL Practice Online-এ SQL জয়েন টিউটোরিয়াল এর মতো রিসোর্সে ব্যাপকভাবে কভার করা হয়েছে।
SELECT
o.id,
c.name,
o.order_date,
o.total_amount
FROM orders AS o
JOIN customers AS c
ON c.id = o.customer_id;সাধারণ জয়েন টাইপ:
ভিজ্যুয়াল এবং কোড-হেভি ব্যাখ্যা, যেমন DbSchema-এর "SQL joins explained" নিবন্ধ বা LearnSQL.com-এর জয়েন উদাহরণ, জয়েনগুলি কীভাবে আচরণ করে সে সম্পর্কে শক্তিশালী অন্তর্দৃষ্টি তৈরি করার দুর্দান্ত উপায়।
ডেটা সংক্ষিপ্ত করতে—মোট, গড়, গণনা—আপনি অ্যাগ্রিগেট ফাংশন (COUNT, SUM, AVG, MIN, MAX) GROUP BY এর সাথে ব্যবহার করেন:
SELECT
customer_id,
COUNT(*) AS order_count,
SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;রেফারেন্স যেমন MySQL ফাংশন এবং অপারেটর অধ্যায় এবং PostgreSQL অ্যাগ্রিগেট এবং উইন্ডো ফাংশনে ডকুমেন্টেশন এই এক্সপ্রেশনে আপনি ব্যবহার করতে পারেন এমন বিল্ট-ইন ফাংশনগুলির ক্যাটালগ করে।
আধুনিক SQL উইন্ডো ফাংশন সমর্থন করে, যা আপনাকে এখনও পৃথক সারি ফেরত দেওয়ার সময় সারির স্লাইডিং "উইন্ডো" এর উপর অ্যাগ্রিগেট গণনা করতে দেয়—যেমন, চলমান মোট বা র্যাঙ্কিং। উইন্ডো ফাংশন SQL:1999-এ সংশোধনীর মাধ্যমে SQL-এ প্রবেশ করেছিল, পরে SQL:2003-এ একীভূত হয়েছিল, যেমন SQL:1999 এবং SQL:2003 স্ট্যান্ডার্ড সম্পর্কে নোটগুলিতে সংক্ষিপ্ত করা হয়েছে।
SELECT
customer_id,
order_date,
total_amount,
SUM(total_amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
) AS running_total
FROM orders;এই ধরনের কোয়েরি ডাটাবেসে সরাসরি বিশ্লেষণের জন্য অত্যন্ত শক্তিশালী।
SQL শুধু কোয়েরির জন্য নয়; এটি Data Definition Language (DDL) স্টেটমেন্টের মাধ্যমে আপনার ডেটার আকৃতি সংজ্ঞায়িত করে, যা Data Definition গাইড এবং MySQL-এর SQL স্টেটমেন্ট অধ্যায় এর মতো বিভাগে ভালভাবে নথিভুক্ত।
সাধারণ DDL কমান্ড:
CREATE DATABASE my_app; – একটি ডাটাবেস তৈরি করুনCREATE TABLE customers (...); – একটি টেবিল সংজ্ঞায়িত করুনALTER TABLE customers ADD COLUMN phone TEXT; – টেবিল স্ট্রাকচার পরিবর্তন করুনDROP TABLE customers; – একটি টেবিল সরানCREATE TABLE customers (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN NOT NULL DEFAULT TRUE
);মনে রাখার বিষয়:
PRIMARY KEY, UNIQUE, NOT NULL, CHECK এক্সপ্রেশনপ্রতিটি প্রধান RDBMS ম্যানুয়াল—PostgreSQL-এর SQL ভাষা বিভাগ, MySQL-এর রেফারেন্স ম্যানুয়াল, এবং SQLite-এর ভাষা রেফারেন্স—DDL সম্পর্কে সাবধানে চিন্তা করার উপর জোর দেয়, কারণ স্কিমা সিদ্ধান্তগুলি পরে পরিবর্তন করা কঠিন।
SQL ডাটাবেস সাধারণত ACID বৈশিষ্ট্যগুলি প্রয়োগ করে— Atomicity, Consistency, Isolation, Durability—ট্রানজ্যাকশন এর মাধ্যমে:
BEGIN;
UPDATE accounts
SET balance = balance - 200
WHERE id = 1;
UPDATE accounts
SET balance = balance + 200
WHERE id = 2;
COMMIT;BEGIN এবং COMMIT এর মধ্যে যদি কিছু ব্যর্থ হয়, ট্রানজ্যাকশনটি রোলব্যাক করা যেতে পারে যাতে মধ্যবর্তী পরিবর্তনগুলি ডাটাবেসে লিক না হয়।
MySQL-এর ট্রানজ্যাকশনাল এবং লকিং স্টেটমেন্ট বিভাগ START TRANSACTION, COMMIT, ROLLBACK, এবং সেভপয়েন্ট কভার করে, যখন PostgreSQL-এর কনকারেন্সি কন্ট্রোল এবং ট্রানজ্যাকশন ম্যানেজমেন্ট অধ্যায়গুলি ব্যাখ্যা করে যে আইসোলেশন লেভেল এবং MVCC কীভাবে হুডের নীচে কাজ করে।
কনস্ট্রেইন্ট—যেমন ফরেন কী বা চেক কনস্ট্রেইন্ট—ব্যবসায়িক নিয়ম প্রয়োগ করার ডাটাবেসের উপায়:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);ভালভাবে ব্যবহার করা হলে, তারা আপনার ডাটাবেসকে ইনভেরিয়েন্টের অভিভাবক এ পরিণত করে, শুধুমাত্র অ্যাপ্লিকেশন লজিকের উপর নির্ভর করার পরিবর্তে উৎসে অবৈধ ডেটা প্রতিরোধ করে।
স্কিমা সঠিক করা প্রায়শই চতুর কোয়েরির চেয়ে বেশি গুরুত্বপূর্ণ। নরমালাইজেশন হল রিডান্ডেন্সি কমাতে এবং সামঞ্জস্যতা উন্নত করতে টেবিলগুলিকে স্ট্রাকচার করার প্রক্রিয়া। টিউটোরিয়াল যেমন:
সাধারণ অগ্রগতি:
অতিরিক্ত নরমালাইজেশন পারফরম্যান্সকে আঘাত করতে পারে এবং কোয়েরিগুলি কে জটিল করতে পারে; ব্যবহারিক দলগুলি প্রায়শই 3NF-এ নরমালাইজ করে এবং তারপর ডিনরমালাইজ করে নির্বাচনীভাবে (উদাহরণস্বরূপ, অ্যাগ্রিগেট ক্যাশিং) যেখানে পারফরম্যান্সের প্রয়োজন হয়।
ইনডেক্স হল SQL কোয়েরি দ্রুত করার প্রাথমিক সরঞ্জাম। এগুলি হল সহায়ক ডেটা স্ট্রাকচার যা ডাটাবেসকে সম্পূর্ণ টেবিল স্ক্যান করার পরিবর্তে সরাসরি প্রাসঙ্গিক সারিতে যেতে দেয়।
ইনডেক্সিং-এ একটি গভীরভাবে সম্মানিত রিসোর্স হল Markus Winand-এর Use The Index, Luke!, একটি বিনামূল্যে অনলাইন বই যা সম্পূর্ণভাবে SQL পারফরম্যান্স এবং ইনডেক্সিং কৌশলের উপর ফোকাস করে। সাইটের মূল পেজ, UseTheIndexLuke.com, এবং "Indexing LIKE filters" এবং "More indexes, slower INSERT" এর মতো নিবন্ধগুলি ব্যাখ্যা করে যে ইনডেক্স কখন সাহায্য করে এবং কখন ক্ষতি করে।
মূল ধারণা:
WHERE email = ..., WHERE created_at >= ...)।(customer_id, created_at) WHERE customer_id = ? AND created_at >= ? এর জন্য ভাল কাজ করে।SELECT, UPDATE, এবং DELETE সাহায্য করে, কিন্তু ইনসার্ট ধীর করে কারণ প্রতিটি ইনসার্টকে সমস্ত প্রাসঙ্গিক ইনডেক্স আপডেট করতে হবে।গাইড যেমন MSSQLTips-এর SQL Server ইনডেক্স ডিজাইন করার নিবন্ধ প্রদর্শন করে যে একটি ইনডেক্সে কলাম পছন্দ এবং অর্ডারিং কীভাবে বাস্তব কোয়েরিকে প্রভাবিত করে।
ব্যবহারিক নিয়ম:
EXPLAIN ANALYZE ব্যবহার করুন।যদিও মূলনীতিগুলি স্থির রয়েছে, আধুনিক SQL উল্লেখযোগ্যভাবে বৃদ্ধি পেয়েছে:
WITH এর মাধ্যমে Common Table Expressions (CTE) আরও পাঠযোগ্য, মডুলার কোয়েরি অনুমোদন করে:WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
)
SELECT customer_id, COUNT(*)
FROM recent_orders
GROUP BY customer_id;SQL স্ট্যান্ডার্ড নিজেই XML, মাল্টিডাইমেনশনাল অ্যারে, এবং প্রপার্টি গ্রাফ কোয়েরির জন্য অংশ যোগ করেছে, যেমন ISO SQL স্ট্যান্ডার্ড ক্যাটালগ এবং SQL-এর বিবর্তন সম্পর্কে লেখাগুলিতে যেমন ANSI SQL স্ট্যান্ডার্ড নিবন্ধ এ নথিভুক্ত।
আধুনিক SQL এতটাই শক্তিশালী যে অনেক অ্যাপ্লিকেশন জটিল লজিক—হায়ারার্কি, বিশ্লেষণ, ইভেন্ট প্রসেসিং—ডাটাবেস লেয়ারে নিচে ঠেলে দিতে পারে।
SQL ডেটা কাজের জন্য মৌলিক থাকায়, শেখার রিসোর্সের একটি সমৃদ্ধ ইকোসিস্টেম রয়েছে:
একটি ব্যবহারিক শেখার কৌশল:
WHERE, ORDER BY, এবং LIMIT যোগ করুন।GROUP BY দিয়ে "প্রতি মাসে রাজস্ব" বা "শীর্ষ ১০ গ্রাহক" এর মতো প্রশ্নের উত্তর দেওয়া শিখুন।EXPLAIN দিয়ে কোয়েরি প্রোফাইল করুন।যদি আপনি SQL আরামে পড়তে এবং লিখতে পারেন, আপনি প্রোডাকশনে সরাসরি ডেটা পরিদর্শন করতে পারেন, স্প্রেডশীটে রপ্তানি না করে রিপোর্ট তৈরি করতে পারেন, অন্তর্নিহিত টেবিলগুলিতে উঁকি দিয়ে অ্যাপ্লিকেশন লজিক ডিবাগ করতে পারেন, এবং ইঞ্জিনিয়ার এবং বিশ্লেষকদের সাথে আরও কার্যকরভাবে সহযোগিতা করতে পারেন।
SQL একটি অনন্য ছেদে বসে: এটি ৪০ বছরেরও বেশি পুরানো, তবুও আজকের ক্লাউড-নেটিভ, বিশ্লেষণ-ভারী সিস্টেমে গভীরভাবে প্রাসঙ্গিক। ISO/IEC 9075 স্ট্যান্ডার্ড এবং এর অনেক অংশ বিকশিত হতে থাকে, যখন PostgreSQL, MySQL, এবং SQLite এর মতো ওপেন-সোর্স ডাটাবেস ব্যবহারিক বৈশিষ্ট্য এবং পারফরম্যান্স উন্নতি ঠেলে দেয়।
যদি আপনি ডেটার সাথে কাজ করেন—ডেভেলপার, বিশ্লেষক, ডেটা সায়েন্টিস্ট, বা প্রোডাক্ট ম্যানেজার—SQL হল সেই ভাগ করা ভাষা যা আপনাকে সরাসরি ডাটাবেসে প্রশ্ন জিজ্ঞাসা করতে দেয়। এটি একবার শেখার মতো, এবং এটি আপনার বাকি ক্যারিয়ারের জন্য পরিশোধ করে।
SQL ফরম্যাটিং হল সঠিক ইন্ডেন্টেশন, লাইন ব্রেক এবং কীওয়ার্ড কেসিং সহ SQL কোয়েরি সংগঠিত করার প্রক্রিয়া যা পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করে।
আমাদের ফরম্যাটার MySQL, PostgreSQL, SQL Server, SQLite, Oracle এবং আরও অনেকগুলি সহ একাধিক SQL ডা য়ালেক্ট সমর্থন করে।
হ্যাঁ! সমস্ত SQL ফরম্যাটিং সম্পূর্ণরূপে আপনার ব্রাউজারে ঘটে। আপনার কোয়েরি কখনই আপনার কম্পিউটার ছেড়ে যায় না, সম্পূর্ণ গোপনীয়তা এবং নিরাপত্তা নিশ্চিত করে।
হ্যাঁ, আপনি একবারে একাধিক SQL স্টেটমেন্ট ফরম্যাট করতে পারেন। ফরম্যাটার নির্বাচিত ডায়ালেক্টের উপর ভিত্তি করে প্রতিটি স্টেটমেন্ট যথাযথভাবে পরিচালনা করবে।
ফরম্যাটার আপনার SQL-এ সিনট্যাক্স ত্রুটি থাকলেও এটি ফরম্যাট করার চেষ্টা করবে। তবে, আপনি অবৈধ SQL-এর জন্য ত্রুটি বার্তা দেখতে পারেন যা পার্স করা যায় না। সর্বদা আপনার ডাটাবেস সিস্টেমের সাথে আপনার SQL যাচাই করুন।