Mysql
 sql >> Base de données >  >> RDS >> Mysql

Apprenez à utiliser plusieurs fonctions de MySQL et MariaDB - Partie 2

Ceci est la deuxième partie d'une série de 2 articles sur l'essentiel de MariaDB / MySQL commandes. Veuillez vous référer à notre article précédent sur ce sujet avant de continuer.

  1. Apprenez les bases de MySQL/MariaDB pour les débutants – Partie 1

Dans cette deuxième partie de la série MySQL/MariaDB pour débutants, nous expliquerons comment limiter le nombre de lignes renvoyées par un SELECT requête et comment ordonner le jeu de résultats en fonction d'une condition donnée.

De plus, nous apprendrons à regrouper les enregistrements et à effectuer des manipulations mathématiques de base sur des champs numériques. Tout cela nous aidera à créer un script SQL que nous pourrons utiliser pour produire des rapports utiles.

Prérequis

Pour commencer, veuillez suivre ces étapes :

1. Télécharger les employees exemple de base de données, qui comprend six tables composées de 4 millions d'enregistrements au 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. Entrez dans MariaDB demander et créer une base de données nommée employés :

# 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. Importez-le dans votre serveur MariaDB comme suit :

MariaDB [(none)]> source employees.sql

Attendez 1 à 2 minutes jusqu'à ce que l'exemple de base de données soit chargé (n'oubliez pas que nous parlons de 4 M enregistrements ici !).

4. Vérifiez que la base de données a été correctement importée en listant ses tables :

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. Créez un compte spécial à utiliser avec les employés base de données (n'hésitez pas à choisir un autre nom de compte et un autre mot de passe) :

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

Connectez-vous maintenant en tant que empadmin utilisateur dans l'invite 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

Assurez-vous que toutes les étapes décrites dans l'image ci-dessus ont été effectuées avant de continuer.

Ordre et limitation du nombre de lignes dans l'ensemble de résultats

Le tableau des salaires contient tous les revenus de chaque employé avec les dates de début et de fin. Nous souhaiterions peut-être consulter les salaires de emp_no=10001 heures supplémentaires. Cela vous aidera à répondre aux questions suivantes :

  1. A-t-il/elle obtenu des augmentations ?
  2. Si oui, quand ?

Exécutez la requête suivante pour le savoir :

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)

Et si nous avions besoin de voir les 5 dernières augmentations ? Nous pouvons faire ORDER BY from_date DESC . Le DESC mot-clé indique que nous voulons trier le jeu de résultats par ordre décroissant.

De plus, LIMITER 5 nous permet de ne renvoyer que le top 5 lignes dans le jeu de résultats :

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)

Vous pouvez également utiliser ORDER BY avec plusieurs champs. Par exemple, la requête suivante ordonnera le jeu de résultats en fonction de la date de naissance de l'employé sous forme croissante (par défaut) puis des noms de famille sous forme alphabétique décroissante :

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)

Vous pouvez afficher plus d'informations sur LIMIT ici.

Regroupement d'enregistrements / MAX, MIN, AVG et ROUND

Comme nous l'avons mentionné précédemment, les salaries table contient les revenus de chaque employé au fil du temps. Outre LIMIT , nous pouvons utiliser le MAX et MIN mots-clés pour déterminer quand le nombre maximum et minimum d'employés ont été embauchés :

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)

Sur la base des ensembles de résultats ci-dessus, pouvez-vous deviner ce que la requête ci-dessous renverra ?

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)

Si vous acceptez qu'il renvoie la moyenne (telle que spécifiée par AVG ) salaire au fil du temps arrondi à 2 décimales (comme indiqué par ROND ), vous avez raison.

Si nous voulons voir la somme des salaires regroupés par employé et retourner le top 5 , nous pouvons utiliser la requête suivante :

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)

Dans la requête ci-dessus, les salaires sont regroupés par employé, puis la somme est effectuée.

Tout rassembler

Heureusement, nous n'avons pas besoin d'exécuter requête après requête pour produire un rapport. Au lieu de cela, nous pouvons créer un script avec une série de commandes SQL pour renvoyer tous les ensembles de résultats nécessaires.

Une fois que nous avons exécuté le script, il renverra les informations requises sans autre intervention de notre part. Par exemple, créons un fichier nommé maxminavg.sql dans le répertoire de travail courant avec le contenu suivant :

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

Les lignes commençant par deux tirets sont ignorées et les requêtes individuelles sont exécutées les unes après les autres. Nous pouvons exécuter ce script soit depuis la ligne de commande 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

ou depuis l'invite 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

Résumé

Dans cet article, nous avons expliqué comment utiliser plusieurs fonctions MariaDB afin d'affiner les jeux de résultats renvoyés par SELECT déclarations. Une fois définies, plusieurs requêtes individuelles peuvent être insérées dans un script pour l'exécuter plus facilement et réduire le risque d'erreur humaine.

Avez-vous des questions ou des suggestions concernant cet article ? N'hésitez pas à nous envoyer une note en utilisant le formulaire de commentaire ci-dessous. Nous sommes impatients de vous entendre !