MySQL select: ORDER BY и порядок вывода результатов


Для MySQL SELECT ORDER BY позволяет указывать в каком порядке нужно группировать значения, являющиеся результатом обработки запросов.

SQL сам по себе — язык, не предполагающий порядка вывода результатов и не гарантирующий его сохранения. Т.е. если результатов выполнения запроса 2 или более — они могут быть выведены в другом порядке при повторном выполнении запроса.



Это применимо и к СУБД MySQL, тем не менее есть средства для сортировки — прежде всего ключевое слово ORDER BY.  Для MySQL SELECT ORDER BY позволяет указывать в каком порядке нужно группировать значения, являющиеся результатом обработки запросов.



Цикл по принципам работы с MySQL, более ранние материалы:

  1. Вводная статья цикла
  2. Начало работы с MySQL и основные команды
  3. MySQL SELECT, выборка из таблиц MySQL
  4. Регулярные выражения в MySQL
  5. MySQL SELECT: JOIN таблиц


MySQL select: ORDER BY и сортировка


Немного модифицируем запрос который использовался в одном из предыдущих материалов (посвященном JOIN-ам) добавив  distinct чтобы не дублировать результаты и условие по стоимости, которое готов предложить каждый потенциальный съемщик жилья.


SELECT distinct name FROM PEOPLE, REAL_ESTATE WHERE REAL_ESTATE.rentorsale = PEOPLE.rentorsale and PEOPLE.PRICE > 40000;


+----------+
 | name |
 +----------+
 | Alexandr |
 | Viktor |
 | Olga |
 +----------+
 3 rows in set (0.00 sec)



Чтобы было понятно сколько готов платить каждый добавим PEOPLE.price в SELECT (использование больших и маленьких букв в MySQL не принципиально, для наглядности здесь приводятся части запроса в том и другом регистре)


SELECT distinct name, PEOPLE.price FROM PEOPLE, REAL_ESTATE WHERE REAL_ESTATE.rentorsale = PEOPLE.rentorsale and PEOPLE.PRICE > 40000;


+----------+-------+
 | name | price |
 +----------+-------+
 | Alexandr | 50000 |
 | Viktor | 45000 |
 | Olga | 50000 |
 +----------+-------+
 3 rows in set (0.00 sec)



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



Сначала выведем всю информацию об элементе таблицы чтобы убедиться, что изменяться будут именно его данные

select * from PEOPLE where name = 'Alexandr' and price = '50000';


+----------+---------------------+------+--------+----------+------------+-------+ | name | profession | age | city | district | rentorsale | PRICE | +----------+---------------------+------+--------+----------+------------+-------+ | Alexandr | ElectriacalEngineer | 28 | Moskow | Center | Rent | 50000 | +----------+---------------------+------+--------+----------+------------+-------+ 1 row in set (0.00 sec)



Теперь обновляем значение поля price, устанавливая его в 52000

update PEOPLE set price = '52000' where name = 'Alexandr' and price = '50000';

Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0



Просматриваем все ли получилось

select * from PEOPLE where name = 'Alexandr' and price = '52000';

+———-+———————+——+———+———-+————+——-+
| name | profession | age | city | district | rentorsale | PRICE |
+———-+———————+——+———+———-+————+——-+
| Alexandr | ElectriacalEngineer | 28 | Moskow | Center | Rent | 52000 |
+———-+———————+——+———+———-+————+——-+
1 row in set (0.00 sec)



Теперь вновь выводим три записи — значения в поле PRICE теперь разные и сортировки нет.


Записи расположились по алфавиту (значения в поле name). Это поведение не гарантировано и при повторном выполнении запроса может быть другой порядок.

SELECT distinct name, PEOPLE.price FROM PEOPLE, REAL_ESTATE WHERE REAL_ESTATE.rentorsale = PEOPLE.rentorsale and PEOPLE.PRICE > 40000;


+----------+-------+
 | name | price |
 +----------+-------+
 | Alexandr | 52000 |
 | Viktor | 45000 |
 | Olga | 50000 |
 +----------+-------+
 3 rows in set (0.00 sec)



MySQL select ORDER BY и сортировка значений


Зададим сортировку по цене, которую каждый готов заплатить.

SELECT distinct name, PEOPLE.price FROM PEOPLE, REAL_ESTATE WHERE REAL_ESTATE.rentorsale = PEOPLE.rentorsale and PEOPLE.PRICE > 40000 ORDER BY price;


+----------+-------+
 | name | price |
 +----------+-------+
 | Viktor | 45000 |
 | Olga | 50000 |
 | Alexandr | 52000 |
 +----------+-------+
 3 rows in set (0.00 sec)



Для MySQL SELECT ORDER BY по умолчанию сортирует значения от меньшего к большему. Добавив в конец запроса ключевое слово desc можно получить обратный убывающий порядок.


MySQL SELECT ORDER


SELECT distinct name, PEOPLE.price FROM PEOPLE, REAL_ESTATE WHERE REAL_ESTATE.rentorsale = PEOPLE.rentorsale and PEOPLE.PRICE > 40000 ORDER BY price desc;


+----------+-------+
 | name | price |
 +----------+-------+
 | Alexandr | 52000 |
 | Olga | 50000 |
 | Viktor | 45000 |
 +----------+-------+
 3 rows in set (0.00 sec)



Читайте про серверную оптимизацию настроек MySQL.

Сказать спасибо