Mysql
 sql >> база данни >  >> RDS >> Mysql

Научете как да използвате няколко функции на MySQL и MariaDB – част 2

Това е втората част от поредица от 2 статии за основите на MariaDB / MySQL команди. Моля, вижте предишната ни статия по тази тема, преди да продължите.

  1. Научете основите на MySQL/MariaDB за начинаещи – част 1

В тази втора част от поредицата за начинаещи MySQL/MariaDB ще обясним как да ограничим броя на редовете, върнати от SELECT заявка и как да подредите набора от резултати въз основа на дадено условие.

Освен това ще се научим как да групираме записите и да извършваме основни математически манипулации върху числови полета. Всичко това ще ни помогне да създадем SQL скрипт, който можем да използваме за изготвяне на полезни отчети.

Предварителни условия

За да започнете, моля, следвайте тези стъпки:

1. Изтеглете employees примерна база данни, която включва шест таблици, състоящи се от 4 общо милиони записа.

# 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. Въведете MariaDB подканете и създайте база данни с име служители :

# 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. Импортирайте го във вашия MariaDB сървър, както следва:

MariaDB [(none)]> source employees.sql

Изчакайте 1-2 минути, докато се зареди примерната база данни (имайте предвид, че говорим за 4M записи тук!).

4. Проверете дали базата данни е импортирана правилно, като посочите нейните таблици:

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. Създайте специален акаунт, който да използвате сслужителите база данни (не се колебайте да изберете друго име и парола за акаунт):

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

Сега влезте като empadmin потребител в подканата на 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

Уверете се, че всички стъпки, описани в горното изображение, са изпълнени, преди да продължите.

Подреждане и ограничаване на броя на редовете в набора от резултати

Таблицата със заплатите съдържа всички доходи на всеки служител с начална и крайна дата. Може да пожелаем да видим заплатите на emp_no=10001 с течение на времето. Това ще ви помогне да отговорите на следните въпроси:

  1. Той/тя получи ли повишения?
  2. Ако да, кога?

Изпълнете следната заявка, за да разберете:

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)

Ами сега, ако трябва да видим последните 5 повишения? Можем да направим ПОРЪЧАЙТЕ ПО от_дата DESC . DESC ключова дума показва, че искаме да сортираме набора от резултати в низходящ ред.

Освен това, LIMIT 5 ни позволява да върнем само първите 5 редове в резултатния набор:

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)

Можете също да използвате ПОРЪЧАЙТЕ ПО с множество полета. Например следната заявка ще подреди набора от резултати въз основа на датата на раждане на служителя във възходяща форма (по подразбиране) и след това по фамилните имена в низходяща азбучна форма:

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)

Можете да видите повече информация за LIMIT тук.

Групиране на записи / MAX, MIN, AVG и ROUND

Както споменахме по-рано, salaries таблицата съдържа доходите на всеки служител във времето. Освен LIMIT , можем да използваме MAX и MIN ключови думи, за да се определи кога максималният и минималният брой служители са били наети:

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)

Въз основа на горните набори от резултати, можете ли да познаете какво ще върне заявката по-долу?

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)

Ако сте съгласни, че ще върне средната стойност (както е посочено от AVG ) заплата във времето, закръглена до 2 знака след десетичната запетая (както е посочено с ROUND ), прав си.

Ако искаме да видим сбора на заплатите, групирани по служител и да върнем първите 5 , можем да използваме следната заявка:

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)

В горната заявка заплатите се групират по служител и след това се извършва сумата.

Обединяване на всичко

За щастие не е необходимо да изпълняваме заявка след заявка, за да изготвим отчет. Вместо това можем да създадем скрипт с поредица от SQL команди, за да върнем всички необходими набори от резултати.

След като изпълним скрипта, той ще върне необходимата информация без допълнителна намеса от наша страна. Например, нека създадем файл с име maxminavg.sql в текущата работна директория със следното съдържание:

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

Редове, започващи с две тирета, се игнорират и отделните заявки се изпълняват една след друга. Можем да изпълним този скрипт или от командния ред на Linux:

# 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

или от подканата на 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

Резюме

В тази статия сме обяснили как да използвате няколко функции на MariaDB, за да прецизирате наборите от резултати, върнати от SELECT изявления. След като бъдат дефинирани, множество отделни заявки могат да бъдат вмъкнати в скрипт, за да се изпълни по-лесно и да се намали рискът от човешка грешка.

Имате ли въпроси или предложения относно тази статия? Чувствайте се свободни да ни изпратите бележка, като използвате формуляра за коментари по-долу. Очакваме с нетърпение да чуем от вас!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL избира координати в обхват

  2. Как да създадете съхранена процедура в MySQL

  3. Как да актуализирате множество колони в MySQL

  4. Изчислете процентил от актуалност в MySQL

  5. MySQL НА ДУБЛИРАН КЛЮЧ - последно вмъкване на идентификатор?