Pagkat-on Giunsa Paggamit ang Daghang Mga Kalihokan sa MySQL ug MariaDB - Bahin 2


Kini ang ikaduhang bahin sa 2-artikulo nga serye bahin sa mga kinahanglanon sa MariaDB/MySQL nga mga sugo. Palihug tan-awa ang among miaging artikulo bahin niini nga hilisgutan sa wala pa magpadayon.

  1. Pagkat-on sa MySQL/MariaDB Basics for Beginners – Part 1

Niining ikaduhang bahin sa MySQL/MariaDB beginner series, atong ipasabot kon unsaon paglimit ang gidaghanon sa mga row nga gibalik sa usa ka SELECT query, ug unsaon pag-order sa resulta nga set base sa gihatag nga kondisyon.

Dugang pa, makakat-on kita kung unsaon paggrupo ang mga rekord ug paghimo sa batakang pagmaniobra sa matematika sa mga natad sa numero. Kining tanan makatabang nato sa paghimo ug SQL script nga atong magamit sa paghimo ug mapuslanong mga taho.

Sa pagsugod, palihug sunda kini nga mga lakang:

1. I-download ang employees sample database, nga naglakip sa unom ka lamesa nga naglangkob sa 4 ka milyon nga mga rekord sa kinatibuk-an.

# 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. Pagsulod sa MariaDB prompt ug paghimo og database nga ginganlan og mga empleyado:

# 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. I-import kini sa imong MariaDB server sama sa mosunod:

MariaDB [(none)]> source employees.sql

Paghulat 1-2 ka minuto hangtod ma-load ang sample database (hinumdomi nga naghisgot kami bahin sa 4M nga mga rekord dinhi!).

4. Tinoa nga ang database na-import sa husto pinaagi sa paglista sa mga lamesa niini:

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. Paghimo og espesyal nga account nga gamiton sa database sa mga empleyado (bati nga gawasnon sa pagpili og lain nga ngalan sa account ug password):

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

Karon pag-login isip empadmin user ngadto sa Mariadb prompt.

# 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

Siguroha nga ang tanan nga mga lakang nga gilatid sa ibabaw nga hulagway nahuman na sa dili pa mopadayon.

Ang lamesa sa suweldo naglangkob sa tanan nga kita sa matag empleyado nga adunay mga petsa sa pagsugod ug pagtapos. Mahimo namong tan-awon ang mga sweldo sa emp_no=10001 sa paglabay sa panahon. Makatabang kini sa pagtubag sa mosunod nga mga pangutana:

  1. Nakakuha ba siya og bisan unsang mga umento?
  2. Kon mao, kanus-a?

Ipatuman ang mosunod nga pangutana aron masayran:

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)

Karon unsa man kung kinahanglan naton tan-awon ang labing bag-o nga 5 nga pagtaas? Makahimo mig ORDER BY from_date DESC. Ang DESC nga keyword nagpakita nga gusto namong ihan-ay ang resulta nga gitakda sa paubos nga han-ay.

Dugang pa, ang LIMIT 5 nagtugot kanamo nga ibalik lamang ang top 5 nga mga laray sa set sa resulta:

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)

Mahimo usab nimo gamiton ang ORDER BY nga adunay daghang mga natad. Pananglitan, ang mosunod nga pangutana mag-order sa resulta set base sa petsa sa pagkatawo sa empleyado sa ascending nga porma (ang default) ug dayon sa mga apelyido sa alphabetical descending nga porma:

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)

Mahimo nimong tan-awon ang dugang nga kasayuran bahin sa LIMIT dinhi.

Sama sa among gihisgutan sa sayo pa, ang suweldo nga lamesa naglangkob sa mga kita sa matag empleyado sa paglabay sa panahon. Gawas sa LIMIT, mahimo namong gamiton ang MAX ug MIN nga mga keyword aron mahibal-an kung kanus-a ang maximum ug minimum nga gidaghanon sa mga empleyado gi-hire:

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)

Base sa mga set sa resulta sa ibabaw, makatag-an ka ba kung unsa ang ibalik sa ubos nga pangutana?

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)

Kung mouyon ka nga ibalik niini ang kasagaran (sumala sa gitakda sa AVG) nga suweldo sa paglabay sa panahon nga gi-round sa 2 decimals (ingon sa gipakita sa ROUND), husto ka.

Kung gusto namong tan-awon ang sumada sa sweldo nga gigrupo sa empleyado ug ibalik ang top 5, magamit namo ang mosunod nga pangutana:

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)

Sa pangutana sa ibabaw, ang mga suweldo gi-grupo sa empleyado ug dayon ang kantidad gihimo.

Maayo na lang, dili na namo kinahanglan nga magpadagan sa pangutana human sa pangutana aron makahimo og report. Hinoon, makahimo kita og script nga adunay sunod-sunod nga SQL commands aron ibalik ang tanang gikinahanglan nga resulta sets.

Sa higayon nga atong ipatuman ang script, kini ibalik ang gikinahanglan nga impormasyon nga walay dugang nga interbensyon sa atong bahin. Pananglitan, maghimo kita og file nga ginganlan og maxminavg.sql sa kasamtangan nga direktoryo sa pagtrabaho nga adunay mosunod nga mga sulod:

--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;

Ang mga linya nga nagsugod sa duha ka dash wala panumbalinga, ug ang tagsa-tagsa nga mga pangutana gipatuman sa usag usa. Mahimo natong ipatuman kini nga script gikan sa command line sa 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

o gikan sa MariaDB prompt:

# 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

Summary

Sa kini nga artikulo gipasabut namon kung giunsa ang paggamit sa daghang mga function sa MariaDB aron mapino ang mga set sa resulta nga gibalik sa mga pahayag sa SELECT. Kung nahubit na nila, daghang indibidwal nga mga pangutana ang mahimong isulud sa usa ka script aron mahimo kini nga labi ka dali ug makunhuran ang peligro sa sayup sa tawo.

Aduna ka bay mga pangutana o sugyot bahin niini nga artikulo? Mobati nga gawasnon nga ihulog kanamo ang usa ka nota gamit ang porma sa komento sa ubos. Kami nagpaabut nga makadungog gikan kanimo!