sql >> Databasteknik >  >> RDS >> Mysql

Lär dig hur du använder flera funktioner i MySQL och MariaDB – Del 2

Detta är den andra delen av en serie med två artiklar om det väsentliga i MariaDB / MySQL kommandon. Se vår tidigare artikel om detta ämne innan du fortsätter.

  1. Lär dig MySQL/MariaDB grunderna för nybörjare – del 1

I den här andra delen av MySQL/MariaDB nybörjarserien kommer vi att förklara hur man begränsar antalet rader som returneras av en SELECT fråga och hur man ordnar resultatuppsättningen baserat på ett givet villkor.

Dessutom kommer vi att lära oss hur man grupperar posterna och utför grundläggande matematisk manipulation på numeriska fält. Allt detta kommer att hjälpa oss att skapa ett SQL-skript som vi kan använda för att producera användbara rapporter.

Förutsättningar

För att börja, följ dessa steg:

1. Ladda ner employees exempeldatabas, som innehåller sex tabeller bestående av 4 miljoner poster totalt.

# 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. Ange MariaDB fråga och skapa en databas med namnet anställda :

# 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. Importera den till din MariaDB-server enligt följande:

MariaDB [(none)]> source employees.sql

Vänta 1-2 minuter tills exempeldatabasen har laddats (tänk på att vi pratar om 4M registrerar här!).

4. Verifiera att databasen importerades korrekt genom att lista dess 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. Skapa ett speciellt konto att använda med anställda databas (välj gärna ett annat kontonamn och lösenord):

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

Logga nu in som empadmin användare till 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

Se till att alla steg som beskrivs i bilden ovan har slutförts innan du fortsätter.

Ordning och begränsning av antalet rader i resultatuppsättningen

Lönetabellen innehåller alla inkomster för varje anställd med start- och slutdatum. Vi kanske vill se lönerna för emp_no=10001 över tid. Detta hjälper dig att besvara följande frågor:

  1. Fick han/hon några höjningar?
  2. I så fall, när?

Kör följande fråga för att ta reda på 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)

Vad händer nu om vi behöver se de senaste 5 höjningarna? Vi kan göra ORDER BY from_date DESC . DESC nyckelord anger att vi vill sortera resultatuppsättningen i fallande ordning.

Dessutom LIMIT 5 tillåter oss att endast returnera topp 5 rader i resultatuppsättningen:

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 också använda ORDER BY med flera fält. Till exempel kommer följande fråga att ordna resultatuppsättningen baserat på den anställdes födelsedatum i stigande form (standard) och sedan efter efternamnen i alfabetisk fallande 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 mer information om LIMIT här.

Gruppera poster / MAX, MIN, AVG och ROUND

Som vi nämnde tidigare, salaries Tabellen innehåller inkomsterna för varje anställd över tiden. Förutom LIMIT , kan vi använda MAX och MIN nyckelord för att avgöra när högsta och lägsta antal anställda anställdes:

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)

Baserat på ovanstående resultatuppsättningar, kan du gissa vad frågan nedan kommer att returnera?

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)

Om du accepterar att det kommer att returnera genomsnittet (enligt AVG). ) lön över tid avrundad till 2 decimaler (som indikeras av ROUND ), du har rätt.

Om vi ​​vill se summan av lönerna grupperade efter anställd och returnera topp 5 , kan vi använda följande fråga:

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 ovanstående fråga grupperas lönerna efter anställd och sedan utförs summan.

Bringing the all Together

Lyckligtvis behöver vi inte köra fråga efter fråga för att producera en rapport. Istället kan vi skapa ett skript med en serie SQL-kommandon för att returnera alla nödvändiga resultatuppsättningar.

När vi kört skriptet kommer det att returnera den information som krävs utan ytterligare ingripande från vår sida. Låt oss till exempel skapa en fil med namnet maxminavg.sql i den aktuella arbetskatalogen med följande innehåll:

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

Rader som börjar med två bindestreck ignoreras och de enskilda frågorna exekveras en efter en. Vi kan köra det här skriptet antingen från Linux-kommandoraden:

# 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 från 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

Sammanfattning

I den här artikeln har vi förklarat hur man använder flera MariaDB-funktioner för att förfina resultatuppsättningar som returneras av SELECT uttalanden. När de väl har definierats kan flera individuella frågor infogas i ett skript för att exekvera det lättare och för att minska risken för mänskliga fel.

Har du några frågor eller förslag om den här artikeln? Skriv gärna en kommentar till oss genom att använda kommentarsformuläret nedan. Vi ser fram emot att höra från dig!


  1. Hur REPEAT() fungerar i MariaDB

  2. SQL-frågan långsam i .NET-applikation men omedelbar i SQL Server Management Studio

  3. Returnera rad med maxvärdet för en kolumn per grupp

  4. Hitta rader som inte innehåller numerisk data i Oracle