Для MySQL SELECT ORDER BY позволяет указывать в каком порядке нужно группировать значения, являющиеся результатом обработки запросов.
SQL сам по себе — язык, не предполагающий порядка вывода результатов и не гарантирующий его сохранения. Т.е. если результатов выполнения запроса 2 или более — они могут быть выведены в другом порядке при повторном выполнении запроса.
Это применимо и к СУБД MySQL, тем не менее есть средства для сортировки — прежде всего ключевое слово ORDER BY. Для MySQL SELECT ORDER BY позволяет указывать в каком порядке нужно группировать значения, являющиеся результатом обработки запросов.
Цикл по принципам работы с MySQL, более ранние материалы:
- Вводная статья цикла
- Начало работы с MySQL и основные команды
- MySQL SELECT, выборка из таблиц MySQL
- Регулярные выражения в MySQL
- 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 можно получить обратный убывающий порядок.
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.