ຮຽນຮູ້ວິທີການໃຊ້ງານຫຼາຍໆຢ່າງຂອງ MySQL ແລະ MariaDB - ພາກທີ 2
ນີ້ແມ່ນພາກທີສອງຂອງຊຸດ 2 ບົດກ່ຽວກັບຄວາມ ຈຳ ເປັນຂອງ ຄຳ ສັ່ງ MariaDB/MySQL. ກະລຸນາອ້າງອີງເຖິງບົດຂຽນທີ່ຜ່ານມາຂອງພວກເຮົາກ່ຽວກັບຫົວຂໍ້ນີ້ກ່ອນ ດຳ ເນີນການ.
<
ໃນພາກທີສອງຂອງຊຸດຜູ້ເລີ່ມຕົ້ນ 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. ສ້າງບັນຊີພິເສດເພື່ອ ນຳ ໃຊ້ກັບຖານຂໍ້ມູນພະນັກງານ (ຮູ້ສຶກບໍ່ເສຍຄ່າເລືອກຊື່ບັນຊີແລະລະຫັດຜ່ານອື່ນ):
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
ຕອນນີ້ເຂົ້າສູ່ລະບົບເປັນຜູ້ໃຊ້ empadmin ເຂົ້າໄປໃນ 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
ໃຫ້ແນ່ໃຈວ່າທຸກຂັ້ນຕອນທີ່ໄດ້ກ່າວມາໃນຮູບຂ້າງເທິງນີ້ໄດ້ຖືກເຮັດ ສຳ ເລັດກ່ອນການ ດຳ ເນີນການ.
ຕາຕະລາງເງິນເດືອນມີລາຍໄດ້ທັງ ໝົດ ຂອງພະນັກງານແຕ່ລະຄົນທີ່ມີວັນເລີ່ມຕົ້ນແລະວັນສິ້ນສຸດ. ພວກເຮົາອາດຈະຕ້ອງການເບິ່ງເງິນເດືອນຂອງ emp_no = 10001
ຕາມເວລາ. ນີ້ຈະຊ່ວຍຕອບ ຄຳ ຖາມຕໍ່ໄປນີ້:
<
ປະຕິບັດການສອບຖາມຕໍ່ໄປນີ້ເພື່ອຊອກຫາ:
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 ອັນລ້າສຸດ? ພວກເຮົາສາມາດເຮັດ ORDER BY ຈາກ - DESC. ຄຳ ສຳ ຄັນຂອງ 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)
ນອກນັ້ນທ່ານຍັງສາມາດໃຊ້ ORDER BY ດ້ວຍຫຼາຍຂົງເຂດ. ຕົວຢ່າງ, ການສອບຖາມຕໍ່ໄປນີ້ຈະສັ່ງໃຫ້ຜົນໄດ້ຮັບທີ່ໄດ້ ກຳ ນົດໄວ້ໂດຍອີງຕາມວັນເດືອນປີເກີດຂອງພະນັກງານໃນຮູບແບບຂຶ້ນ (ຕັ້ງແຕ່ຕອນຕົ້ນ) ແລະຈາກນັ້ນໃສ່ຊື່ສຸດທ້າຍໃນແບບຟອມລົງຕາມຕົວອັກສອນ:
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 ໄດ້ທີ່ນີ້.
ດັ່ງທີ່ພວກເຮົາໄດ້ກ່າວມາກ່ອນ ໜ້າ ນີ້, ຕາຕະລາງເງິນເດືອນ ເງິນເດືອນ
ມີລາຍໄດ້ຂອງພະນັກງານແຕ່ລະຄົນໃນແຕ່ລະໄລຍະ. ນອກ ເໜືອ ຈາກ ຈຳ ກັດ, ພວກເຮົາສາມາດ ນຳ ໃຊ້ ຄຳ ສັບ 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), ທ່ານເວົ້າຖືກແລ້ວ.
ຖ້າພວກເຮົາຕ້ອງການເບິ່ງຜົນລວມຂອງເງິນເດືອນທີ່ຈັດເປັນກຸ່ມໂດຍພະນັກງານແລະກັບຄືນ 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 ເພື່ອສົ່ງຄືນທຸກຊຸດຜົນທີ່ ຈຳ ເປັນ.
ເມື່ອພວກເຮົາປະຕິບັດຕົວອັກສອນ, ມັນຈະສົ່ງຄືນຂໍ້ມູນທີ່ຕ້ອງການໂດຍບໍ່ມີການແຊກແຊງໃນສ່ວນຂອງພວກເຮົາອີກຕໍ່ໄປ. ຍົກຕົວຢ່າງ, ໃຫ້ສ້າງແຟ້ມທີ່ມີຊື່ວ່າ 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
ບົດສະຫຼຸບ
ໃນບົດຂຽນນີ້ພວກເຮົາໄດ້ອະທິບາຍວິທີການ ນຳ ໃຊ້ຫຼາຍ ໜ້າ ທີ່ຂອງ MariaDB ເພື່ອປັບປຸງຊຸດຜົນໄດ້ຮັບທີ່ສົ່ງຄືນໂດຍໃບລາຍງານ SELECT. ເມື່ອພວກເຂົາໄດ້ ກຳ ນົດແລ້ວ, ການສອບຖາມສ່ວນບຸກຄົນຫຼາຍໆຄັ້ງສາມາດຖືກໃສ່ເຂົ້າໃນສະຄິບເພື່ອປະຕິບັດມັນໄດ້ງ່າຍຂຶ້ນແລະຫຼຸດຜ່ອນຄວາມສ່ຽງຂອງຄວາມຜິດພາດຂອງມະນຸດ.
ທ່ານມີ ຄຳ ຖາມຫຼື ຄຳ ແນະ ນຳ ຫຍັງກ່ຽວກັບບົດຂຽນນີ້? ຮູ້ສຶກບໍ່ເສຍຄ່າທີ່ຈະຝາກຈົດ ໝາຍ ໃຫ້ພວກເຮົາໂດຍໃຊ້ແບບຟອມ ຄຳ ເຫັນຂ້າງລຸ່ມນີ້. ພວກເຮົາຫວັງວ່າຈະໄດ້ຍິນຂ່າວຈາກທ່ານ!