Basics of PostgreSQL - বাংলা (Part - 02)


কিছুদিন আগে আমাকে আমার মা বাজারে পাঠিয়েছিলো মাছ কিনতে। তো বাজারে রউনা দিবো এমন সময় মা আমাকে জিজ্ঞাস করলো, "বাজার তো করো নাই কখনো। তাইলে মাছ কিনবা কিভাবে?"। আমি সোজাসাপ্টা উত্তর দিলাম, "বাজারে যাবো। জিজ্ঞাস করবো এই মাছ আছে কিনা। থাকলে এটা আমাকে দিন। শেষ!!"। আমার মা এবার হেসে আবার জিজ্ঞাস করলেন, "মাছতো অনেকই আছে। ভালো মাছ কোনটা আর খারাপ কোনটা তাতো চিনতে হবে তাই নাহ"? ভেবে দেখলাম এটা আসলেই চিন্তার বিষয়। এরপরে আমার মা আমাকে কিছু বৈশিষ্ট্য বললেন যে ভালো মাছ দেখতে কেমন, রং কেমন, সাইজ কত থেকে কত হতে পারে, কেমন নরম, কত দাম থাকবে ইত্যাদি ইত্যাদি। এখন এই ব্যাপারটা একটু কষ্টের। অনেকগুলা শর্ত আছে। এরউপর আবার কিছু শর্ত আছে যেগুলো ঠিক একই রকম নাও মিলতে পারে, তবে কাছাকাছি গেলেও চলবে। ব্যাপারটা নিয়ে একটু চিন্তা করতে করতে খেয়াল হলো, কিছুদিন আগে যখন SQL শিখছিলাম, তখন সেখানেও এমন কিছু করেছিলাম। অর্থাৎ এটা জেনে রাখুন PostgreSQL এ মোটামুটি সবরকমের কুয়েরী করাই সম্ভব। আপনি যেভাবে এবং যেইরকম ও যতরকম শর্তেই কুয়েরী করতে চাননা কেন, আপনি তা করতে পারবেন শুধু মাত্র সিন্ট্যাক্সগুলো একই রাখলে চলবে। আমার ব্লগের মাননীয় দর্শনার্থীবৃন্দ, চলুন আজ PostgreSQL এর শিখার পর্বে একধাপ এগিয়ে যাই। এ পর্বে আমরা কন্ডিশন কুয়েরীর পরের ধাপ সহ এমন কিছু শিখবো যা আমাদের কাছে PostgreSQL কে আরো ইন্টারেস্টিং করে তুলবো। তাহলে চলুন শুরু করা যাক।

খুল যা সিমসিম!!!!!!!!

গত পর্বে আমরা যা শিখেছি তা দিয়ে আপাতত আমরা ব্যাসিক কিছু কুয়েরী করে আমাদের ডেটাবেজ টেবিল থেকে ডেটা দেখতে পারতাম। আমরা এবার সেইগুলোর পরের ধাপে যাওয়ার আগে আপনাকে আরো কিছু কাজ করা লাগবে। কাজ কঠিন কিছু না। আপনি এর আগেই এই কাজ ভালোমতোই করেছেন। আপনার ডেটাবেজ টেবিলে যা ডেটা আছে, তার সাথে আরো কিছু ডেটা যোগ করুন। মানে ইন্সার্ট অপারেশন চালান। একই কোড কিন্তু আলাদা আলাদা ভ্যালুর সাথে বারবার রান করান। শুধু অন্তত একবার যেকোন একটা কিংবা কয়েকটা কলামের ভ্যালু দিন NULL। কোনরকম কোটেশন চিহ্ন দেয়া লাগবে না। শুধু NULL শব্দটা ভ্যালু হিসেবে দিন। এটার মানে কি এবং কেন করলেন, তা একটু পরেই বুঝতে পারবেন।  আর এই ২টা কাজ শেষে একটা SELECT কুয়েরী চালিয়ে দেখে নিন ২০টার মতো অন্তত রেকর্ড আছে কিনা। আর মূলপর্ব শুরু করার আগে আমরা একটু আগের স্ট্রাকচারটা মনে করে নি,

SELECT column_name AS something FROM "Table_nameWHERE condition_is_something

