sql >> Database >  >> RDS >> Mysql

Leer hoe u verschillende functies van MySQL en MariaDB kunt gebruiken - deel 2

Dit is het tweede deel van een serie van 2 artikelen over de essentie van MariaDB / MySQL commando's. Raadpleeg ons vorige artikel over dit onderwerp voordat u verder gaat.

  1. Leer MySQL/MariaDB-basis voor beginners – deel 1

In dit tweede deel van de MySQL/MariaDB-beginnersreeks leggen we uit hoe u het aantal rijen dat door een SELECT wordt geretourneerd, kunt beperken. query, en hoe de resultatenset te ordenen op basis van een bepaalde voorwaarde.

Daarnaast zullen we leren hoe de records te groeperen en elementaire wiskundige manipulaties op numerieke velden uit te voeren. Dit alles zal ons helpen om een ​​SQL-script te maken dat we kunnen gebruiken om nuttige rapporten te produceren.

Vereisten

Volg deze stappen om te beginnen:

1. Download de employees voorbeelddatabase, die zes tabellen bevat bestaande uit 4 miljoen records in totaal.

# 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. Voer de MariaDB . in prompt en maak een database met de naam 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. Importeer het als volgt in uw MariaDB-server:

MariaDB [(none)]> source employees.sql

Wacht 1-2 minuten totdat de voorbeelddatabase is geladen (houd er rekening mee dat we het hebben over 4M records hier!).

4. Controleer of de database correct is geïmporteerd door de tabellen op te sommen:

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. Maak een speciaal account aan om te gebruiken met de medewerkers database (kies gerust een andere accountnaam en wachtwoord):

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

Log nu in als empadmin gebruiker naar Mariadb-prompt.

# 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

Zorg ervoor dat alle stappen in de bovenstaande afbeelding zijn voltooid voordat u doorgaat.

Het aantal rijen in de resultatenset bestellen en beperken

De salaristabel bevat alle inkomens van elke werknemer met begin- en einddatum. Mogelijk willen we de salarissen van emp_no=10001 overuren. Dit zal helpen bij het beantwoorden van de volgende vragen:

  1. Heeft hij/zij verhogingen gekregen?
  2. Zo ja, wanneer?

Voer de volgende vraag uit om erachter te komen:

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)

Wat nu als we de laatste 5 verhogingen moeten bekijken? We kunnen ORDER BY from_date DESC . De DESC trefwoord geeft aan dat we de resultatenset in aflopende volgorde willen sorteren.

Bovendien, LIMIT 5 stelt ons in staat om alleen de top 5 te retourneren rijen in de resultatenset:

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)

U kunt ook ORDER BY . gebruiken met meerdere velden. De volgende zoekopdracht zal bijvoorbeeld de resultatenset ordenen op basis van de geboortedatum van de werknemer in oplopende vorm (de standaard) en vervolgens op de achternaam in alfabetisch aflopende vorm:

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)

U kunt meer informatie bekijken over LIMIT hier.

Records groeperen / MAX, MIN, AVG en ROUND

Zoals we eerder vermeldden, zijn de salaries tabel bevat het inkomen van elke werknemer in de tijd. Naast LIMIT , kunnen we de MAX . gebruiken en MIN trefwoorden om te bepalen wanneer het maximum en minimum aantal werknemers is aangenomen:

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)

Kun je op basis van de bovenstaande resultatensets raden wat de onderstaande zoekopdracht zal opleveren?

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)

Als u ermee instemt dat het het gemiddelde retourneert (zoals gespecificeerd door AVG ) salaris in de loop van de tijd afgerond op 2 decimalen (zoals aangegeven door ROUND ), je hebt gelijk.

Als we de som van de salarissen willen zien, gegroepeerd per werknemer en de top 5 willen teruggeven , kunnen we de volgende zoekopdracht gebruiken:

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)

In de bovenstaande zoekopdracht worden de salarissen gegroepeerd per werknemer en vervolgens wordt de som uitgevoerd.

Alles samenbrengen

Gelukkig hoeven we geen query na query uit te voeren om een ​​rapport te maken. In plaats daarvan kunnen we een script maken met een reeks SQL-opdrachten om alle benodigde resultatensets te retourneren.

Zodra we het script hebben uitgevoerd, zal het de vereiste informatie retourneren zonder verdere tussenkomst van onze kant. Laten we bijvoorbeeld een bestand maken met de naam maxminavg.sql in de huidige werkmap met de volgende inhoud:

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

Regels die beginnen met twee streepjes worden genegeerd en de afzonderlijke query's worden na elkaar uitgevoerd. We kunnen dit script uitvoeren vanaf de Linux-opdrachtregel:

# 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

of vanaf de MariaDB-prompt:

# 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

Samenvatting

In dit artikel hebben we uitgelegd hoe u verschillende MariaDB-functies kunt gebruiken om resultatensets te verfijnen die worden geretourneerd door SELECT verklaringen. Nadat ze zijn gedefinieerd, kunnen meerdere afzonderlijke zoekopdrachten in een script worden ingevoegd om het gemakkelijker uit te voeren en het risico op menselijke fouten te verkleinen.

Heb je vragen of suggesties naar aanleiding van dit artikel? Voel je vrij om ons een bericht te sturen via het onderstaande reactieformulier. We horen graag van je!


  1. Wat is het ideale gegevenstype om te gebruiken bij het opslaan van breedtegraad / lengtegraad in een MySQL-database?

  2. PostgreSQL-accent + hoofdletterongevoelig zoeken

  3. Zoek een woordgroep die eindigt op een voorvoegsel met zoeken in volledige tekst

  4. Alles wat u moet weten over coderingsstandaarden voor SQL-query's