Mysql
 sql >> Database >  >> RDS >> Mysql

Scopri come utilizzare diverse funzioni di MySQL e MariaDB - Parte 2

Questa è la seconda parte di una serie di 2 articoli sugli elementi essenziali di MariaDB / MySQL comandi. Si prega di fare riferimento al nostro precedente articolo su questo argomento prima di procedere.

  1. Impara le basi di MySQL/MariaDB per principianti – Parte 1

In questa seconda parte della serie per principianti MySQL/MariaDB, spiegheremo come limitare il numero di righe restituite da un SELECT query e come ordinare il set di risultati in base a una determinata condizione.

Inoltre, impareremo come raggruppare i record ed eseguire manipolazioni matematiche di base su campi numerici. Tutto questo ci aiuterà a creare uno script SQL che possiamo utilizzare per produrre report utili.

Prerequisiti

Per iniziare, segui questi passaggi:

1. Scarica il employees database di esempio, che include sei tabelle composte da 4 milioni di record in totale.

# 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. Inserisci MariaDB richiedere e creare un database denominato dipendenti :

# 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. Importalo nel tuo server MariaDB come segue:

MariaDB [(none)]> source employees.sql

Attendi 1-2 minuti fino al caricamento del database di esempio (tieni presente che stiamo parlando di 4M record qui!).

4. Verifica che il database sia stato importato correttamente elencando le sue tabelle:

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. Crea un account speciale da utilizzare con i dipendenti database (sentiti libero di scegliere un altro nome account e password):

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

Ora accedi come empadmin utente nel prompt di 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

Assicurati che tutti i passaggi descritti nell'immagine sopra siano stati completati prima di procedere.

Ordinare e limitare il numero di righe nel set di risultati

La tabella degli stipendi contiene tutti i redditi di ciascun dipendente con date di inizio e fine. Potremmo voler visualizzare gli stipendi di emp_no=10001 col tempo. Questo aiuterà a rispondere alle seguenti domande:

  1. Ha ricevuto rilanci?
  2. Se sì, quando?

Esegui la seguente query per scoprirlo:

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)

E se avessimo bisogno di visualizzare gli ultimi 5 rilanci? Possiamo fare ORDINE BY da_date DESC . Il DESC la parola chiave indica che vogliamo ordinare il set di risultati in ordine decrescente.

Inoltre, LIMITE 5 ci consente di restituire solo i primi 5 righe nel set di risultati:

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)

Puoi anche utilizzare ORDINA PER con più campi. Ad esempio, la seguente query ordinerà il set di risultati in base alla data di nascita del dipendente in forma crescente (impostazione predefinita) e quindi in base ai cognomi in forma alfabetica decrescente:

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)

Puoi visualizzare ulteriori informazioni su LIMIT qui.

Raggruppamento record/MAX, MIN, AVG e ROUND

Come accennato in precedenza, gli salaries tabella contiene i redditi di ciascun dipendente nel tempo. Oltre a LIMITE , possiamo utilizzare il MAX e MIN parole chiave per determinare quando è stato assunto il numero massimo e minimo di dipendenti:

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)

Sulla base dei set di risultati di cui sopra, puoi indovinare cosa restituirà la query seguente?

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)

Se accetti che restituirà la media (come specificato da AVG ) stipendio nel tempo arrotondato a 2 decimali (come indicato da ROUND ), hai ragione.

Se vogliamo visualizzare la somma degli stipendi raggruppati per dipendente e restituire i primi 5 , possiamo utilizzare la seguente query:

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)

Nella query precedente, gli stipendi sono raggruppati per dipendente e quindi viene eseguita la somma.

Unendo tutto

Fortunatamente, non è necessario eseguire query dopo query per produrre un report. Possiamo invece creare uno script con una serie di comandi SQL per restituire tutti i set di risultati necessari.

Una volta eseguito, lo script restituirà le informazioni richieste senza ulteriori interventi da parte nostra. Ad esempio, creiamo un file chiamato maxminavg.sql nella directory di lavoro corrente con i seguenti contenuti:

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

Le righe che iniziano con due trattini vengono ignorate e le singole query vengono eseguite una dopo l'altra. Possiamo eseguire questo script sia dalla riga di comando di 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 dal prompt di 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

Riepilogo

In questo articolo abbiamo spiegato come utilizzare diverse funzioni di MariaDB per perfezionare i set di risultati restituiti da SELECT dichiarazioni. Una volta definite, è possibile inserire più query singole in uno script per eseguirlo più facilmente e ridurre il rischio di errore umano.

Hai domande o suggerimenti su questo articolo? Sentiti libero di inviarci una nota utilizzando il modulo di commento qui sotto. Non vediamo l'ora di sentirti!