Dies ist der zweite Teil einer Serie mit 2 Artikeln über die Grundlagen von MariaDB / MySQL Befehle. Bitte lesen Sie unseren vorherigen Artikel zu diesem Thema, bevor Sie fortfahren.
- Lernen Sie MySQL/MariaDB-Grundlagen für Anfänger – Teil 1
In diesem zweiten Teil der MySQL/MariaDB-Anfängerserie erklären wir, wie Sie die Anzahl der Zeilen begrenzen, die von einem SELECT zurückgegeben werden Abfrage und wie die Ergebnismenge basierend auf einer bestimmten Bedingung sortiert wird.
Außerdem lernen wir, wie man die Datensätze gruppiert und grundlegende mathematische Manipulationen an numerischen Feldern durchführt. All dies wird uns helfen, ein SQL-Skript zu erstellen, mit dem wir nützliche Berichte erstellen können.
Voraussetzungen
Führen Sie zunächst die folgenden Schritte aus:
1. Laden Sie die employees
herunter Beispieldatenbank, die sechs Tabellen enthält, die aus 4 bestehen Millionen Datensätze insgesamt.
# 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. Geben Sie die MariaDB ein Eingabeaufforderung und erstellen Sie eine Datenbank mit dem Namen 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. Importieren Sie es wie folgt in Ihren MariaDB-Server:
MariaDB [(none)]> source employees.sql
Warten Sie 1–2 Minuten, bis die Beispieldatenbank geladen ist (denken Sie daran, dass wir hier von 4M sprechen Aufzeichnungen hier!).
4. Überprüfen Sie, ob die Datenbank korrekt importiert wurde, indem Sie ihre Tabellen auflisten:
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. Erstellen Sie ein spezielles Konto zur Verwendung mit den Mitarbeitern Datenbank (Sie können gerne einen anderen Kontonamen und ein anderes Passwort wählen):
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
Melden Sie sich jetzt als empadmin an Benutzer in die Mariadb-Eingabeaufforderung.
# 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
Stellen Sie sicher, dass alle im obigen Bild beschriebenen Schritte abgeschlossen sind, bevor Sie fortfahren.
Reihenfolge und Begrenzung der Zeilenanzahl in der Ergebnismenge
Die Gehaltstabelle enthält alle Einkommen jedes Mitarbeiters mit Start- und Enddatum. Möglicherweise möchten wir die Gehälter von emp_no=10001
anzeigen im Laufe der Zeit. Dies hilft bei der Beantwortung der folgenden Fragen:
- Hat er/sie Gehaltserhöhungen bekommen?
- Wenn ja, wann?
Führen Sie die folgende Abfrage aus, um dies herauszufinden:
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)
Was ist nun, wenn wir die letzten 5 Gehaltserhöhungen sehen müssen? Wir können ORDER BY from_date DESC ausführen . Das DESC Schlüsselwort gibt an, dass wir die Ergebnismenge in absteigender Reihenfolge sortieren möchten.
Zusätzlich LIMIT 5 ermöglicht es uns, nur die besten 5 zurückzugeben Zeilen in der Ergebnismenge:
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)
Sie können auch ORDER BY verwenden mit mehreren Feldern. Beispielsweise ordnet die folgende Abfrage die Ergebnismenge basierend auf dem Geburtsdatum des Mitarbeiters in aufsteigender Form (Standardeinstellung) und dann nach den Nachnamen in alphabetisch absteigender 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)
Weitere Informationen zu LIMIT finden Sie hier hier.
Datensätze gruppieren / MAX, MIN, AVG und ROUND
Wie bereits erwähnt, die salaries
Tabelle enthält die Einkommen jedes Mitarbeiters im Laufe der Zeit. Außer LIMIT , können wir das MAX verwenden und MIN Schlüsselwörter, um festzustellen, wann die maximale und minimale Anzahl von Mitarbeitern eingestellt wurde:
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)
Können Sie basierend auf den obigen Ergebnissätzen erraten, was die folgende Abfrage zurückgeben wird?
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)
Wenn Sie damit einverstanden sind, wird der Durchschnitt (wie von AVG angegeben) zurückgegeben ) Gehalt im Laufe der Zeit, auf 2 Dezimalstellen gerundet (wie durch ROUND angegeben). ), du hast recht.
Wenn wir die Summe der Gehälter nach Mitarbeitern gruppiert anzeigen und die Top 5 zurückgeben möchten , können wir die folgende Abfrage verwenden:
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 der obigen Abfrage werden die Gehälter nach Mitarbeitern gruppiert und dann die Summe ausgeführt.
Alles zusammenbringen
Glücklicherweise müssen wir nicht Abfrage für Abfrage ausführen, um einen Bericht zu erstellen. Stattdessen können wir ein Skript mit einer Reihe von SQL-Befehlen erstellen, um alle erforderlichen Ergebnismengen zurückzugeben.
Sobald wir das Skript ausführen, gibt es die erforderlichen Informationen ohne weiteres Eingreifen unsererseits zurück. Lassen Sie uns beispielsweise eine Datei mit dem Namen maxminavg.sql erstellen im aktuellen Arbeitsverzeichnis mit folgendem Inhalt:
--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;
Zeilen, die mit zwei Bindestrichen beginnen, werden ignoriert, und die einzelnen Abfragen werden nacheinander ausgeführt. Wir können dieses Skript entweder über die Linux-Befehlszeile ausführen:
# 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
oder von der MariaDB-Eingabeaufforderung:
# 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
Zusammenfassung
In diesem Artikel haben wir erklärt, wie Sie mehrere MariaDB-Funktionen verwenden, um von SELECT zurückgegebene Ergebnismengen zu verfeinern Aussagen. Nach der Definition können mehrere individuelle Abfragen in ein Skript eingefügt werden, um es einfacher auszuführen und das Risiko menschlicher Fehler zu verringern.
Haben Sie Fragen oder Anregungen zu diesem Artikel? Zögern Sie nicht, uns über das Kommentarformular unten eine Nachricht zu hinterlassen. Wir freuen uns darauf, von Ihnen zu hören!