এবার আমরা শিখবো এই WHERE এর সাথে আরো কত ভাবে ও কিভাবে কিভাবে শর্ত যোগ করতে পারি। কিভাবে আরো নিক্ষুত ভাবে আমরা আমাদের কুয়েরী সম্পন্ন করতে পারি। কিভাবে আমরা আমাদের মনমতো ডেটাগুলো আউটপুট আকারে দেখতে পারি এবং আরো অনেক কিছু। বলে রাখা ভালো, আমি অনেক কিছুই কুয়েরী কোড লিখার আগে শর্টকাট দেখিয়েছি। এর দুটো কারণ আছে। একটা হলো যাতে আপনি pgadmin সফটওয়্যারটির ব্যাবহারের সুফল ভোগ করে আপনার কাজ আরো সহজেই করতে পারেন। এতে সময় ও কষ্ট দুইটাই কম লাগে। আরেকটা হলো আপনি কোড আগে থেকে দেখে নিজে নিজে একটু বুঝতে পারেন। যেমন আমরা ইন্সার্ট অপারেশনের জন্য যেই কোড লিখা লাগবে, তা আগে থেকেই পেয়ে যাচ্ছি। আপনি জানেন এই কোডটি ডেটা ইন্সার্ট করার জন্য ব্যাবহার করা হয়। এখন যদি আপনি কোডটি একটু ভাল করে বুঝার চেষ্টা করেন, তাহলে আপনি নিজেই বুঝতে পারবেন কোনটা কেন লিখা হয়েছে। আর এরপরে আপনি স্ট্রাকচারটা নিজেই আবিষ্কার করতে পারবেন। আমরা এইভাবে সামনে আরো অনেক কিছু সহজে শিখার চেষ্টা করবো।

BETWEEN .... AND

মনে আছে, আমরা গত পর্বে একটা কুয়েরী চালিয়েছিলাম, যেখানে আমরা দেখতে চাচ্ছিলাম কাদের স্যালারি ২১০০০। এখন ধরুন আমরা শুধু ২১০০০ না, আমরা দেখতে চাচ্ছি কাদের স্যালারি ১৫০০০ থেকে ২১০০০ এর মধ্যে। অর্থাৎ কলামের ডেটা একটা রেঞ্জের মধ্যে যাদের ডেটার সাথে মিলবে, তাদের সব ডেটা দেখতে চাচ্ছি। খেয়াল করে দেখুন রেঞ্জের ২টা পার্ট। একটা হলো শুরুর ভ্যালু এবং আরেকটা হলো শেষ ভ্যালু। আর আমরা জানতে চাচ্ছি কাদের salary কলামের ভ্যালু এই দুইটা ভ্যালুর রেঞ্জের মধ্যেই। এর জন্য আমরা এইভাবে সাজাতে পারি,

select column_names from table_name where condition_column between first_value and last_value ;

এখানে condition_column এর জায়গায় আমরা নামে দিবো salary আর first_value এবং last_value এর জায়গায় আমরা দিবো ১৫০০০ এবং ২১০০০। তাহলেই আমাদের কাংখিত রেজাল্ট আমরা দেখতে পাবো।

খেয়াল করে দেখবেন আমি কিওয়ার্ডগুলো লোয়ারকেস লেটারে লিখেছি। এর কারণ আমি আগেই বলেছি SQL কেসসেন্সিটিভ না। সেটা মনে করিয়ে দেয়ার জন্যই মূলতঃ এটা লেখা।

AND

একটু আগে আমরা শিখেছি BETWEEN .... AND এ AND এর কাজ রেঞ্জের দুইটা ভ্যালুর ফরমেট করা। কিন্তু শুধু AND কিওয়ার্ডের কাজ আবার ভিন্ন। তবে অনেক উপকারি। ধরুন আপনি চাচ্ছেন আপনার কুয়েরী আরো নির্দিষ্ট করতে। যেমন আপনি জানতে চান আপনার ডেটাবেজে কাদের ডেটা আছে যাদের স্যালারি ২১০০০ এর উপর তবে তাদের র‍্যাঙ্ক "Detective". অর্থাৎ এখানে আসলে দুইটা শর্ত। প্রথমে আমি জানতে চাই ২১০০০ এর উপরে যাদের স্যালারি তাদের ডেটা। এরপরে জানতে চাচ্ছি আমি এদের মধ্যেই কারা Detective। এইরকম একাধিক শর্তের জন্যই আমরা AND কিওয়ার্ডের ব্যাবহার করে থাকি। AND কিওয়ার্ডটি যেহেতু শর্তের মধ্যে সংযোগ স্থাপন করে, তাই আমাদের SELECT স্ট্যাট্মেন্ট এর মূল স্ট্রাকচারে WHERE  এর পরে এটি দিয়ে শর্তগুলোকে একসাথে লিখে কুয়েরী রান করাতে পারি। তাহলে নতুন স্ট্রাকচার হবে,
 
select column_names from table_name where a_condition and b_condition;


এভাবে আপনার যত ইচ্ছা তত কন্ডিশন যুক্ত করতে পারবেন AND দিয়ে।

OR

