Spec-Zone.ru › MariaDB

СОРТИРОВКА ПО

Описание

Используйте предложение ORDER BY для сортировки набора результатов, таких как возвращаемые из оператора SELECT. Вы можете указать только столбец или использовать любое выражение с функциями. Если вы используете предложение GROUP BY, вы можете использовать агрегатные функции в ORDER BY. Сортировка выполняется после группировки.

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

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

Вы также можете использовать целое число в качестве выражения сортировки. Если вы используете целое число n, результаты будут отсортированы по n-му столбцу в выражении выбора.

При сравнении строковых значений сравнение выполняется так же, как при использовании функции STRCMP. STRCMP игнорирует хвостовые пробелы и может нормализовать символы и игнорировать регистр в зависимости от используемой коллизии.

Дублирующиеся записи в предложении ORDER BY удаляются.

ORDER BY также может использоваться для сортировки операций оператора DELETE или UPDATE (обычно с предложением LIMIT).

MariaDB начиная с 10.3.2

До MariaDB 10.3.1 использование ORDER BY (или LIMIT) в операторе UPDATE с несколькими таблицами было невозможно. Это ограничение было снято в MariaDB 10.3.2.

MariaDB начиная с 10.5

Начиная с MariaDB 10.5, MariaDB позволяет использовать упакованные ключи сортировки и значения полей, не участвующих в сортировке, в буфере сортировки. Это может значительно уменьшить временные файлы сортировки, когда используются VARCHAR, CHAR или BLOB, что заметно ускоряет некоторые сортировки ORDER BY.

Примеры

CREATE TABLE seq (i INT, x VARCHAR(1));
INSERT INTO seq VALUES (1,'a'), (2,'b'), (3,'b'), (4,'f'), (5,'e');

SELECT * FROM seq ORDER BY i;
+------+------+
| i    | x    |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | b    |
|    4 | f    |
|    5 | e    |
+------+------+

SELECT * FROM seq ORDER BY i DESC;
+------+------+
| i    | x    |
+------+------+
|    5 | e    |
|    4 | f    |
|    3 | b    |
|    2 | b    |
|    1 | a    |
+------+------+

SELECT * FROM seq ORDER BY x,i;
+------+------+
| i    | x    |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | b    |
|    5 | e    |
|    4 | f    |
+------+------+

ORDER BY в операторе UPDATE в сочетании с LIMIT:

UPDATE seq SET x='z' WHERE x='b' ORDER BY i DESC LIMIT 1;

SELECT * FROM seq;
+------+------+
| i    | x    |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | z    |
|    4 | f    |
|    5 | e    |
+------+------+

Начиная с MariaDB 10.3.2, ORDER BY можно использовать в операторе обновления с несколькими таблицами:

CREATE TABLE warehouse (product_id INT, qty INT);
INSERT INTO warehouse VALUES (1,100),(2,100),(3,100),(4,100);

CREATE TABLE store (product_id INT, qty INT);
INSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);

UPDATE warehouse,store SET warehouse.qty = warehouse.qty-2, store.qty = store.qty+2 
  WHERE (warehouse.product_id = store.product_id AND store.product_id  >= 1) 
    ORDER BY store.product_id DESC LIMIT 2;

SELECT * FROM warehouse;
+------------+------+
| product_id | qty  |
+------------+------+
|          1 |  100 |
|          2 |  100 |
|          3 |   98 |
|          4 |   98 |
+------------+------+

SELECT * FROM store;
+------------+------+
| product_id | qty  |
+------------+------+
|          1 |    5 |
|          2 |    5 |
|          3 |    7 |
|          4 |    7 |
+------------+------+

См. также

  • Почему ORDER BY в подзапросе FROM игнорируется?
  • SELECT
  • UPDATE
  • DELETE
  • Улучшения оптимизации ORDER BY
  • Соединения и подзапросы
  • LIMIT
  • GROUP BY
  • Общие табличные выражения
  • SELECT WITH ROLLUP
  • SELECT INTO OUTFILE
  • SELECT INTO DUMPFILE
  • FOR UPDATE
  • LOCK IN SHARE MODE
  • Указания оптимизатору
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/order-by/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API