В SQL часто кроме фильтрации данных, также часто требуется отсортировать их по одному из столцов.
В первом уроке мы написали SQL-запрос для получения данных о совершенолетних пользователях. Посмотрим на него еще раз:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18
id | last_name | first_name | birthday |
---|---|---|---|
1 | Иванов | Дмитрий | 1996-12-11 |
3 | Шевченко | Тимур | 1998-04-27 |
4 | Иванова | Светлана | 1993-08-06 |
6 | Иванов | Алексей | 1993-08-05 |
7 | Процук | Алена | 1997-02-28 |
Обратите внимание, что сейчас данные никак не упорядочены. Ни по фамилии, ни по имени, ни по дате рождения. Но давайте добавим после конструции WHERE: ORDER BY last_name:.
SELECT last_name, first_name, birthday
FROM users WHERE age >= 18 ORDER BY last_name
После выполнение данного SQL запроса мы получим таблицу отсортированную по столбцу last_name (фамилия). Так как last_name хранит строки, то сортировка происходит в алфавитном порядке:
id | last_name | first_name | birthday |
---|---|---|---|
1 | Иванов | Дмитрий | 1996-12-11 |
6 | Иванов | Алексей | 1993-08-05 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
Обратите внимание, что данные отсортированы только по фамилии, но не по другим полям. Однако давайте добавим через запятую еще один столбец, например, first_name:
SELECT last_name, first_name, birthday
FROM users WHERE age >= 18 ORDER BY last_name, first_name
Теперь таблица отсортирована сразу по двум поля, сперва по фамилии, а уже затем по имени:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
Разумеется, сортировать можно не только по текстовым полям. Например, можно написать ORDER BY birthday:
SELECT last_name, first_name, birthday
FROM users
WHERE age >= 18
ORDER BY birthday
И получить данные упорядоченные по дате рождения в хронологическом порядке:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
4 | Иванова | Светлана | 1993-08-06 |
1 | Иванов | Дмитрий | 1996-12-11 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |
А если в конструкции ORDER BY после имени столца написать DESC, то данные будут отсортированы в обратном порядке — свежие даты выше:
id | last_name | first_name | birthday |
---|---|---|---|
3 | Шевченко | Тимур | 1998-04-27 |
7 | Процук | Алена | 1997-02-28 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
6 | Иванов | Алексей | 1993-08-05 |
Более того при сортировке данных по нескольким столцам, мы можем для разных столцов указывать разные направления сортировки. Например ORDER BY last_name, birthday DESC:
SELECT last_name, first_name, birthday
FROM users
WHERE age >= 18
ORDER BY last_name, birthday DESC
Тогда данные будут сперва отсортированы в алфавитном порядке по фамилии, а уже внутри каждой фамилии по дате рождения в обратном порядке:
id | last_name | first_name | birthday |
---|---|---|---|
6 | Иванов | Алексей | 1993-08-05 |
1 | Иванов | Дмитрий | 1996-12-11 |
4 | Иванова | Светлана | 1993-08-06 |
7 | Процук | Алена | 1997-02-28 |
3 | Шевченко | Тимур | 1998-04-27 |