মাইএসকিউএল এবং মারিয়াডিবির বেশ কয়েকটি কার্যাদি কীভাবে ব্যবহার করবেন তা শিখুন - পার্ট 2


এটি মারিয়াডিবি/মাইএসকিউএল কমান্ডগুলির প্রয়োজনীয়তা সম্পর্কে 2-নিবন্ধের সিরিজের দ্বিতীয় অংশ। এগিয়ে যাওয়ার আগে দয়া করে এই বিষয়টিতে আমাদের আগের নিবন্ধটি দেখুন।

  1. নতুনদের জন্য মাইএসকিউএল/মারিয়াডিবি বুনিয়াদি শিখুন - অংশ 1

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

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

শুরু করতে, দয়া করে এই পদক্ষেপগুলি অনুসরণ করুন:

1. কর্মচারী নমুনা ডাটাবেস ডাউনলোড করুন, এতে মোট ৪ মিলিয়ন রেকর্ডের সমন্বয়ে ছয়টি সারণী অন্তর্ভুক্ত রয়েছে।

# wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2
# tar xjf employees_db-full-1.0.6.tar.bz2
# cd employees_db

২. মারিয়াডিবি প্রম্পট লিখুন এবং কর্মচারী নামের একটি ডাটাবেস তৈরি করুন:

# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE employees;
Query OK, 1 row affected (0.00 sec)

৩. এটি আপনার মারিয়াডিবি সার্ভারে নিম্নরূপে আমদানি করুন:

MariaDB [(none)]> source employees.sql

নমুনা ডাটাবেসটি লোড না হওয়া পর্যন্ত 1-2 মিনিট অপেক্ষা করুন (মনে রাখবেন আমরা এখানে 4M রেকর্ডের কথা বলছি!)।

৪. ডাটাবেসটির সারণি তালিকাভুক্ত করে সঠিকভাবে আমদানি করা হয়েছে তা যাচাই করুন:

MariaDB [employees]> USE employees;
Database changed
MariaDB [employees]> SHOW TABLES;
+---------------------+
| Tables_in_employees |
+---------------------+
| departments         |
| dept_emp            |
| dept_manager        |
| employees           |
| salaries            |
| titles              |
+---------------------+
6 rows in set (0.02 sec)

৫) কর্মীদের ডাটাবেসের সাথে ব্যবহার করার জন্য একটি বিশেষ অ্যাকাউন্ট তৈরি করুন (অন্য অ্যাকাউন্টের নাম এবং পাসওয়ার্ড চয়ন করতে নির্দ্বিধায়):