আগে ভাবুনতো একবার আমরা AND এর ক্ষেত্রে কি করেছি? আমরা এমন ডেটা দেখেছি যারা অনেকগুলো শর্ত পূরণ করে। কিন্তু এবার কোন কারণে আপনি জানতে চাচ্ছেন অনেকগুলো শর্তের মধ্যে অন্তত একটা শর্ত পূরণ করে এমন কেও আছে কিনা। অর্থাৎ কেও যদি সব শর্ত পূরণ করে তাহলেও থাকবে, নতুবা অন্তত একটা শর্তও যদি পূরণ করে তাদের ডেটাও দেখবো আমরা। তবে যারা একটা শর্তও পূরণ করে না তাদের ডেটা দেখবো না আমরা। আমরা জানতে চাচ্ছি আমাদের টেবিলে এমন কারা আছে, যারা হয় Detective নয়তো Actor অথবা যাদের salary ২৫০০০। তাহলে আমরা আগের মতোই পুরো কুয়েরীটা সহযে করতে পারি। কিন্তু এবার যেহেতু অথবা আছে, অর্থাৎ একটা শর্ত পূরণ করলেই আমরা তাদের ডেটা দেখবো, তাই এবার আমরা AND এর জায়গায় OR দিলেই হবে। আমি এই কুয়েরীটা আপনার উপর ছেড়ে দিচ্ছি। 

Hints: কন্ডিশনগুলোর জায়গায় ঠিকমতো আপনার শর্তগুলো লিখুন আর AND এর জায়গায় OR লিখুন। খেয়াল করুন এবার শর্ত যেহেতু ৩টি, তাই আপনার ২বার OR লিখা লাগবে।

IN 

একটু আগে আমরা কুয়েরী করার সময় একই কলামের দুইরকমের ভ্যালুর উপর কন্ডিশন যোগ করেছি। আমরা জানতে চেয়েছি কাদের rank হয় Detective নাহয় Actor। এখানে আমরা মাত্র ২টা ভ্যালু ব্যাবহার করেছি। কিন্তু ধরুন কোন এক অজানা কারণে আমরা চাচ্ছি শুধু Detective বা Actor নয়, সাথে যারা superstaar, folgach বা আরো এরকম কয়েকটা ভ্যালুর সাথে মিলে এমন মানুষের ডেটা দেখতে। খেয়াল করুন, আমরা চাচ্ছি  একটা কলামের ভ্যালুর, একসেট ভ্যালুর মধ্যে যেকোন একটার সাথে যদি মিলবে তাদের ডেটা দেখতে। এক্ষেত্রে আমরা বারবার OR কন্ডিশন ব্যাবহার করতে পারি, তবে সেটা কষ্টসাধ্য ও অনেক সময় এর ব্যাপার। কারণ ১০০০টি ভ্যালুর সাথে যদি মিল রেখে আমি কুয়েরী করতে যাই, তাহলে ৯৯৯ বার আমাদের OR দিয়ে একই কন্ডিশন লিখা লাগবে। এই কষ্টলাগভের জন্যই IN কিওয়ার্ডের ব্যাবহার করা হয়। আমরা একসেট ভ্যালু দিয়ে বলবো যদি কলামের ভ্যালু এই সেটের মধ্যে যেকোন একটা হয়, তাহলে আমরা সেই রেকর্ডের ডেটা দেখব। স্ট্রাকচার দেখলে ব্যাপারটা আরো সহজ হয়ে যাবে।

select column_names from table_name where column_name in (value1 , value2, value3); 

অর্থাৎ প্রথমে আমরা আগের মতোই সব লিখবো তবে এবার একই কলামের অনেকগুলো ভ্যালুর ক্ষেত্রে আমরা in লিখে প্রথম বন্ধনীর মধ্যে সেই ভ্যালুগুলো লিখবো যেগুলোর সাথে মিল রেখে আমরা ডেটা গুলো দেখতে চাই। তাহলে আমরা ফাইনাল কুয়েরীটা হবে অনেকটা এইরকমঃ


খেয়াল করে দেখুন আমাদের এখানে ভ্যালু 'detective' লেখার পরেও আউটপুটে কোন Detective এর রেকর্ড বা রো দেখাচ্ছে না। এর কারণ PostgreSQL কেস সেন্সিটিভ না। তবে এর ভ্যালুগুলো কেস সেন্সিটিভ। তাই ভ্যালুগুলো এক্সাক্টলি বা ঠিক হুবুহু না মিললে আমাদের আউটপুট হিসেবে তা দেখাবে না।

LIKE 

