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.
- 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:
- Fik han/hun nogen forhøjelser?
- 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!