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

Lær hvordan du bruger flere funktioner i MySQL og MariaDB - Del 2

Dette er anden del af en serie med to artikler om det væsentlige ved MariaDB / MySQL kommandoer. Se venligst vores tidligere artikel om dette emne, før du fortsætter.

  1. Lær MySQL/MariaDB Basics for begyndere – Del 1

I denne anden del af MySQL/MariaDB begynderserien vil vi forklare, hvordan man begrænser antallet af rækker, der returneres af en SELECT forespørgsel, og hvordan man bestiller resultatsættet baseret på en given betingelse.

Derudover vil vi lære, hvordan man grupperer posterne og udfører grundlæggende matematisk manipulation på numeriske felter. Alt dette vil hjælpe os med at skabe et SQL-script, som vi kan bruge til at producere nyttige rapporter.

Forudsætninger

For at begynde skal du følge disse trin:

1. Download employees eksempeldatabase, som omfatter seks tabeller bestående af 4 millioner poster i alt.

# 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. Indtast MariaDB prompt og opret en database med navnet medarbejdere :

# 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. Importer det til din MariaDB-server som følger:

MariaDB [(none)]> source employees.sql

Vent 1-2 minutter, indtil prøvedatabasen er indlæst (husk, at vi taler om 4M optegnelser her!).

4. Bekræft, at databasen blev importeret korrekt ved at angive dens tabeller:

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. Opret en særlig konto til brug med medarbejderne database (vælg gerne et andet kontonavn og adgangskode):

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 ind som empadmin bruger ind i Mariadb-prompten.

# 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

Sørg for, at alle de trin, der er skitseret i billedet ovenfor, er gennemført, før du fortsætter.

Bestilling og begrænsning af antallet af rækker i resultatsættet

Løntabellen indeholder alle indkomster for hver medarbejder med start- og slutdatoer. Vi ønsker måske at se lønningerne for emp_no=10001 over tid. Dette vil hjælpe med at besvare følgende spørgsmål:

  1. Fik han/hun nogen forhøjelser?
  2. Hvis ja, hvornår?

Udfør følgende forespørgsel for at finde ud af det:

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)

Hvad nu hvis vi skal se de seneste 5 raises? Vi kan foretage BESTILLING AF fra_dato DESC . DESC nøgleord angiver, at vi ønsker at sortere resultatsættet i faldende rækkefølge.

Derudover LIMIT 5 giver os kun mulighed for at returnere top 5 rækker i resultatsættet:

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)

Du kan også bruge ORDER BY med flere felter. For eksempel vil følgende forespørgsel sortere resultatsættet baseret på medarbejderens fødselsdato i stigende form (standard) og derefter efter efternavne i alfabetisk faldende form:

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)

Du kan se flere oplysninger om LIMIT her.

Grupper records / MAX, MIN, AVG og ROUND

Som vi nævnte tidligere, er salaries tabel indeholder hver medarbejders indkomst over tid. Udover LIMIT , kan vi bruge MAX og MIN nøgleord til at bestemme, hvornår maksimalt og minimum antal medarbejdere blev ansat:

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)

Baseret på ovenstående resultatsæt, kan du gætte, hvad nedenstående forespørgsel vil returnere?

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)

Hvis du accepterer, at det vil returnere gennemsnittet (som angivet af AVG ) løn over tid afrundet til 2 decimaler (som angivet med RUND ), du har ret.

Hvis vi ønsker at se summen af ​​lønningerne grupperet efter medarbejder og returnere top 5 , kan vi bruge følgende forespørgsel:

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)

I ovenstående forespørgsel er lønninger grupperet efter medarbejder og derefter udføres summen.

Bring det hele sammen

Heldigvis behøver vi ikke at køre forespørgsel efter forespørgsel for at producere en rapport. I stedet kan vi oprette et script med en række SQL-kommandoer for at returnere alle de nødvendige resultatsæt.

Når vi udfører scriptet, returnerer det de nødvendige oplysninger uden yderligere indgriben fra vores side. Lad os for eksempel oprette en fil med navnet maxminavg.sql i den aktuelle arbejdsmappe med følgende indhold:

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

Linjer, der begynder med to bindestreger, ignoreres, og de individuelle forespørgsler udføres efter hinanden. Vi kan udføre dette script enten fra Linux-kommandolinjen:

# 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

eller fra MariaDB-prompten:

# 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

Oversigt

I denne artikel har vi forklaret, hvordan man bruger flere MariaDB-funktioner for at forfine resultatsæt returneret af SELECT udsagn. Når de har defineret, kan flere individuelle forespørgsler indsættes i et script for at udføre det nemmere og for at reducere risikoen for menneskelige fejl.

Har du spørgsmål eller forslag til denne artikel? Du er velkommen til at skrive en note til os ved at bruge kommentarformularen nedenfor. Vi ser frem til at høre fra dig!


  1. Ruller Oracle transaktionen tilbage ved en fejl?

  2. SQL-forespørgsel for at få aggregeret resultat i kommaseparatorer sammen med gruppe for kolonne i SQL Server

  3. Postgres funktion NULL værdi for række, der refererer til NY

  4. Sådan finder du navnet på en begrænsning i PostgreSQL