LIKE এর বাংলা অর্থ মতো। অর্থাৎ কোনকিছু হুবুহু একরকম হতেও পারে আবার নাও হতে পারে এমন বুঝাতে LIKE ব্যাবহার করা হয়। এর জন্য ২টা আরো ছোট ছোট জিনিস শিখতে হবে। প্রথমে একটু জেনে নেই, এরপরে কুয়েরী করলে সব পানির মতো পরিষ্কার হয়ে যাবে।
  • '%' - এর মানে হলো শুন্য বা কিছু ক্যারেক্টার। অর্থাৎ কোন ক্যারেক্টার থাকতেও পারে, আবার নাও থাকতে পারে। থাকলে সেটা এক বা একাধিকও হতে পারে।
  • '_' আন্ডারস্কোর দিয়ে বুঝানো হয় শুধু মাত্র একটি ক্যারেক্টার। মানে ঠিক একটা ক্যারেক্টার আছে এমন বুঝাতে আন্ডারস্কোর দেয়া হয়।
এবার আসুন। আমরা বুঝি এগুলোর মানে আসলে কি। ধরুন আমি জানতে চাচ্ছি আমার ডেটাবেজ টেবিলে এমন কারা আছে যাদের rank এর মাঝে কিছু ক্যারেক্টার থাকতেও পারে বা নাও থাকতে পারে তবে শেষ 'r' দিয়ে। অর্থায় rank এর ভ্যালু দেখতে এমন হবে যে প্রথমে শূন্য বা এক বা একাধিক লেটার থাকবে তবে শেষে শুধু 'r' থাকবে। ব্যাপারটাকে SQL  এর মতো করে লিখলে হবে '%r'। একটু বুঝতে কষ্ট হলে উপরের কয়েকটা লাইন আবার পড়ুন। তাহলে বুঝবেন। '%r' - এই অংশটা দিয়ে আমরা বুঝাবো কেমন দেখতে হবে। অর্থাৎ একটা ব্যাসিক বৈশিষ্ট্য বলে দিবো। তারপর শর্তে যোগ করে দিবো যাদের অমুক কলামের ভ্যালু দেখতে এইরকম, তাদের ডেটা আমাকে আউটপুটে দেখাও। স্ট্রাকচারটা হবে অনেকটা এরকমঃ

SELECT column_names FROM table_name WHERE column_name LIKE 'Basic structure';

যদি কুয়েরী করে দেখি তাহলে আউটপুটগুলোতে আমরা দেখতে পাবো ঠিক সেই সকল রেকর্ড দেখতে পাচ্ছি যাদের rank এর শেষে 'r' আছে।


আমরা যদি আরো মডিফাইড ভ্যালু দেখতে চাই, তাহলে তাও দেখতে পারবো। মনে রাখবেন LIKE কিওয়ার্ড দিয়ে আপনি যেইরকম খুশী সেইরকম কুয়েরী করতে পারবেন। এই যেমন ধরেন আপনি চান দেখতে কাদের ফার্স্ট নেম এর দ্বিতীয় লেটার 'a' এবং তৃতীয় ও চতুর্থ লেটার অন্য যেকোন কিছু এবং পঞ্চম লেটার 's' এবং এর পরে কোন লেটার থাকতেও পারে আবার নাও থাকতে পারে। খুব সহজ করে ভাবুন এখানে ব্যাসিক স্ট্রাকচারটা দেখতে কেমন হবে। এর জন্য আমরা ধাপে ধাপে যাই। 
  1. যেহেতু শর্ত শুরুই হয়েছে দ্বিতীয় বর্ণ থেকে, তাই বলা যায় প্রথম লেটার বা বর্ণ যেকোন কিছু  হতে পারে। আর যেহেতু সেকেন্ড লেটারের আগে একটি বর্ণই থাকতে পারে তাহলে আমাদের প্রথম স্ট্রাকচাত হবে এমন দেখতে, '_a'।
  2. তৃতীয় আর চতুর্থ লেটার যেকোন কিছু হতে পারে। তবে পঞ্চম লেটার আবার 's' হবে। এখানে যদি আমরা '_a%' লিখি তাহলে বুঝাবে a এর পরে অনেকগুলো বর্ণ থাকতে পারে। কিন্তু সেটা আমাদের শর্ত নয়। শর্তানুসারে a এর পরে ঠিক ২টি বর্ণ এবং এর পরে s থাকবে। তাই আমরা দুটি আন্ডারস্কোর ব্যাবহার করে এরপরে s লিখলেই হয়ে যাবে। অর্থাৎ এবার আমাদের স্ট্রাকচারটা হবে  '_a__s'
  3. এরপরের শর্ত আশা করি সহজেই ধরতে পারবেন। যেহেতু বলেই দিয়েছে থাকতেও পারে আবার নাও থাকতে পারে, তাই আমরা % সাইন ব্যাবহার করলেই হচ্ছে। অর্থাৎ আমাদের ফাইনাল স্ট্রাকচার দাড়াচ্ছে, '_a__s%'

 ব্যাপারটা সহজ নাহ? এবার আমি একটা চ্যালেঞ্জ ছুড়ে দিচ্ছি। আমি আশাবাদি এই চ্যালেঞ্জে আপনি খুব সহজেই জয়লাভ করবেন। কুয়েরী করে বের করুন তো, ঠিক কারা কারা email হিসবে gmail এর একাউন্ট ব্যাবহার করে।

