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.
- 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:
- Nakakuha ba siya og bisan unsang mga umento?
- 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!