To jest druga część serii dwóch artykułów o podstawach MariaDB / MySQL polecenia. Przed kontynuowaniem zapoznaj się z naszym poprzednim artykułem na ten temat.
- Poznaj podstawy MySQL/MariaDB dla początkujących – część 1
W drugiej części serii MySQL/MariaDB dla początkujących wyjaśnimy, jak ograniczyć liczbę wierszy zwracanych przez SELECT zapytanie i jak uporządkować zestaw wyników na podstawie danego warunku.
Dodatkowo nauczymy się grupować rekordy i wykonywać podstawowe operacje matematyczne na polach numerycznych. Wszystko to pomoże nam stworzyć skrypt SQL, którego możemy użyć do tworzenia przydatnych raportów.
Wymagania wstępne
Aby rozpocząć, wykonaj następujące czynności:
1. Pobierz employees
przykładowa baza danych, która zawiera sześć tabel składających się z 4 łącznie milion rekordów.
# 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. Wejdź do MariaDB monit i utwórz bazę danych o nazwie pracownicy :
# 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. Zaimportuj go na swój serwer MariaDB w następujący sposób:
MariaDB [(none)]> source employees.sql
Poczekaj 1-2 minuty, aż załaduje się przykładowa baza danych (pamiętaj, że mówimy o 4M rekordy tutaj!).
4. Sprawdź, czy baza danych została poprawnie zaimportowana, wyświetlając jej tabele:
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. Utwórz specjalne konto do użytku z pracownikami baza danych (możesz wybrać inną nazwę konta i hasło):
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
Teraz zaloguj się jako empadmin użytkownika w wierszu Mariadb.
# 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
Przed kontynuowaniem upewnij się, że wszystkie kroki przedstawione na powyższym obrazku zostały wykonane.
Porządkowanie i ograniczanie liczby wierszy w zestawie wyników
Tabela wynagrodzeń zawiera wszystkie dochody każdego pracownika wraz z datami rozpoczęcia i zakończenia. Możemy chcieć zobaczyć pensje emp_no=10001
nadgodziny. Pomoże to odpowiedzieć na następujące pytania:
- Czy on/ona otrzymał jakieś podwyżki?
- Jeśli tak, to kiedy?
Wykonaj następujące zapytanie, aby się dowiedzieć:
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)
A co, jeśli musimy zobaczyć ostatnie 5 podbić? Możemy wykonać ORDER BY from_date DESC . DESC słowo kluczowe wskazuje, że chcemy posortować zestaw wyników w kolejności malejącej.
Dodatkowo LIMIT 5 pozwala nam zwrócić tylko pierwszych 5 wiersze w zestawie wyników:
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)
Możesz także użyć ORDER BY z wieloma polami. Na przykład następujące zapytanie uporządkuje zestaw wyników na podstawie daty urodzenia pracownika w formie rosnącej (domyślnie), a następnie według nazwisk w kolejności alfabetycznej malejącej:
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)
Możesz wyświetlić więcej informacji o LIMIT tutaj.
Grupowanie rekordów / MAX, MIN, ŚREDNIA i ZAOKR
Jak wspomnieliśmy wcześniej, salaries
tabela zawiera dochody każdego pracownika w czasie. Poza LIMIT , możemy użyć MAX i MIN słowa kluczowe określające, kiedy zatrudniono maksymalną i minimalną liczbę pracowników:
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)
Na podstawie powyższych zestawów wyników, czy potrafisz odgadnąć, co zwróci poniższe zapytanie?
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)
Jeśli zgadzasz się, że zwróci średnią (zgodnie z AVG ) wynagrodzenie w czasie zaokrąglone do 2 miejsc po przecinku (zgodnie z oznaczeniem RUNDA ), masz rację.
Jeśli chcemy wyświetlić sumę wynagrodzeń pogrupowanych według pracowników i zwrócić najlepsze 5 , możemy użyć następującego zapytania:
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)
W powyższym zapytaniu pensje są pogrupowane według pracowników, a następnie suma jest wykonywana.
Łączmy to wszystko razem
Na szczęście nie musimy uruchamiać zapytania po zapytaniu, aby wygenerować raport. Zamiast tego możemy stworzyć skrypt z serią poleceń SQL, aby zwrócić wszystkie niezbędne zestawy wyników.
Po wykonaniu skryptu zwróci on wymagane informacje bez dalszej interwencji z naszej strony. Na przykład utwórzmy plik o nazwie maxminavg.sql w bieżącym katalogu roboczym z następującą zawartością:
--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;
Wiersze zaczynające się od dwóch myślników są ignorowane, a poszczególne zapytania są wykonywane jedno po drugim. Możemy wykonać ten skrypt z wiersza poleceń Linuksa:
# 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
lub z wiersza poleceń MariaDB:
# 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
Podsumowanie
W tym artykule wyjaśniliśmy, jak korzystać z kilku funkcji MariaDB w celu udoskonalenia zestawów wyników zwracanych przez SELECT sprawozdania. Po ich zdefiniowaniu do skryptu można wstawić wiele pojedynczych zapytań, aby ułatwić jego wykonanie i zmniejszyć ryzyko błędu ludzkiego.
Masz pytania lub sugestie dotyczące tego artykułu? Napisz do nas, korzystając z poniższego formularza komentarza. Czekamy na wiadomość od Ciebie!