Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pelajari Cara Menggunakan Beberapa Fungsi MySQL dan MariaDB – Bagian 2

Ini adalah bagian kedua dari seri 2 artikel tentang esensi MariaDB / MySQL perintah. Silakan merujuk ke artikel kami sebelumnya tentang topik ini sebelum melanjutkan.

  1. Pelajari Dasar-dasar MySQL/MariaDB untuk Pemula – Bagian 1

Di bagian kedua dari seri pemula MySQL/MariaDB ini, kami akan menjelaskan cara membatasi jumlah baris yang dikembalikan oleh SELECT kueri, dan cara mengurutkan hasil yang ditetapkan berdasarkan kondisi tertentu.

Selain itu, kita akan belajar bagaimana mengelompokkan record dan melakukan manipulasi matematika dasar pada bidang numerik. Semua ini akan membantu kami membuat skrip SQL yang dapat kami gunakan untuk menghasilkan laporan yang bermanfaat.

Prasyarat

Untuk memulai, ikuti langkah-langkah berikut:

1. Unduh employees database sampel, yang mencakup enam tabel yang terdiri dari 4 juta catatan secara total.

# 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. Masukkan MariaDB prompt dan buat database bernama karyawan :

# 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. Impor ke server MariaDB Anda sebagai berikut:

MariaDB [(none)]> source employees.sql

Tunggu 1-2 menit hingga database sampel dimuat (perlu diingat bahwa kita berbicara tentang 4 juta catatan di sini!).

4. Verifikasi bahwa database telah diimpor dengan benar dengan mencantumkan tabelnya:

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. Buat akun khusus untuk digunakan dengan karyawan database (jangan ragu untuk memilih nama akun dan kata sandi lain):

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

Sekarang login sebagai empadmin pengguna ke dalam perintah 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

Pastikan semua langkah yang diuraikan pada gambar di atas telah diselesaikan sebelum melanjutkan.

Mengurutkan dan Membatasi Jumlah Baris dalam Kumpulan Hasil

Tabel gaji berisi semua pendapatan setiap karyawan dengan tanggal mulai dan berakhir. Kami mungkin ingin melihat gaji emp_no=10001 lembur. Ini akan membantu menjawab pertanyaan berikut:

  1. Apakah dia mendapatkan kenaikan gaji?
  2. Jika ya, kapan?

Jalankan kueri berikut untuk mengetahuinya:

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)

Sekarang bagaimana jika kita perlu melihat 5 kenaikan gaji terbaru? Kami dapat melakukan ORDER BY from_date DESC . DESC kata kunci menunjukkan bahwa kami ingin mengurutkan hasil yang ditetapkan dalam urutan menurun.

Selain itu, BATAS 5 memungkinkan kami untuk mengembalikan hanya 5 top teratas baris dalam kumpulan hasil:

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)

Anda juga dapat menggunakan ORDER BY dengan beberapa bidang. Misalnya, kueri berikut akan mengurutkan hasil yang ditetapkan berdasarkan tanggal lahir karyawan dalam bentuk menaik (default) dan kemudian dengan nama belakang dalam bentuk abjad menurun:

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)

Anda dapat melihat informasi lebih lanjut tentang LIMIT di sini.

Mengelompokkan Rekaman / MAX, MIN, AVG, dan ROUND

Seperti yang kami sebutkan sebelumnya, salaries tabel berisi pendapatan setiap karyawan dari waktu ke waktu. Selain BATAS , kita dapat menggunakan MAX dan MIN kata kunci untuk menentukan kapan jumlah maksimum dan minimum karyawan dipekerjakan:

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)

Berdasarkan kumpulan hasil di atas, dapatkah Anda menebak kueri apa yang akan ditampilkan di bawah ini?

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)

Jika Anda setuju bahwa itu akan mengembalikan rata-rata (seperti yang ditentukan oleh AVG ) gaji dari waktu ke waktu dibulatkan menjadi 2 desimal (seperti yang ditunjukkan oleh PUTAR ), Anda benar.

Jika kita ingin melihat jumlah gaji yang dikelompokkan berdasarkan karyawan dan mengembalikan 5 top teratas , kita dapat menggunakan kueri berikut:

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)

Pada query di atas, gaji dikelompokkan berdasarkan karyawan dan kemudian dilakukan penjumlahan.

Menyatukan semuanya

Untungnya, kita tidak perlu menjalankan kueri demi kueri untuk menghasilkan laporan. Sebagai gantinya, kita dapat membuat skrip dengan serangkaian perintah SQL untuk mengembalikan semua set hasil yang diperlukan.

Setelah kami menjalankan skrip, itu akan mengembalikan informasi yang diperlukan tanpa intervensi lebih lanjut dari pihak kami. Misalnya, mari kita buat file bernama maxminavg.sql di direktori kerja saat ini dengan konten berikut:

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

Baris yang dimulai dengan dua tanda hubung diabaikan, dan kueri individual dieksekusi satu demi satu. Kita dapat menjalankan skrip ini baik dari baris perintah 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

atau dari perintah 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

Ringkasan

Dalam artikel ini kami telah menjelaskan cara menggunakan beberapa fungsi MariaDB untuk menyaring kumpulan hasil yang dikembalikan oleh SELECT pernyataan. Setelah ditentukan, beberapa kueri individual dapat dimasukkan ke dalam skrip untuk menjalankannya dengan lebih mudah dan untuk mengurangi risiko kesalahan manusia.

Apakah Anda memiliki pertanyaan atau saran tentang artikel ini? Jangan ragu untuk memberi kami catatan menggunakan formulir komentar di bawah. Kami menantikan kabar dari Anda!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sintaks yang tepat untuk digunakan di dekat '?'

  2. Replikasi MySQL dan Failover Berbasis GTID - Menyelami Transaksi yang Salah

  3. iterator/generator SqlAlchemy built-in yang hemat memori?

  4. Cara Melakukan UPSERT sehingga saya dapat menggunakan nilai baru dan lama di bagian pembaruan

  5. MySQL lewati 10 hasil pertama