MariaDB [employees]> CREATE USER [email  IDENTIFIED BY 'empadminpass';
Query OK, 0 rows affected (0.03 sec)

MariaDB [employees]> GRANT ALL PRIVILEGES ON  employees.* to [email ;
Query OK, 0 rows affected (0.02 sec)

MariaDB [employees]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [employees]> exit
Bye

এখন মারিএডবি প্রম্পটে এমপ্যাডমিন ব্যবহারকারী হিসাবে লগইন করুন।

# mysql -u empadmin -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> USE employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

উপরের চিত্রে বর্ণিত সমস্ত পদক্ষেপ এগিয়ে যাওয়ার আগে নিশ্চিত হয়ে গেছে।

বেতন সারণীতে শুরুর এবং শেষের তারিখ সহ প্রতিটি কর্মীর সমস্ত আয় থাকে। আমরা সময়ের সাথে এমপ_না = 10001 এর বেতনগুলি দেখতে চাই। এটি নিম্নলিখিত প্রশ্নের উত্তর দিতে সহায়তা করবে:

  1. তিনি কি কোনও উত্থাপন পেয়েছেন?
  2. যদি তাই হয় তবে কখন?

নিম্নলিখিত কোয়েরিটি নির্বাহ করুন:

MariaDB [employees]> SELECT * FROM salaries WHERE emp_no=10001 ORDER BY from_date;
+--------+--------+------------+------------+
| emp_no | salary | from_date  | to_date    |
+--------+--------+------------+------------+
|  10001 |  60117 | 1986-06-26 | 1987-06-26 |
|  10001 |  62102 | 1987-06-26 | 1988-06-25 |
|  10001 |  66074 | 1988-06-25 | 1989-06-25 |
|  10001 |  66596 | 1989-06-25 | 1990-06-25 |
|  10001 |  66961 | 1990-06-25 | 1991-06-25 |
|  10001 |  71046 | 1991-06-25 | 1992-06-24 |
|  10001 |  74333 | 1992-06-24 | 1993-06-24 |
|  10001 |  75286 | 1993-06-24 | 1994-06-24 |
|  10001 |  75994 | 1994-06-24 | 1995-06-24 |
|  10001 |  76884 | 1995-06-24 | 1996-06-23 |
|  10001 |  80013 | 1996-06-23 | 1997-06-23 |
|  10001 |  81025 | 1997-06-23 | 1998-06-23 |
|  10001 |  81097 | 1998-06-23 | 1999-06-23 |
|  10001 |  84917 | 1999-06-23 | 2000-06-22 |
|  10001 |  85112 | 2000-06-22 | 2001-06-22 |
|  10001 |  85097 | 2001-06-22 | 2002-06-22 |
|  10001 |  88958 | 2002-06-22 | 9999-01-01 |
+--------+--------+------------+------------+
17 rows in set (0.03 sec)

এখন যদি আমাদের সর্বশেষ 5 টি উত্থানগুলি দেখার দরকার হয়? আমরা_সামান্য DESC এর মাধ্যমে অর্ডার করতে পারি। ডিইএসসি কীওয়ার্ডটি ইঙ্গিত দেয় যে আমরা ফলাফলকে সাজানো ক্রম অনুসারে বাছাই করতে চাই।

অতিরিক্তভাবে, সীমাবদ্ধ 5 আমাদের ফলাফল সেটে শীর্ষস্থানীয় 5 টি সারি ফিরিয়ে আনার অনুমতি দেয়:

MariaDB [employees]> SELECT * FROM salaries WHERE emp_no=10001 ORDER BY from_date DESC LIMIT 5;
+--------+--------+------------+------------+
| emp_no | salary | from_date  | to_date    |
+--------+--------+------------+------------+
|  10001 |  88958 | 2002-06-22 | 9999-01-01 |
|  10001 |  85097 | 2001-06-22 | 2002-06-22 |
|  10001 |  85112 | 2000-06-22 | 2001-06-22 |
|  10001 |  84917 | 1999-06-23 | 2000-06-22 |
|  10001 |  81097 | 1998-06-23 | 1999-06-23 |
+--------+--------+------------+------------+
5 rows in set (0.00 sec)

আপনি একাধিক ক্ষেত্রের সাথে অর্ডার বাই ব্যবহার করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারী ক্রমবর্ধমান আকারে (ডিফল্ট) এবং তারপরে বর্ণানুক্রমিক উত্থানের আকারে সর্বশেষ নাম দ্বারা কর্মচারীর জন্ম তারিখের উপর ভিত্তি করে ফলাফল সেট অর্ডার করবে:

MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, gender AS Gender,  hire_date AS "Hire date" FROM employees ORDER BY birth_date, last_name DESC LIMIT 10;
+--------------------+--------+------------+
| Name               | Gender | Hire date  |
+--------------------+--------+------------+
| Whitcomb, Kiyokazu | M      | 1988-07-26 |
| Schaad, Ronghao    | M      | 1988-07-10 |
| Remmele, Supot     | M      | 1989-01-27 |
| Pocchiola, Jouni   | M      | 1985-03-10 |
| Kuzuoka, Eishiro   | M      | 1992-02-12 |
| Decaestecker, Moni | M      | 1986-10-06 |
| Wiegley, Mircea    | M      | 1985-07-18 |
| Vendrig, Sachar    | M      | 1985-11-04 |
| Tsukuda, Cedric    | F      | 1993-12-12 |
| Tischendorf, Percy | M      | 1986-11-10 |
+--------------------+--------+------------+
10 rows in set (0.31 sec)

আপনি এখানে সীমাবদ্ধতা সম্পর্কে আরও তথ্য দেখতে পারেন।

যেমনটি আমরা আগেই উল্লেখ করেছি, বেতন সারণীতে প্রতিটি কর্মচারীর সময়ের সাথে আয় রয়েছে। সীমাবদ্ধতার পাশাপাশি, সর্বাধিক এবং ন্যূনতম সংখ্যক কর্মী নিয়োগ করা হয়েছিল তা নির্ধারণ করতে আমরা MAX এবং MIN কীওয়ার্ড ব্যবহার করতে পারি:

MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, MAX(B.salary) AS "Max. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
+-----------------+-------------+
| Name            | Max. salary |
+-----------------+-------------+
| Facello, Georgi |       88958 |
| Simmel, Bezalel |       72527 |
| Bamford, Parto  |       43699 |
+-----------------+-------------+
3 rows in set (0.02 sec)

MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, MIN(B.salary) AS "Min. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
+-----------------+-------------+
| Name            | Min. salary |
+-----------------+-------------+
| Facello, Georgi |       60117 |
| Simmel, Bezalel |       65828 |
| Bamford, Parto  |       40006 |
+-----------------+-------------+
3 rows in set (0.00 sec)

উপরের ফলাফল সেটগুলির উপর ভিত্তি করে, আপনি কি অনুমান করতে পারেন যে নীচের কোয়েরিটি কী ফিরে আসবে?

MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, ROUND(AVG(B.salary), 2) AS "Avg. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
+-----------------+-------------+
| Name            | Avg. salary |
+-----------------+-------------+
| Facello, Georgi |    75388.94 |
| Simmel, Bezalel |    68854.50 |
| Bamford, Parto  |    43030.29 |
+-----------------+-------------+
3 rows in set (0.01 sec)

আপনি যদি সম্মত হন যে এটি সময়ের সাথে গড় (এভিজি দ্বারা নির্ধারিত) বেতন 2 দশমিক (রাউন্ড দ্বারা নির্দেশিত) গোল করা হবে, আপনি ঠিক বলেছেন।

যদি আমরা কর্মচারী দ্বারা গোষ্ঠীভুক্ত বেতনের সমষ্টি দেখতে এবং শীর্ষ 5 টি ফিরে পেতে চাই তবে আমরা নীচের প্রশ্নটি ব্যবহার করতে পারি:

MariaDB [employees]> SELECT emp_no, SUM(salary) AS Salary FROM salaries GROUP BY emp_no ORDER BY Salary DESC LIMIT 5;
+--------+---------+
| emp_no | Salary  |
+--------+---------+
| 109334 | 2553036 |
|  43624 | 2492873 |
|  66793 | 2383923 |
| 237542 | 2381119 |
|  47978 | 2374024 |
+--------+---------+
5 rows in set (2.22 sec)

উপরের প্রশ্নে বেতনগুলি কর্মচারী দ্বারা গোষ্ঠীভুক্ত হয় এবং তারপরে যোগফলটি সম্পাদিত হয়।

ভাগ্যক্রমে, একটি প্রতিবেদন তৈরি করার জন্য আমাদের ক্যোয়ারির পরে ক্যোয়ারি চালানোর দরকার নেই। পরিবর্তে, সমস্ত প্রয়োজনীয় ফলাফল সেটগুলি ফেরত দেওয়ার জন্য আমরা এসকিউএল কমান্ডগুলির একটি সিরিজ সহ একটি স্ক্রিপ্ট তৈরি করতে পারি।

একবার আমরা স্ক্রিপ্টটি কার্যকর করি, এটি আমাদের পক্ষে আরও হস্তক্ষেপ ছাড়াই প্রয়োজনীয় তথ্য ফিরিয়ে দেবে। উদাহরণস্বরূপ, চলুন চলমান ডিরেক্টরি ডিরেক্টরিতে নিম্নলিখিত বিষয়বস্তু সহ maxminavg.sql নামের একটি ফাইল তৈরি করা যাক:

--Select database
USE employees;
--Calculate maximum salaries
SELECT CONCAT(last_name, ', ', first_name) AS Name, MAX(B.salary) AS "Max. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
--Calculate minimum salaries
SELECT CONCAT(last_name, ', ', first_name) AS Name, MIN(B.salary) AS "Min. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
--Calculate averages, round to 2 decimal places
SELECT CONCAT(last_name, ', ', first_name) AS Name, ROUND(AVG(B.salary), 2) AS "Avg. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;

দুটি ড্যাশ দিয়ে শুরু করা লাইনগুলি উপেক্ষা করা হয় এবং পৃথক অনুসন্ধানগুলি একের পর এক সম্পাদিত হয়। আমরা লিনাক্স কমান্ড লাইন থেকে এই স্ক্রিপ্টটি কার্যকর করতে পারি:

# mysql -u empadmin -p < maxminavg.sql
Enter password: 
Name	Max. salary
Facello, Georgi	88958
Simmel, Bezalel	72527
Bamford, Parto	43699
Name	Min. salary
Facello, Georgi	60117
Simmel, Bezalel	65828
Bamford, Parto	40006
Name	Avg. salary
Facello, Georgi	75388.94
Simmel, Bezalel	68854.50
Bamford, Parto	43030.29

বা মারিয়াডিবি প্রম্পট থেকে:

# mysql -u empadmin -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.14-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> source maxminavg.sql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

সারসংক্ষেপ

এই নিবন্ধে আমরা ব্যাখ্যা করেছি যে কীভাবে সিলেক্ট বিবৃতিতে ফেরত ফলাফল সেটগুলি পরিমার্জন করতে বেশ কয়েকটি মারিয়াডিবি ফাংশন ব্যবহার করতে হবে। একবার তাদের সংজ্ঞা দেওয়া হয়ে গেলে, আরও সহজে সম্পাদন করতে এবং মানুষের ত্রুটির ঝুঁকি কমাতে একাধিক স্বতন্ত্র প্রশ্নগুলি কোনও স্ক্রিপ্টে সন্নিবেশ করা যায়।

এই নিবন্ধটি সম্পর্কে আপনার কোনও প্রশ্ন বা পরামর্শ আছে? নীচে মন্তব্য ফর্ম ব্যবহার করে আমাদের একটি নোট নিচে নির্দ্বিধায়। আমরা আপনার কাছ থেকে শ্রবণ করার জন্য উন্মুখ!