NOT 

সাধারণত AND এবং OR এর পরেই NOT শিখে ফেলে অনেকে। তবে আমি মনে করি LIKE শিখার পরে NOT শিখলে সবথেকে বেশি বুঝা যায় এর ব্যাবহার। আপনি যদি একটু আগে কারা কারা gmail ব্যাবহার করেছে তা বের করতে পারেন তাহলে এবার যদি আমরা জানতে চাই কারা কারা জিমেইল ব্যাবহার করে না তাদের ডেটা দেখতে? বা আমরা যদি যাই কাদের salary ১৫০০০ থেকে ২১০০০ এর মধ্যে নয়। কিংবা আমরা যদি দেখতে চাই কাদের rank, Detective এবং Actor নয়। আমরা যদি এটা বের করতে পারি যে কারা gmail ব্যাবহার করে, তাহলে আমরা এটাও জানতে পারবো কারা তা ব্যাবহার করে না। এর জন্য শুধু আমাদের সাধারণ ভাষার মতো NOT ব্যাবহার করলেই হবে। ব্যাসিক স্ট্রাকচার সবগুলো কন্ডিশনের মতোই হুবুহু তবে এক্ষেত্রে শুধু মূল কিওয়ার্ডের আগে আমরা একটি NOT যুক্ত করে দিবো। যেমনঃ

SELECT column_names FROM table_name WHERE column_name NOT LIKE 'Basic structure';

select column_names from table_name where condition_column NOT between first_value and last_value ;

select column_names from table_name where column_name NOT in (value1 , value2, value3);

এবার আমি কুয়েরী করে দেখাচ্ছি না। আমি আপনার উপর বিশ্বাস রেখে কুয়েরী করার দায়িত্ব আপনার উপর ছেড়ে দিচ্ছি। আপনি এখন নিজেই সবগুলো কুয়েরী করতে পারবেন।

IS NULL

মনে আছে? আমি প্রথমে যে বলেছিলাম একটি বা কয়েকটি কলামের ভ্যালু NULL রাখতে। এবার আপনি একটু চেক করুন তো কোন কোন রেকর্ডের rank অথবা email অথবা salary এর ভ্যালু NULL। এক্ষেত্রে কলাম নেম  '=' দিয়ে NULL লিখে স্ট্যাট্মেন্ট চালান। রেজাল্টগুলো আপাতত একটা স্ক্রিনশট দিয়ে রাখুন। এবার আপনি '=' জায়গায় IS লিখুন আর কুয়েরী রান করান। কি দেখলেন? অনেক তফাৎ নাহ? এর কারণ জানার দায়ীত্ব আপনার। ইন্টারনেট থেকে বের করুন কেন এরকম হলো। তার আগে আপাতত আমরা একটু NULL  কি তা জেনে নেই।

NULL  মানে অনেকেই মনে করতে পারেন এটি একটি স্ট্রিং ভ্যালু। আবার অনেকে মনে করতে পারেন এটি একটি ব্ল্যাঙ্ক স্পেস। আবার অনেকে মনে করতে পারেন এটির মান মনে হয় শূন্য। কিন্তু আসলে এগুলোর কোনটিই শূন্য নয়। NULL  মানে NULL। এর কোন ভ্যালু নেই। একে অনেক সময় এম্পটি ভ্যালু হিসবে উল্লেখ করা হয়। যদি এমন হয় কোন ফিল্ডের ভ্যালু আপনি ব্ল্যাঙ্ক রাখেন, তাহলে সেখানে NULL ভ্যালু আছে বলে ধরে নেয়া হয়। আর কোন কলামের ভ্যালু NULL কিনা তা চেক করার জন্য আমরা IS NULL ব্যাবহার করি। ব্যাসিক স্ট্রাকচারটা এমন,

select column_names from table_name where column_name IS NULL;

Bonus Part: IS NULL স্থানে IS NOT NULL ব্যাবহার করে দেখুন আউটপুট কি হয়।

Where এর পরে কন্ডিশন হিসবে সাধারণত যেসব কিওয়ার্ড ব্যাবহার করা হয় তা শিখা শেষ। ছোট ছোট কয়েকটা আরো কিওয়ার্ড আছে, যা আমরা পরবর্তীতে শিখবো।

DISTINCT 

