Đây là phần thứ hai của loạt bài gồm 2 bài viết về các yếu tố cần thiết của MariaDB / MySQL các lệnh. Vui lòng tham khảo bài viết trước của chúng tôi về chủ đề này trước khi tiếp tục.
- Tìm hiểu Kiến thức cơ bản về MySQL / MariaDB cho người mới bắt đầu - Phần 1
Trong phần thứ hai này của loạt bài dành cho người mới bắt đầu về MySQL / MariaDB, chúng tôi sẽ giải thích cách giới hạn số hàng được trả về bởi một SELECT truy vấn và cách sắp xếp tập hợp kết quả dựa trên một điều kiện nhất định.
Ngoài ra, chúng ta sẽ học cách nhóm các bản ghi và thực hiện các thao tác toán học cơ bản trên các trường số. Tất cả những điều này sẽ giúp chúng tôi tạo một tập lệnh SQL mà chúng tôi có thể sử dụng để tạo các báo cáo hữu ích.
Điều kiện tiên quyết
Để bắt đầu, hãy làm theo các bước sau:
1. Tải xuống employees
cơ sở dữ liệu mẫu, bao gồm sáu bảng bao gồm 4 tổng số triệu bản ghi.
# 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. Nhập MariaDB nhắc và tạo cơ sở dữ liệu có tên nhân viên :
# 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. Nhập nó vào máy chủ MariaDB của bạn như sau:
MariaDB [(none)]> source employees.sql
Chờ 1-2 phút cho đến khi cơ sở dữ liệu mẫu được tải (lưu ý rằng chúng ta đang nói về 4M hồ sơ tại đây!).
4. Xác minh rằng cơ sở dữ liệu đã được nhập đúng cách bằng cách liệt kê các bảng của nó:
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. Tạo một tài khoản đặc biệt để sử dụng với nhân viên cơ sở dữ liệu (vui lòng chọn tên tài khoản và mật khẩu khác):
MariaDB [employees]> CREATE USER [email protected] IDENTIFIED BY 'empadminpass'; Query OK, 0 rows affected (0.03 sec) MariaDB [employees]> GRANT ALL PRIVILEGES ON employees.* to [email protected]; Query OK, 0 rows affected (0.02 sec) MariaDB [employees]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [employees]> exit Bye
Bây giờ đăng nhập bằng empadmin người dùng vào lời nhắc 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)]> 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
Đảm bảo rằng tất cả các bước được nêu trong hình trên đã được hoàn thành trước khi tiếp tục.
Sắp xếp và giới hạn số lượng hàng trong tập kết quả
Bảng lương chứa tất cả các khoản thu nhập của từng nhân viên với ngày bắt đầu và ngày kết thúc. Chúng tôi có thể muốn xem mức lương của emp_no=10001
tăng ca. Điều này sẽ giúp trả lời các câu hỏi sau:
- Anh ấy / cô ấy có được tăng lương không?
- Nếu vậy, khi nào?
Thực hiện truy vấn sau để tìm hiểu:
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)
Bây giờ nếu chúng ta cần xem 5 lần tăng mới nhất thì sao? Chúng tôi có thể thực hiện ĐẶT HÀNG THEO từ_date DESC . DESC từ khóa cho biết rằng chúng tôi muốn sắp xếp tập hợp kết quả theo thứ tự giảm dần.
Ngoài ra, LIMIT 5 cho phép chúng tôi chỉ trả lại 5 hàng đầu các hàng trong tập hợp kết quả:
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)
Bạn cũng có thể sử dụng ORDER BY với nhiều trường. Ví dụ:truy vấn sau sẽ sắp xếp tập hợp kết quả dựa trên ngày sinh của nhân viên ở dạng tăng dần (mặc định) và sau đó theo họ ở dạng giảm dần theo thứ tự bảng chữ cái:
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)
Bạn có thể xem thêm thông tin về LIMIT tại đây.
Bản ghi nhóm / MAX, MIN, AVG và ROUND
Như chúng tôi đã đề cập trước đó, salaries
bảng chứa thu nhập của từng nhân viên theo thời gian. Bên cạnh LIMIT , chúng tôi có thể sử dụng MAX và MIN từ khóa để xác định thời điểm số lượng nhân viên tối đa và tối thiểu được thuê:
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)
Dựa trên các tập hợp kết quả trên, bạn có đoán được câu truy vấn dưới đây sẽ trả về gì không?
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)
Nếu bạn đồng ý rằng nó sẽ trả về giá trị trung bình (như được chỉ định bởi AVG ) lương theo thời gian được làm tròn thành 2 số thập phân (như được biểu thị bằng ROUND ), bạn đúng.
Nếu chúng tôi muốn xem tổng số tiền lương được nhóm theo nhân viên và trả về 5 trên cùng , chúng ta có thể sử dụng truy vấn sau:
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)
Trong truy vấn trên, tiền lương được nhóm theo nhân viên và sau đó tổng được thực hiện.
Mang tất cả lại với nhau
May mắn thay, chúng tôi không cần phải chạy hết truy vấn này đến truy vấn khác để tạo báo cáo. Thay vào đó, chúng ta có thể tạo một tập lệnh với một loạt lệnh SQL để trả về tất cả các tập kết quả cần thiết.
Sau khi chúng tôi thực thi tập lệnh, nó sẽ trả về thông tin cần thiết mà không cần sự can thiệp của chúng tôi. Ví dụ:hãy tạo một tệp có tên maxminavg.sql trong thư mục làm việc hiện tại với các nội dung sau:
--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;
Các dòng bắt đầu bằng hai dấu gạch ngang bị bỏ qua và các truy vấn riêng lẻ được thực thi lần lượt. Chúng tôi có thể thực thi tập lệnh này từ dòng lệnh 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
hoặc từ lời nhắc 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
Tóm tắt
Trong bài viết này, chúng tôi đã giải thích cách sử dụng một số hàm MariaDB để tinh chỉnh các tập kết quả được trả về bởi SELECT các câu lệnh. Khi họ đã xác định, nhiều truy vấn riêng lẻ có thể được chèn vào một tập lệnh để thực thi nó dễ dàng hơn và giảm nguy cơ do lỗi của con người.
Bạn có bất kỳ câu hỏi hoặc đề xuất nào về bài viết này? Vui lòng để lại cho chúng tôi một ghi chú bằng cách sử dụng mẫu bình luận bên dưới. Chúng tôi mong nhận được phản hồi từ bạn!