MySQL, MariaDB എന്നിവയുടെ നിരവധി പ്രവർത്തനങ്ങൾ എങ്ങനെ ഉപയോഗിക്കാമെന്ന് മനസിലാക്കുക - ഭാഗം 2


MariaDB/MySQL കമാൻഡുകളുടെ അവശ്യകാര്യങ്ങളെക്കുറിച്ചുള്ള 2-ലേഖന പരമ്പരയുടെ രണ്ടാം ഭാഗമാണിത്. തുടരുന്നതിന് മുമ്പ് ഈ വിഷയത്തെക്കുറിച്ചുള്ള ഞങ്ങളുടെ മുൻ ലേഖനം പരിശോധിക്കുക.

  1. തുടക്കക്കാർക്കായി MySQL/MariaDB അടിസ്ഥാന കാര്യങ്ങൾ പഠിക്കുക - ഭാഗം 1

MySQL/MariaDB തുടക്കക്കാരൻ സീരീസിന്റെ ഈ രണ്ടാം ഭാഗത്തിൽ, ഒരു SELECT ചോദ്യം തിരികെ നൽകുന്ന വരികളുടെ എണ്ണം എങ്ങനെ പരിമിതപ്പെടുത്താമെന്നും തന്നിരിക്കുന്ന വ്യവസ്ഥയെ അടിസ്ഥാനമാക്കിയുള്ള ഫലം എങ്ങനെ ക്രമീകരിക്കാമെന്നും ഞങ്ങൾ വിശദീകരിക്കും.

കൂടാതെ, രേഖകൾ എങ്ങനെ ഗ്രൂപ്പുചെയ്യാമെന്നും സംഖ്യാ ഫീൽഡുകളിൽ അടിസ്ഥാന ഗണിതശാസ്ത്ര കൃത്രിമത്വം നടത്താമെന്നും ഞങ്ങൾ പഠിക്കും. ഉപയോഗപ്രദമായ റിപ്പോർട്ടുകൾ നിർമ്മിക്കാൻ ഉപയോഗിക്കാവുന്ന ഒരു SQL സ്ക്രിപ്റ്റ് സൃഷ്ടിക്കാൻ ഇതെല്ലാം ഞങ്ങളെ സഹായിക്കും.

ആരംഭിക്കുന്നതിന്, ഈ ഘട്ടങ്ങൾ പാലിക്കുക:

1. ജീവനക്കാർ സാമ്പിൾ ഡാറ്റാബേസ് ഡൗൺലോഡ് ചെയ്യുക, അതിൽ ആകെ 4 ദശലക്ഷം റെക്കോർഡുകൾ അടങ്ങുന്ന ആറ് പട്ടികകൾ ഉൾപ്പെടുന്നു.

# 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

2. MariaDB പ്രോംപ്റ്റ് നൽകി ജീവനക്കാരുടെ പേരിലുള്ള ഒരു ഡാറ്റാബേസ് സൃഷ്ടിക്കുക:

# 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)

3. നിങ്ങളുടെ MariaDB സെർവറിലേക്ക് ഇത് ഇമ്പോർട്ടുചെയ്യുക:

MariaDB [(none)]> source employees.sql

സാമ്പിൾ ഡാറ്റാബേസ് ലോഡുചെയ്യുന്നത് വരെ 1-2 മിനിറ്റ് കാത്തിരിക്കുക (ഞങ്ങൾ ഇവിടെ 4M റെക്കോർഡുകളെക്കുറിച്ചാണ് സംസാരിക്കുന്നതെന്ന് ഓർക്കുക!).

4. ഡാറ്റാബേസ് അതിന്റെ ടേബിളുകൾ ലിസ്റ്റുചെയ്യുന്നതിലൂടെ അത് ശരിയായി ഇറക്കുമതി ചെയ്തിട്ടുണ്ടോയെന്ന് പരിശോധിക്കുക:

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)

5. ജീവനക്കാരുടെ ഡാറ്റാബേസിനൊപ്പം ഉപയോഗിക്കുന്നതിന് ഒരു പ്രത്യേക അക്കൗണ്ട് സൃഷ്ടിക്കുക (മറ്റൊരു അക്കൗണ്ട് പേരും പാസ്uവേഡും തിരഞ്ഞെടുക്കാൻ മടിക്കേണ്ടതില്ല):

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

ഇപ്പോൾ Mariadb പ്രോംപ്റ്റിലേക്ക് empadmin ഉപയോക്താവായി ലോഗിൻ ചെയ്യുക.

# 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

തുടരുന്നതിന് മുമ്പ് മുകളിലെ ചിത്രത്തിൽ പറഞ്ഞിരിക്കുന്ന എല്ലാ ഘട്ടങ്ങളും പൂർത്തിയാക്കിയെന്ന് ഉറപ്പാക്കുക.

ശമ്പള പട്ടികയിൽ ഓരോ ജീവനക്കാരന്റെയും എല്ലാ വരുമാനവും ആരംഭ, അവസാന തീയതികൾ അടങ്ങിയിരിക്കുന്നു. കാലക്രമേണ emp_no=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 മുതൽ_date പ്രകാരം ഞങ്ങൾക്ക് ഓർഡർ ചെയ്യാം. DESC കീവേഡ് സൂചിപ്പിക്കുന്നത്, ഞങ്ങൾ അവരോഹണ ക്രമത്തിൽ സെറ്റ് ചെയ്ത ഫലം അടുക്കാൻ ആഗ്രഹിക്കുന്നു എന്നാണ്.