আমি জানি না আপনি খেয়াল করেছেন কিনা, আমার ডেটাবেজ টেবিলে আমি 'James' নামে কয়েকজনের ডেটা রেখেছি। এভাবে আমাদের ডেটাবেজ টেবিলে একই নামে বা একই র‍্যাঙ্কের বা একই ভ্যালু অনেকের থাকতে পারে। যেমন অনেকের rank একই। কিন্তু আমরা চাচ্ছি একই নাম বা ভ্যালু বারবার দেখতে না। অর্থাৎ আমরা কোন কলামের ইউনিক ভ্যালুগুলো দেখতে চাচ্ছি। এর জন্য DISTINCT কিওয়ার্ড ব্যাবহার করা হয়। ব্যাসিক স্ট্রাকচারটা খুবই সহজ,

SELECT DISTINCT column_name FROM table_name



ধরুন আমরা জানতে চাচ্ছি কি কি rank এর রেকর্ড আছে আমাদের ডেটাবেজে। তাহলে আমরা কুয়েরী এভাবে চালাতে পারি,
select DISTINCT rank from "Testing";

Bonus Part: আপনি চাইলেই DISTINCT ব্যাবহার করার পর অন্যান্য কলাম বা একই কলামের উপর WHERE  কিওয়ার্ড দিয়ে শর্ত যুক্ত করে দিতে পারেন। 

ARITHMATIC Operators (+, -, *, /)

ধরুন আপনি ডেটা ইন্সার্ট করার সময় স্যালারি বাদেও একটা কলাম রাখলেন যেটা হলো স্যালারির উপর অতিরিক্ত ১০০০ টাকা বোনাস। অর্থাৎ প্রতিবার যখন ইন্সার্ট করতে যাবেন, আপনার স্যালারির সাথে বারবার ১০০০ টাকা যোগ করে তারপর ইন্সার্ট করা হবে। আবার অনেক সময় আরো কিছু জটিল হিসেব করে ভ্যালু এড করা লাগতে পারে। কিন্তু প্রত্যেক রেকর্ডের ক্ষেত্রে সেগুলো বের করে আবার ইডিট করাটা কষ্টসাধ্য। তাই আমরা প্রয়োজন অনুযায়ী ডেটাবেজ থেকে যখন লাগবে তখন হিসেব করে দেখে নিতে চাই। আর হিসবেটাও একবার করতে চাই। এর জন্য আমরা সহজেই এরিথমেটিক অপারেটরের সাহায্য নিতে পারি। এর ফলে আমাদের আরেকটি অতিরিক্ত কলামে আমাদের সেই হিসেব অনুযায়ী ডেটাগুলো দেখাবে। তবে এটি ডেটাবেজে কোন আলাদা কলাম তৈরি করবে না। ধরুন আমি দেখতে চাচ্ছি  প্রত্যেকের স্যালারির সাথে ১০০০ যোগ করার পর কত আসে, তাহলে কুয়েরীটা এইভাবে চালাতে পারি,

আশা করি ব্যাসিক স্ট্রাকচারটা এবার নিজেই পারবেন। খেয়াল করে দেখুন এখানে আমাদের নতুন কলামের নাম নেই বলে দুপাশে দুটি '?' চিহ্ন দিয়ে বুঝিয়ে দিচ্ছে কলামের নাম নেই। আপনার কাজ হলো এই কলামটিকে 'Salary+Bonus ' নামে দেখানো এবং সেখানে salary এবং এর ১০% যোগ করে দেখানো। আশা করি সহজেই করতে পারবেন। এভাবে আপনি চাইলে একসাথে একাধিক অপারেটর ব্যাবহার করতে পারেন।

CONCATE

আমাদের ডেটাবেজে প্রতিটা রেকর্ডের first_name  এবং last_name আছে। আমরা যদি দুটো কলাম আউটুপুটে দেখি তাহলে তা আলাদা আলাদা কলামে থাকে। মাঝে মাঝে ডেটাগুলোকে আরো সুন্দর করে প্রকাশ করার প্রয়োজন হয়। যেমন, আমরা চাই আমাদের এখানে first_name  এবং last_name আলাদা আলাদা কলামে না দেখিয়ে একই কলামে এবং একসাথে দেখাতে। এর জন্য সিন্ট্যাক্স ২ উপায়ে লেখা যায়।
  • ||
  • CONCATE()
প্রথমটা মোটামুটি সব SQL এই একইভাবে ব্যাবহার করা হয়। এর দুই পাশে কলাম নেম লিখা হয়। যদি সহজ ভাষায় বুঝতে চাই, তাহলে || দিয়ে আমরা দুটো ভ্যালু যুক্ত করি একটি কলামে। এখানে আমরা চাইলে নিজেদের মতো ভ্যালুও যুক্ত করতে পারি। কুয়েরী হবে অনেকটা এমন,


