Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Aprenda a usar várias funções do MySQL e do MariaDB – Parte 2


Esta é a segunda parte de uma série de 2 artigos sobre os fundamentos do MariaDB / MySQL comandos. Consulte nosso artigo anterior sobre este tópico antes de continuar.
  1. Aprenda o básico sobre MySQL/MariaDB para iniciantes – parte 1

Nesta segunda parte da série para iniciantes MySQL/MariaDB, explicaremos como limitar o número de linhas retornadas por um SELECT consulta e como ordenar o conjunto de resultados com base em uma determinada condição.

Além disso, aprenderemos como agrupar os registros e realizar manipulações matemáticas básicas em campos numéricos. Tudo isso nos ajudará a criar um script SQL que podemos usar para produzir relatórios úteis.

Pré-requisitos


Para começar, siga estes passos:

1. Baixe os employees banco de dados de exemplo, que inclui seis tabelas que consistem em 4 milhões de registros no 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. Digite o MariaDB prompt e crie um banco de dados chamado employees :
# 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. Importe-o para o seu servidor MariaDB da seguinte forma:
MariaDB [(none)]> source employees.sql

Aguarde de 1 a 2 minutos até que o banco de dados de amostra seja carregado (lembre-se de que estamos falando de 4M registros aqui!).

4. Verifique se o banco de dados foi importado corretamente listando suas tabelas:
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. Crie uma conta especial para usar com os funcionários banco de dados (sinta-se à vontade para escolher outro nome de conta e senha):
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

Agora faça login como empadmin usuário no prompt do 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

Certifique-se de que todas as etapas descritas na imagem acima foram concluídas antes de continuar.

Ordenando e limitando o número de linhas no conjunto de resultados


A tabela de salários contém todos os rendimentos de cada funcionário com datas de início e término. Podemos querer ver os salários de emp_no=10001 hora extra. Isso ajudará a responder as seguintes perguntas:
  1. Ele/ela recebeu algum aumento?
  2. Se sim, quando?

Execute a seguinte consulta para descobrir:
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)

Agora, e se precisarmos ver os últimos 5 aumentos? Podemos fazer ORDER BY from_date DESC . O DESC palavra-chave indica que queremos classificar o conjunto de resultados em ordem decrescente.

Além disso, LIMITE 5 nos permite retornar apenas os 5 principais linhas no conjunto de resultados:
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)

Você também pode usar ORDER BY com vários campos. Por exemplo, a consulta a seguir ordenará o conjunto de resultados com base na data de nascimento do funcionário em forma ascendente (o padrão) e, em seguida, pelos sobrenomes em forma alfabética 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)

Você pode ver mais informações sobre LIMIT aqui.

Registros de agrupamento / MAX, MIN, AVG e ROUND


Como mencionamos anteriormente, os salaries tabela contém os rendimentos de cada empregado ao longo do tempo. Além de LIMIT , podemos usar o MAX e MIN palavras-chave para determinar quando o número máximo e mínimo de funcionários foi contratado:
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)

Com base nos conjuntos de resultados acima, você consegue adivinhar o que a consulta abaixo retornará?
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 você concordar que ele retornará a média (conforme especificado por AVG ) salário ao longo do tempo arredondado para 2 casas decimais (conforme indicado por ROUND ), você tem razão.

Se quisermos visualizar a soma dos salários agrupados por funcionário e retornar os 5 principais , podemos usar a seguinte consulta:
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)

Na consulta acima, os salários são agrupados por funcionário e, em seguida, a soma é realizada.

Reunindo tudo


Felizmente, não precisamos executar consulta após consulta para produzir um relatório. Em vez disso, podemos criar um script com uma série de comandos SQL para retornar todos os conjuntos de resultados necessários.

Depois de executarmos o script, ele retornará as informações necessárias sem mais intervenção de nossa parte. Por exemplo, vamos criar um arquivo chamado maxminavg.sql no diretório de trabalho atual com o seguinte conteúdo:
--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;

As linhas que começam com dois traços são ignoradas e as consultas individuais são executadas uma após a outra. Podemos executar este script a partir da linha de comando do 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 no prompt do 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

Resumo


Neste artigo, explicamos como usar várias funções do MariaDB para refinar os conjuntos de resultados retornados por SELECT declarações. Depois de definidas, várias consultas individuais podem ser inseridas em um script para executá-lo com mais facilidade e reduzir o risco de erro humano.

Você tem alguma dúvida ou sugestão sobre este artigo? Sinta-se à vontade para nos enviar uma nota usando o formulário de comentários abaixo. Estamos ansiosos para ouvir de você!