കൂടാതെ, ഫല സെറ്റിലെ മുകളിലെ 5 വരികൾ മാത്രം തിരികെ നൽകാൻ LIMIT 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)

നിങ്ങൾക്ക് LIMIT-നെ കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ ഇവിടെ കാണാം.

ഞങ്ങൾ നേരത്തെ സൂചിപ്പിച്ചതുപോലെ, ശമ്പളം പട്ടികയിൽ ഓരോ ജീവനക്കാരന്റെയും കാലാകാലങ്ങളിൽ വരുമാനം അടങ്ങിയിരിക്കുന്നു. LIMIT കൂടാതെ, പരമാവധി, കുറഞ്ഞ ജീവനക്കാരെ എപ്പോൾ നിയമിച്ചുവെന്ന് നിർണ്ണയിക്കാൻ 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)

ഇത് കാലക്രമേണ ശരാശരി (AVG വ്യക്തമാക്കിയത്) ശമ്പളം 2 ദശാംശങ്ങളിലേക്ക് (ROUND സൂചിപ്പിക്കുന്നത് പോലെ) തിരികെ നൽകുമെന്ന് നിങ്ങൾ സമ്മതിക്കുകയാണെങ്കിൽ, നിങ്ങൾ പറഞ്ഞത് ശരിയാണ്.

ജീവനക്കാരൻ ഗ്രൂപ്പുചെയ്uത ശമ്പളത്തിന്റെ ആകെത്തുക കാണാനും മികച്ച 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)

മേൽപ്പറഞ്ഞ ചോദ്യത്തിൽ, ശമ്പളം ജീവനക്കാരനെ തരംതിരിക്കുകയും തുടർന്ന് തുക നിർവ്വഹിക്കുകയും ചെയ്യുന്നു.

ഭാഗ്യവശാൽ, ഒരു റിപ്പോർട്ട് തയ്യാറാക്കാൻ ഞങ്ങൾ ചോദ്യത്തിന് ശേഷം അന്വേഷണം നടത്തേണ്ടതില്ല. പകരം, ആവശ്യമായ എല്ലാ ഫല സെറ്റുകളും തിരികെ നൽകുന്നതിന് SQL കമാൻഡുകളുടെ ഒരു ശ്രേണി ഉപയോഗിച്ച് നമുക്ക് ഒരു സ്ക്രിപ്റ്റ് സൃഷ്ടിക്കാൻ കഴിയും.

ഒരിക്കൽ ഞങ്ങൾ സ്uക്രിപ്റ്റ് എക്uസിക്യൂട്ട് ചെയ്uതുകഴിഞ്ഞാൽ, അത് ഞങ്ങളുടെ ഭാഗത്തുനിന്ന് കൂടുതൽ ഇടപെടലില്ലാതെ ആവശ്യമായ വിവരങ്ങൾ തിരികെ നൽകും. ഉദാഹരണത്തിന്, ഇനിപ്പറയുന്ന ഉള്ളടക്കങ്ങളുള്ള നിലവിലെ വർക്കിംഗ് ഡയറക്ടറിയിൽ 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;

രണ്ട് ഡാഷുകളിൽ ആരംഭിക്കുന്ന വരികൾ അവഗണിക്കപ്പെടുകയും വ്യക്തിഗത അന്വേഷണങ്ങൾ ഒന്നിനുപുറകെ ഒന്നായി നടപ്പിലാക്കുകയും ചെയ്യുന്നു. Linux കമാൻഡ് ലൈനിൽ നിന്ന് നമുക്ക് ഈ സ്ക്രിപ്റ്റ് എക്സിക്യൂട്ട് ചെയ്യാം:

# 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

അല്ലെങ്കിൽ MariaDB പ്രോംപ്റ്റിൽ നിന്ന്:

# 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

സംഗ്രഹം

ഈ ലേഖനത്തിൽ, SELECT പ്രസ്താവനകൾ നൽകുന്ന ഫല സെറ്റുകൾ പരിഷ്കരിക്കുന്നതിന് നിരവധി MariaDB ഫംഗ്ഷനുകൾ എങ്ങനെ ഉപയോഗിക്കാമെന്ന് ഞങ്ങൾ വിശദീകരിച്ചിട്ടുണ്ട്. അവ നിർവചിച്ചുകഴിഞ്ഞാൽ, കൂടുതൽ എളുപ്പത്തിൽ എക്uസിക്യൂട്ട് ചെയ്യുന്നതിനും മനുഷ്യ പിശകുകളുടെ സാധ്യത കുറയ്ക്കുന്നതിനും ഒരു സ്uക്രിപ്റ്റിൽ ഒന്നിലധികം വ്യക്തിഗത അന്വേഷണങ്ങൾ തിരുകാൻ കഴിയും.

ഈ ലേഖനത്തെക്കുറിച്ച് നിങ്ങൾക്ക് എന്തെങ്കിലും ചോദ്യങ്ങളോ നിർദ്ദേശങ്ങളോ ഉണ്ടോ? ചുവടെയുള്ള അഭിപ്രായ ഫോം ഉപയോഗിച്ച് ഞങ്ങൾക്ക് ഒരു കുറിപ്പ് ഇടാൻ മടിക്കേണ്ടതില്ല. ഞങ്ങള് താങ്കള് പറയുന്നതു കേള്ക്കാനായി കാത്തിരിക്കുന്നു!