Архив метки: MySQL

Функция RANK в MySQL

Описание: в этой статье вы узнаете о функции RANK() в MySQL и о том, как ее применять, чтобы присвоить ранг каждой строке в разделе набора результатов.

Обратите внимание, что MySQL поддерживает функцию RANK() и другие оконные функции начиная с версии 8.0

 

Введение в функцию RANK() в MySQL

Функция RANK() присваивает ранг для каждой строки в пределах раздела результирующего набора. Ранг строки определяется одним плюс количество рангов, которые предшествуют ему.

Ниже показан синтаксис функции RANK():

RANK() OVER (

PARTITION BY <expression>[{,<expression>...}]

ORDER BY <expression> [ASC|DESC], [{,<expression>...}]

)

 

В этом синтаксисе:

  • Во-первых, предложение PARTITION BY делит наборы результатов на разделы. Функция RANK() выполняется в разделах и реинициализируется при пересечении границы раздела.
  • Во-вторых, предложение ORDER BYRDER BYRDER BYRDER BYRDER BYRDER BYRDER BY сортирует строки в разделе по одному или нескольким столбцам или выражениям.

В отличие от функции ROW_NUMBER(), функция RANK() не всегда возвращает последовательные целые числа.

Предположим, у нас есть пример таблицы следующим образом:

CREATE TABLE t (

val INT

);



INSERT INTO t(val)

VALUES(1),(2),(2),(3),(4),(4),(5);



SELECT * FROM t;

 

Вот выheight=»156″ />

Следующий оператор использует функцию RANK() для присвоения ранга каждой строке из набора результатов в таблице t:

SELECT

val,

RANK() OVER (

ORDER BY val

) my_rank

FROM

t;

 

Как видите, второй и третий ряды имеют одинаковые связи, поэтому они получают одинаковое звание 2.

Четвертый ряд имеет ранг 4, потому что функция RANK() пропускает ранг 3.

 

Пример функции RANK() в MySQL

Давайте для демонстрации используем таблицу sales, созданную в руководстве по оконным функциям.

Если вы еще не создали таблицу sales, вот скрипт:

CREATE TABLE IF NOT EXISTS sales(

sales_employee VARCHAR(50) NOT NULL,

fiscal_year INT NOT NULL,

sale DECIMAL(14,2) NOT NULL,

PRIMARY KEY(sales_employee,fiscal_year)

);



INSERT INTO sales(sales_employee,fiscal_year,sale)

VALUES('Bob',2016,100),

('Bob',2017,150),

('Bob',2018,200),

('Alice',2016,150),

('Alice',2017,100),

('Alice',2018,200),

('John',2016,200),

('John',2017,150),

('John',2018,250);



SELECT * FROM sales;

 

На следующем рисунке показанheight=»198″ />height=»198″ />h=»233″ height=»198″ />

 

Следующий оператор использует функцию RANK() для ранжирования сотрудников по продажам по сумме продаж в каждом году:

SELECT

sales_employee,

fiscal_year,

sale,

RANK() OVER (PARTITION BY

fiscal_year

ORDER BY

sale DESC

) sales_rank

FROM

sales;

 

В этом примере:

  • Во-первых, предложение PARTITION BY разбивает результирующие наборы на разделы по финансовым годам.
  • Затем предложение ORDER BY сортирует сотрудников по продажам в порядке убывания.

 

Функция RANK() в MySQL с примером CTE

Следующий оператор использует функцию RANK() для поиска трех самых высоких заказов в каждом году:

WITH order_values AS(
SELECT
orderNumber,
YEAR(orderDate) order_year,
quantityOrdered*priceEach AS order_value,
RANK() OVER (
PARTITION BY YEAR(orderDate)
ORDER BY quantityOrdered*priceEach DESC
) order_value_rank
FROM
orders
INNER JOIN orderDetails USING (orderNumber)
)
SELECheight="200" />height="200" />h="344" height="200" />h="344" height="200" />QL" width="344" height="200" />

 

В этом примере:

  • Сначала мы использовали общее табличное выражение (CTE), чтобы получить номер заказа, год заказа и ранг. Чтобы ранжировать заказы по значению заказа в каждом году, мы использовали функцию RANK(), которая разбивала строки по годам заказа и сортировала значение заказа по убыванию.
  • Затем мы выбрали только ордера, чей ранг меньше или равен трем.

В этой статье вы узнали, как использовать функцию RANK() в MySQL для присвоения ранга каждой строке в наборе результатов.



2019-10-30T16:04:52
База данных MySQL

Как установить MariaDB на Debian 10

MariaDB — это многопоточная система управления реляционными базами данных с открытым исходным кодом, обратно совместимая замена для MySQL. MariaDB — это стандартная реализация MySQL в Debian.

В этой статье объясняется, как установить MariaDB в Debian 10.

 

На момент написания этой статьи последняя версия MariaDB, доступная в основной части Debian, — это версия 10.3.

