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)