এখানে একটা সমস্যা হয়ে দাড়িয়েছে। আমরা চাই first_name এবং last_name এর মাধে গ্যাপ থাকুক। কিন্তু আমি আগেই বলেছি, চাইলে আমি নিজের মনমতোও ভ্যালু দিতে পারবো, তাই নতুন কুয়েরীটি হবে,


মনে রাখবেন, আপনি নম্বর ভ্যালু দিতে চাইলে কোটেশন ছাড়া দিলেও হবে। তবে স্ট্রিং ভ্যালু দিতে চাইলে অবশ্যই কোটেশন দিয়ে এরপর ভ্যালু দিতে হবে। 

অন্যদিকে CONCATE() টি একই কাজ করে। তবে এক্ষেত্রে স্ট্রাকচারটা একটু অন্যরকম, এক্ষেত্রে CONCATE এর পরে যেই প্রথম বন্ধনী আছে, সেখানে কমা দিয়ে দিয়ে ভ্যালুগুলো লিখা লাগবে। একই কুয়েরী CONCATE দিয়ে করলে অনেকটা এমন হবে, 

select CONCAT(first_name,' ',last_name) from "Testing";

এবার আপনার কাজ হলো আপনি একটি কলামেই প্রতেকের র‍্যাঙ্ক এবং র‍্যাংকের ঠিক পরেই তাদের ফুল নেম লিখবেন। যেমনঃ "Detective James Bond"।

ORDER BY

আমরা যখন কুয়েরী করি, আমরা যে সবসময় একই ফরমেটে ডেটা দেখতে চাই এমন নাও হতে পারে। যেমন হঠাত যদি আমরা সবার ডেটা দেখতে চাই তবে সেখানে যার স্যালারি সবথেকে কম সে আগে, এবং এর পরে যার কম সে এবং এইভাবে যার স্যালারি সবথেকে বেশি, সে সবার পরে থাকবে, তাহলে তাও সহজেই PostgreSQL এর সাহায্যে করা যায়। ব্যাপারটাকে বলা হয় সর্টিং বা সাজানো। সাজানো দুইরকম হতে পারে, হয় ছোট থেকে বড়। আর না হয় বড় থেকে ছোট। এখানে বুঝতে হবে আমরা কোন কলামের উপর সর্ট করতে চাচ্ছি। ব্যাসিক স্ট্রাকচারটা হবে এমন,

select column_names from table_name ORDER BY column_name;

কুয়েরীটা আশা করি এবার সহজেই করতে পারবেন।


খেয়াল করুন আমাদের এখানে সর্বনিন্ম স্যালারি ২১০০ তাই ২১০০ সবার উপরে। আবার এখানে ২১০০ অনেকেই আছে। সবাইই পরবর্তী স্যালারির আগেই রয়েছে। অর্থাৎ স্যালারি কম থেকে বেশি অনুযায়ী সাজানো হয়েছে। কিন্তু সবসময় যে আমরা ছোট থেকে বড় আকারে সাজাবো এমনটা নাও হতে পারে। আমরা বড় থেকে ছোট সাজাতে চাইতে পারি। এবং এটাও সম্ভব। বাই ডিফল্ট PostgreSQL ছোট থেকে বড় সাজিয়ে দেয়। কিন্তু আমরা যদি বড় থেকে ছোট সাজাতে চাই, তাহলে কলাম নেমের DESC (ডিসেন্ডিং) লিখলেই তা বড় থেকে ছোট আকারে সাজিয়ে দিবে।

Bonus Part 1: আপনি চাইলে DESC এর জায়গায় ASC লিখে দেখতে পারেন। কি আউটপুট দেখায় তা দেখে নিজেই বুঝতে পারবেন এর মানে কি।

Bonus Part 2: ORDER BY দিয়ে আপনি কেবল  একটি কলামের উপর সর্ট করতে পারবেন, ব্যাপারটি এমন নয়। আপনি চাইলে একসাথে অনেকগুলো কলামের উপর বেস করে সর্ট করতে পারেন। ব্যাপারটা এমন যে অনেকের স্যালারি ২১০০। কিন্তু আমি চাচ্ছি যার সিরিয়াল নম্বর আগে, তার ডেটা আগে দেখাবে। তাহলে আমার প্রথমে লাগবে স্যালারি কলামের উপর সর্ট। এরপর সিরিয়াল কলামের উপর। এইভাবে যখন একাধিক কলামের উপর সর্ট করা লাগবে, তখন ORDER BY প্রত্যেকটা কলামের নাম কমা দিয়ে দিয়ে লিখলেই হবে। এক্ষেত্রে ORDER BY এর পর যেই কলামের নাম আগে আসবে, সে কলামের প্রায়োরিটি আগে পাবে। অর্থাৎ আমরা আগে আগে স্যালারি সর্ট করতে চাচ্ছি, এরপর যদি অনেকের স্যালারি এক হয়, তাহলে তাদের সিরিয়াল নম্বরের উপর ভিত্তি করে সর্ট করে চাচ্ছি। তাই আগে স্যালারি লিখবো এবং এর পরে সিরিয়াল নম্বর।

