ຮຽນຮູ້ວິທີການໃຊ້ງານຫຼາຍໆຢ່າງຂອງ MySQL ແລະ MariaDB - ພາກທີ 2


ນີ້ແມ່ນພາກທີສອງຂອງຊຸດ 2 ບົດກ່ຽວກັບຄວາມ ຈຳ ເປັນຂອງ ຄຳ ສັ່ງ MariaDB/MySQL. ກະລຸນາອ້າງອີງເຖິງບົດຂຽນທີ່ຜ່ານມາຂອງພວກເຮົາກ່ຽວກັບຫົວຂໍ້ນີ້ກ່ອນ ດຳ ເນີນການ.

<

  • ຮຽນຮູ້ພື້ນຖານ 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. ສ້າງບັນຊີພິເສດເພື່ອ ນຳ ໃຊ້ກັບຖານຂໍ້ມູນພະນັກງານ (ຮູ້ສຶກບໍ່ເສຍຄ່າເລືອກຊື່ບັນຊີແລະລະຫັດຜ່ານອື່ນ):

    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. ເມື່ອພວກເຂົາໄດ້ ກຳ ນົດແລ້ວ, ການສອບຖາມສ່ວນບຸກຄົນຫຼາຍໆຄັ້ງສາມາດຖືກໃສ່ເຂົ້າໃນສະຄິບເພື່ອປະຕິບັດມັນໄດ້ງ່າຍຂຶ້ນແລະຫຼຸດຜ່ອນຄວາມສ່ຽງຂອງຄວາມຜິດພາດຂອງມະນຸດ.

    ທ່ານມີ ຄຳ ຖາມຫຼື ຄຳ ແນະ ນຳ ຫຍັງກ່ຽວກັບບົດຂຽນນີ້? ຮູ້ສຶກບໍ່ເສຍຄ່າທີ່ຈະຝາກຈົດ ໝາຍ ໃຫ້ພວກເຮົາໂດຍໃຊ້ແບບຟອມ ຄຳ ເຫັນຂ້າງລຸ່ມນີ້. ພວກເຮົາຫວັງວ່າຈະໄດ້ຍິນຂ່າວຈາກທ່ານ!