Один из самых популярных сценариев работы с базами данных — подготовка данных для отчетности. Представьте ситуацию: вы работаете в университете, и ваш начальник (который, конечно же, ничего не понимает в SQL) просит вас создать список студентов с объединением имени и фамилии, а также указать дату рождения в формате DD-MM-YYYY. Задача ясна: нужно красиво оформить данные. И SQL — в этом наш верный помощник.
Пример 1: Объединение имени и фамилии
Начнем с объединения имени (first_name) и фамилии (last_name) студентов из нашей таблицы students.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM
students;
Что здесь происходит?
CONCAT()объединяет строки. Мы добавляем пробел между именем и фамилией для наглядности.- Результат сохраняется в новом столбце
full_name.
Результат может выглядеть так:
| full_name |
|---|
| Otto Art |
| Anna Song |
| Pol Mac |
Пример 2: Форматирование даты
Теперь добавим к нашему запросу форматирование даты рождения.
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students;
Новое здесь:
- Мы применяем функцию
TO_CHAR()к полюbirth_date. - Формат
'DD-MM-YYYY'преобразует дату в удобный вид (например:25-12-2001).
Результат:
| full_name | formatted_birth_date |
|---|---|
| Otto Art | 12-04-1995 |
| Anna Song | 03-08-1996 |
| Pol Mac | 21-11-1997 |
Вуаля! Вы только что создали красивый отчет.
Форматирование для экспорта данных
Допустим, один из ваших коллег хочет выгрузить данные о заказах в CSV-файл для дальнейшей работы в Excel. Но данные в базе хранятся в неудобном для него формате, а люди из отдела продаж требуют конкретного вида. Например, вместо поля total_price, где указана цена заказа, они хотят видеть ее в формате: $100.00.
Пример 3: Преобразование чисел в формат валюты
Оформим данные о заказах из таблицы orders для экспорта:
SELECT
order_id,
TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM
orders;
Что делает TO_CHAR() в данном случае?
FM(Fill Mode) убирает лишние пробелы.$добавляет символ валюты.999,999.00задает формат с тысячными разделителями и двумя знаками после запятой.
Результат:
| order_id | formatted_price |
|---|---|
| 1 | $1,000.00 |
| 2 | $2,500.50 |
| 3 | $10.00 |
Теперь ваш коллега может легко импортировать данные в Excel и похвалить вас на собрании.
Финальное задание
Вот здесь начинается самое интересное. Давайте объединим все навыки, которые вы уже освоили.
Задача
Создайте запрос для таблицы students, который:
- Объединяет имя и фамилию в один столбец
full_name. - Преобразует дату рождения в формат
DD-MM-YYYY. - Отображает возраст студента на текущую дату.
Запрос будет выглядеть примерно так:
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date,
DATE_PART('year', AGE(birth_date)) AS age
FROM
students;
Новые элементы:
AGE(birth_date)возвращает интервал между текущей датой и датой рождения, но в формате года, месяцев и дней.DATE_PART('year', AGE(birth_date))извлекает из этого интервала только количество лет.
Результат:
| full_name | formatted_birth_date | age |
|---|---|---|
| Otto Art | 12-04-1995 | 28 |
| Anna Song | 03-08-1996 | 27 |
| Pol Mac | 21-11-1997 | 25 |
Такой отчёт удовлетворит даже самых придирчивых коллег.
Форматирование для специфических условий
Иногда форматирование данных нужно для создания условий или фильтрации. Например, достанем студентов, у которых день рождения приходится на текущий месяц.
Пример 4: Фильтрация по месяцу
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
WHERE
DATE_PART('month', birth_date) = DATE_PART('month', CURRENT_DATE);
Как это работает?
DATE_PART('month', birth_date)извлекает месяц из даты рождения.CURRENT_DATEпредоставляет текущую дату. Мы берем из неё месяц с помощьюDATE_PART().
Совмещение форматирования и сортировки
Теперь объединим всё, что узнали, и добавим сортировку. Например, создадим список студентов, отсортированных по их дате рождения.
Пример 5: Сортировка по дате рождения
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
ORDER BY
birth_date ASC;
Сортировка в порядке возрастания ASC покажет сначала самых старших студентов, а в порядке убывания DESC — самых молодых.
Совмещение с уникальными значениями
Напоследок — задача со звёздочкой. Представьте, что у нашего университета есть филиалы в нескольких городах, и вам нужно создать список уникальных городов, где учатся студенты, но в алфавитном порядке.
Пример 6: Уникальные значения и сортировка
SELECT DISTINCT
city
FROM
students
ORDER BY
city ASC;
Что делает DISTINCT?
Он исключает дублирующиеся значения, чтобы в результатах был указан каждый город только один раз.
Зачем это всё нужно?
Удобство и красота. Когда данные оформлены красиво, с ними проще работать, а начальники меньше задают вопросов.
Готовность к реальной жизни. Вы сможете автоматически генерировать отчёты, работать с экспортами и готовить красивые презентации.
Повышение вашей ценности. SQL — это не просто про данные. Это про то, как сделать их понятными и полезными.
Используйте полученные навыки, чтобы не просто писать запросы, а создавать шедевры! На следующих лекциях мы продолжим углубляться в магию PostgreSQL.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