Bonus Part 3: অনেকগুলো কলামের উপর ভিত্তি যেমন সর্ট করতে পারি, ঠিক তেমনি প্রত্যেকটা কলামের আলাদা আলাদা ছোট থেকে বড় কিংবা বড় থেকে ছোট শর্ত দিয়েও সর্ট করতে পারি। নিচের কুয়েরীটি রান করানোর পর আউটপুট ভালোভাবে লক্ষ করুন।

select serial_no, first_name, salary from "Testing" order by salary DESC, serial_no ASC;

Bonus Part 4: আমরা চাইলে আগে কিছু শর্ত দিয়েও সর্ট করতে পারি। এক্ষেত্রে আগের মতোই WHERE  স্ট্যাট্মেন্ট ব্যাবহার করবো, এবং তারপর order by ব্যাবহার করবো।

SELECT column_names FROM table_name WHERE condition ORDER BY column_name;


Episode Bonus

pgadmin বামপাশের সাইডবার থেকে আমাদের টেবিলনেমের উপর রাইট ক্লিক করলে সবার শেষে Properties এ ক্লিক করলে আমরা আমাদের পুরো টেবিলের সব ইনফোরমেশন পেয়ে যাবো। এবার সেখানে উপর থেকে Columns এ ক্লিক করলে আমাদের কলামগুলোর স্ট্রাকচার বা ইনফরমেশন পেয়ে যাবো। এখান থেকে আমরা চাইলে আমাদের কলামগুলোর ডেটাটাইপ বা বিভিন্ন পরিবর্তনও করতে পারবো। এইযে আমরা টেবিলের ইনফরমেশনগুলো দেখলাম, এটা হলো Table Describing। এইটা দেখার আরো কয়েকটা উপায় আছে, কমান্ড লাইন তার মধ্যে অন্যতম। তবে কমান্ড লাইনের ব্যাপারটা নিয়ে পরের পর্বে আলোচনা করা যাবে। আপাতত একটি কুয়েরীর সাহায্যে এটা সহজে কিভাবে দেখতে পারবে।


আজ এখানেই থাকুক। আপনাদের একটা ছোট কাজ দেই, আপনি স্যালারির উপর সর্ট করে একটি কলামে প্রত্যেকটা ডেটা দেখান যেখানে সবার লাস্টনেমের সেকেন্ড লাস্ট লেটার 's'। কিন্তু কলামে ডেটাগুলো দেখাবে একটা লাইন। লাইনের একটা উদাহরণ হলো এমন,

Detective Sherlock Holmes earns 25000 dollar each month with 2500 dollar bonus from email marketing by sh221b@gmail.com.

এখানেই পর্ব ২ এর সমাপ্তি দিচ্ছি। তবে আপনারা এখানেই থেমে থাকবেন না। ইন্টারনেট থেকে আরো আরো রিসোর্স খুঁজে বের করুন ও বুঝা শুরু করুন। শিখতে থাকুন। আর এই ব্লগের ফিডব্যাক দিতে পারেন কমেন্ট বা ইমেইলের মাধ্যমে।

চাইলে আমার ব্লগটির ইমেইল সাবস্ক্রিবশন করতে পারেন ফ্রি। এতে আমার ব্লগ প্রকাশ পাওয়া মাত্রই আপনি ইমেইল পেয়ে যাবেন। আর এই পর্ব থেকে যদি কিছু শিখতে পারেন এবং আরো অন্য কিছু সম্পর্কে টিউটরিয়াল চান, তাহলে কমেন্ট অথবা ইমেইলে জানাতে ভুলবেন না। 

আর হ্যা, কমেন্টে ফিডব্যাক দিলে খুবই খুশী হবো। কোন একদিন আমি আমার ব্লগের কমেন্টকারীদের নিয়ে আড্ডা দিবো - এটি একটি স্বপ্ন আমার।

যদি Life of Loco সম্পর্কে জানতে চান, তাহলে এই লিঙ্কে গিয়ে জানতে পারেন।

ভালো থাকবেন, ভালো রাখবেন।

প্রথম পর্ব এখান থেকে দেখতে পারেন।

 

Brainless Loco

1 টি মন্তব্য:

Hello there! If you have read any of my blogs, please feel free to give me feedbacks via comments or message. This'll really help me to to improve.
Please don't share any spam via comments.