Для установки MariaDB в Debian 10 выполните следующие действия как пользователь root или пользователь с привилегиями sudo:

  1. Начните с обновления индекса пакетов:
    sudo apt update

    

    

  2. Установите серверные и клиентские пакеты MariaDB, выполнив следующую команду:
    sudo apt install mariadb-server

    

    

    Как запустить сервер MariaDB

    systemctl start mariadb

    Как запустить сервер MariaDB при загрузке

    systemctl enable mariadb

  3. Сервис MariaDB запустится автоматически. Чтобы проверить это, проверьте статус услуги:
    sudo systemctl status mariadb

     

    Вывод должен выглядеть примерно так:

    ● mariadb.service - MariaDB 10.3.15 database server

       Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)

       Active: active (running) since Thu 2019-07-11 14:36:28 PDT; 19min ago

         Docs: man:mysqld(8)

               https://mariadb.com/kb/en/library/systemd/

     Main PID: 4509 (mysqld)

       Status: "Taking your SQL requests now..."

        Tasks: 30 (limit: 2359)

       Memory: 78.6M

       CGroup: /system.slice/mariadb.service

               └─4509 /usr/sbin/mysqld

MariaDB поставляется со скриптом, который может помочь вам повысить безопасность установки. Чтобы запустить скрипт mysql_secure_installation в вашем терминале:

sudo mysql_secure_installation

Вам будет предложено установить пароль для учетной записи root, удалить анонимного пользователя, ограничить доступ пользователя root к локальной машине и удалить тестовую базу данных.

...

Enter current password for root (enter for none):

...

Set root password? [Y/n] Y

New password: 

Re-enter new password: 

...

Remove anonymous users? [Y/n] Y

...

Disallow root login remotely? [Y/n] Y

...

Remove test database and access to it? [Y/n] Y

...

Reload privilege tables now? [Y/n] Y

...

Thanks for using MariaDB!

Если этот параметр выбран, сценарий перезагрузит таблицы привилегий, гарантируя, что изменения вступят в силу немедленно.

Все шаги объяснены подробно, и рекомендуется ответить «Y» (да) на все вопросы.

 

По умолчанию корневой пользователь MariaDB использует плагин аутентификации unix_socket, который проверяет эффективный идентификатор пользователя при вызове в mysql клиентского инструмента.

Это означает, что вы можете подключиться к серверу MariaDB как пользователь root, только если вы вызываете команду mysql как системный root или добавляете sudo к команде.

Для повышения безопасности рекомендуется оставить подключаемый модуль аутентификации по умолчанию и разрешить пользователю root проходить аутентификацию только через сокеты Unix.

Если вы хотите изменить аутентификацию root на классическую, войдите на сервер MariaDB:

sudo mysql

Запустите следующие операторы, чтобы изменить плагин аутентификации:

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password;

ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_root_passwd';

Теперь вы можете подключиться к серверу MariaDB, используя новый пароль:

mysql -u root -p

Изменение плагина аутентификации также позволит вам войти в систему как root из внешней программы, такой как phpMyAdmin.

 

В этой статье мы показали, как установить и защитить MariaDB на сервере Debian 10.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.



2019-07-15T22:35:17
MariaDB

MySQL – восстановление повреждённых таблиц

Как известно, любые повреждения происходят в результате каких-либо внешних факторов. Состояние внутренней структуры таблиц баз данных (БД), в данном случае таблиц MySQL, всецело определяет, насколько надёжным будет использование самой БД.

На высоко-нагруженных серверах БД повреждение таблиц отнюдь не редкость. Администраторам, да и самим пользователям порой приходится прибегать к починке структуры таблиц своих БД. О том, по каким причинам повреждаются таблицы и какие существуют методы решения данной проблемы на примере MySQL и будет изложено в данной статье. Читать

Решение ошибки #1698 – Access denied for user ‘root’@’localhost’

В сегодняшней статье разберемся как устранить ошибку:

#1698 – Access denied for user ‘root'@'localhost'

при попытке подключиться к БД из под root.

MySQL 5.7 изменила модель безопасности: теперь вход в MySQL под рутом (root) требует sudo (при этом пароль всё равно может быть пустым). Т.е. phpMyAdmin невозможно использовать под пользователем root.

Самым простым (и самым безопасным) решением будет создать нового пользователя и предоставить ему требуемые привилегии. Читать

Большой размер директории с логами MySQL

Недавно я заметил, что свободное место на диске веб-сервера стало стремительно уменьшаться. Первым делом я проверил логи и вот что увидел:

# du -sh /var/log/* | sort -h | tail -n 5 Читать

Docker: базовый набор команд

Команда Docker

Перевод второй части статьи«Docker simplified: a hands-on guide for absolute beginners».

В предыдущей статье – «Docker: практическое руководство для совершенных новичков»– мы рассмотрели, что такое Docker, где он может нам пригодиться и как его установить. А теперь давайте, наконец, познакомимся с основными командами, которые позволят вам начать использовать Docker. Читать