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.
- 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:
- Heeft hij/zij verhogingen gekregen?
- 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!